接口
1.定义
-
接口是一种能力,在接口中对方法做具体的定义,但是不去做具体的实现,通过子类实现接口的抽象方法做具体的实现,优势:扩展性更强
-
接口是抽象类实体,因为类是单继承关系,所以可以通过多实现接口拥有更多的父类.
-
接口和抽象类的区别:
-
抽象类中可以有属性,可以有抽象方法,构造方法,普通方法,
-
接口中没有属性,都是public static final修饰的常量,都是public abstract修饰的抽象方法
-
抽象类和接口都不能被实例化
-
-
类可以单独继承类.也可以单独实现接口
2.案例一:防盗门进出
-
情况一:带了钥匙,开锁进去
-
门类
/** * 门 * @author Administrator * */ public abstract class Door { /** * 开门 */ public abstract void openDoor(); /** * 关门 */ public abstract void closeDoor(); }
-
锁的接口
/** * 锁的接口 * @author Administrator * */ public interface Lock { /** * 开锁 */ public abstract void openLock(); /** * 关锁 */ public abstract void lockUp(); }
-
防盗门类
/** * 防盗门 * @author Administrator * */ public class TheftDoor extends Door implements Lock{ @Override public void openLock() { System.out.println("防盗门,开锁"); } @Override public void lockUp() { System.out.println("防盗门,关锁"); } @Override public void openDoor() { System.out.println("防盗门,开门"); } @Override public void closeDoor() { System.out.println("防盗门,关门"); } }
-
测试
public static void main(String[] args) { TheftDoor door1 = new TheftDoor(); door1.openLock(); door1.openDoor(); door1.closeDoor(); door1.lockUp(); }
-
-
情况二:没带钥匙,人脸识别
-
摄像机接口
/** * 摄像机 * @author Administrator * */ public interface DoorBell { /** * 人脸识别 */ //接口中所有的方法都是用public abstract修饰 void lookFace(); }
-
防盗门类
/** * 防盗门 * @author Administrator * */ public class TheftDoor extends Door implements Lock,DoorBell{ @Override public void openLock() { System.out.println("防盗门,开锁"); } @Override public void lockUp() { System.out.println("防盗门,关锁"); } @Override public void openDoor() { System.out.println("防盗门,开门"); } @Override public void closeDoor() { System.out.println("防盗门,关门"); } @Override public void lookFace() { System.out.println("开门:人脸识别 "); }
-
测试
public static void main(String[] args) { TheftDoor door1 = new TheftDoor(); door1.lookFace(); door1.openDoor(); door1.closeDoor(); door1.lockUp(); }
-
3.案例二:智能手机与普通手机的功能区别
-
普通手机的功能:打电话,发信息,听音乐
-
智能手机的功能:打视频电话,发图片和信息,看视频,拍照,连接网络
-
手机类:手机信息,打电话,发信息
/** * 手机类 * @author Administrator * */ public abstract class Hamdest { String brand;//手机品牌 String type;//手机型号 public Hamdest() { super(); } public Hamdest(String brand, String type) { super(); this.brand = brand; this.type = type; } /** * 发信息的功能 */ public abstract void sendInfo(); /** * 打电话的功能 */ public abstract void cali(); /** * 手机信息 */ public abstract void info(); }
-
播放的接口
/** * 播放接口 * @author Administrator * */ public interface PlayWiring { /** * 播放的功能 * @param incontent */ void play(String incontent); }
-
连接网络的接口
/** * 连接的接口 * @author Administrator * */ public interface Network { /** * 连接网络的功能 */ void network(); }
-
拍照的接口
/** * 照相接口 * @author Administrator * */ public interface TheakePictures { /** * 照相的功能 */ void takePictures(); }
-
普通手机类
public class CommonHandset extends Hamdest implements PlayWiring{ public CommonHandset() { super(); // TODO Auto-generated constructor stub } public CommonHandset(String brand, String type) { super(brand, type); // TODO Auto-generated constructor stub } @Override public void play(String incontent) { System.out.println("开始播放音乐"+incontent+"-------------------"); } @Override public void sendInfo() { System.out.println("发送文字信息------------------------"); } @Override public void cali() { System.out.println("开始语音通话-----------------------------"); } @Override public void info() { System.out.println("这是一款型号为"+this.brand+"的"+this.type+"手机"); } }
-
智能手机类
public class AptitudeHandset extends Hamdest implements Network,TheakePictures,PlayWiring{ public AptitudeHandset() { super(); // TODO Auto-generated constructor stub } public AptitudeHandset(String brand, String type) { super(brand, type); // TODO Auto-generated constructor stub } @Override public void takePictures() { System.out.println("咔擦-----------------------拍照成功"); } @Override public void network() { // TODO Auto-generated method stub System.out.println("已经启动移动网络--------------------------------------"); } @Override public void sendInfo() { // TODO Auto-generated method stub System.out.println("发送带图片与文字的信息--------------------------"); } @Override public void cali() { // TODO Auto-generated method stub System.out.println("开始视频通话----------------------------------"); } @Override public void info() { System.out.println("这是一款型号为"+this.brand+"的"+this.type+"手机"); } @Override public void play(String incontent) { // TODO Auto-generated method stub System.out.println("开始播放视频"+incontent+"----------------------"); } }
-
测试
public class Test { public static void main(String[] args) { CommonHandset common = new CommonHandset("G502c", "索尼爱立信"); common.info(); common.play("《热雪》"); common.sendInfo(); common.cali(); System.out.println("---------------------"); AptitudeHandset apt = new AptitudeHandset("HTC","I9100"); apt.info(); apt.network(); apt.play("《小时代》"); apt.takePictures(); apt.sendInfo(); apt.cali(); } }
-
结果
这是一款型号为G502c的索尼爱立信手机 开始播放音乐《热雪》------------------- 发送文字信息------------------------ 开始语音通话----------------------------- --------------------- 这是一款型号为HTC的I9100手机 已经启动移动网络-------------------------------------- 开始播放视频《小时代》---------------------- 咔擦-----------------------拍照成功 发送带图片与文字的信息-------------------------- 开始视频通话----------------------------------
4.案例三:墨盒打印
-
墨盒接口
/** * 墨盒接口 * @author Administrator * */ public interface InkBox { /** * 获取颜色 返回彩色或黑白 */ public String getColor(); }
-
灰色类
public class GrayBox implements InkBox{ @Override public String getColor() { return "灰色"; } }
-
彩色类
public class ColorBox implements InkBox{ @Override public String getColor() { return "彩色"; } }
-
纸张接口
/** * 纸张接口 * @author Administrator * */ public interface Paper { /** * 返回纸张大小 A4或B5 */ public String getSize(); }
-
A4类
public class A4Paper implements Paper{ @Override public String getSize() { return "A4"; } }
-
B5类
public class B5Paper implements Paper{ @Override public String getSize() { return "B5"; } }
-
打印类
public class Printer { InkBox inbox = null; Paper paper = null; public void setInkBox(InkBox inbox) { // TODO Auto-generated method stub this.inbox = inbox; } public void setPaper(Paper paper) { // TODO Auto-generated method stub this.paper = paper; } public void print() { System.out.println("打印机效果:\n墨盒:"+inbox.getColor()+"\t纸张:"+paper.getSize()); } }
-
测试
public class Test { public static void main(String[] args) { //创建墨盒接口对象 InkBox inbox = null; //创建纸张接口对象 Paper paper = null; //创建灰色盒子和A4子类实例 inbox = new GrayBox(); paper = new A4Paper(); Printer printer = new Printer(); printer.setInkBox(inbox);//设置墨盒 printer.setPaper(paper);//设置纸张 printer.print();//打印方法 System.out.println("======================================="); //创建彩色盒子和B5子类实例 inbox = new ColorBox(); paper = new B5Paper(); printer.setInkBox(inbox); printer.setPaper(paper); printer.print(); } }
5.小结
- 接口和抽象类用法差不多,也能继承和多态,只是接口可以多实现,更加灵活,拓展性更强,提高复用,分层开发中,上层不用管具体的实现,大家都遵守共同的标准,使得开发变得容易,规范性更好.
- 接口从更深层次的理解,应是定义(规范,约束)与实现(名实分离的原则)的分离
- 接口的本身反映了系统设计人员对系统的抽象理解。