在Java的世界里,接口(Interface)是一种强大的抽象机制,它定义了一组方法规范,但不实现这些方法。接口在Java编程中扮演着至关重要的角色,特别是在实现多态和面向接口编程(Interface-Oriented Programming, IOP)方面。本文将深入探讨Java接口的特性、接口实现多态的方式,以及面向接口编程的好处。 接口的特性
完全抽象:接口中的方法默认都是抽象的,它不能包含实现(除非是默认方法或静态方法)。 多继承:Java不允许类继承多个类,但允许一个类实现多个接口,从而实现多继承的特性。 全局访问:接口中的所有方法默认都是public的,它们隐式地定义为public abstract。 类型检查:接口可以作为引用类型,用于引用对象,提供了一种类型检查的机制。 默认方法:从Java 8开始,接口可以包含默认方法,即带有实现的方法。 静态方法:接口也可以包含静态方法,这些方法可以在不实例化接口的情况下直接调用。 package cn.zy.cellphone; /**接口是一种引用数据类型。使用interface声明接口,形式
- 形式:public interface 接口名称{}
- 接口不能拥有构造方法,不能用于创建对象
*接口可以多继承。一个接口可以继承多个其他接口
*列如:public interface Broadcast extends Network,Picture{}
*Broadcast接口就具备了A、B接口中定义的抽象方法。
*/
public interface Broadcast {
/**接口中可以声明属性。接口中定义的所有变量都是static final类型的。
- public static final String version = "1.0"; public int count = 10; // 默认是static final类型 一般很少在接口中声明属性。 */ package cn.zy.cellphone;
public interface Picture { public void picture();//照相 } package cn.zy.cellphone;
public interface Network { public void network();//网络 } package cn.zy.cellphone; /**一个类只能继承一个父类,同时实现多个接口。继承在前,实现在后。
-
public class Photo2 extends Photo implements Network,Picture,Broadcast {}
-
实现类实现接口,必须实现接口中定义的抽象方法。 *方法即行为,表示一种功能,接口定义了一套功能,实现类必须实现这些功能 –> 实现类的能力得到拓展。 */ //实现类(子类) public class Photo2 extends Photo implements Network,Picture,Broadcast { private String name;
public String getName() { return name; } public void setName(String name) { this.name = name; } public Photo2(String brand, String type, String name) { super(brand, type); this.setName (name); } /**接口中定义的一些系列方法表示的是一种种的能力。接口让实现类实现这些能力,实现类的能力得到拓展和升级。 实现类根据自身特性实现接口中定义的方法。 * 特殊情况:如果一个抽象父类定义了和接口同名的抽象方法,实现类实现的是抽象父类的抽象方法。 */ public void broadcast() { System.out.println(this.getName()+"的手机可以播放"); } public void picture() { System.out.println(this.getName()+super.getBrand()+super.getType()+"的手机可以照相"); } public void network() { System.out.println(this.getName()+super.getBrand()+super.getType()+"的手机可以播放上网"); } /**实现类(子类)Photo2 手机原本只有下面几个功能,通过接口增加了上面几个功能 * 实现类实现接口,必须实现接口中定义的抽象方法。 *方法即行为,表示一种功能,接口定义了一套功能,实现类必须实现这些功能 –> 实现类的能力得到拓展。 */ public void sendInfo() { System.out.println(super.getBrand()+super.getType()+"的手机发信息"); } public void call() { System.out.println(super.getBrand()+super.getType()+"的手机可以打电话"); } public void info() { System.out.println(super.getBrand()+super.getType()+"的手机可以发短信"); }
} package cn.zy.cellphone; //实现类(子类) public class Photo1 extends Photo implements Broadcast { private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Photo1() {
super();
}
public Photo1(String brand, String type,String name) {
super(brand,type);
this.setName(name);
}
public void broadcast() {
System.out.println(this.getName()+"的手机可以播放");
} public void sendInfo(){ System.out.println(super.getBrand()+super.getType()+"的手机发信息"); } public void call(){ System.out.println(super.getBrand()+super.getType()+"的手机可以打电话"); } public void info(){ System.out.println(super.getBrand()+super.getType()+"的手机可以发短信"); }
} package cn.zy.cellphone; //父类 public abstract class Photo { private String brand; private String type; public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Photo() { super(); } public Photo(String brand, String type) { super(); this.brand = brand; this.type = type; } public abstract void sendInfo(); public abstract void call(); public abstract void info(); } package cn.zy.cellphone; //执行类 public class Test { public static void main(String[] args) { // 同一引用类型 Broadcast broadcast1=new Photo1("诺基亚","a01","张三"); broadcast1.broadcast();
Photo photo=new Photo1("诺基亚","a01","张三");
photo.sendInfo();
photo.call();
photo.info();
// 同一引用类型
Broadcast broadcast2=new Photo1("苹果X","11S","李四");
broadcast2.broadcast();
// 实例不同, 对同一方法的执行结果不同
Picture picture1=new Photo2("苹果X","11S","李四");
picture1.picture();
Network network1=new Photo2("苹果X","11S","李四");
network1.network();
//多态
Photo photo1=new Photo1("苹果X","11S","李四");
photo1.sendInfo();
photo1.call();
photo1.info();
/**
* 接口实现多态: 接口类型 引用 实现类对象
继 承实现多态: 父类类型 引用 子类对象
接口定义的方法被实现类实现,通过接口引用实现类时,调用接口中的方法时,执行的是实现类实现的方法。
实现类对象具备接口中定义的能力 是一种has a 关系
子类对象是一种父类类型 是一种is a 关系
现在的Photo1同Photo2既是实现类也是子类
*/
} }