通过这次学习J2SE,发现了很多之前不知道或从来没注意的细节,而恰恰这些细节却是关键所在呢,对以后实践有着不可替代的意义。
之前,只知道接口只是用来实现的,而在深入的了解就是一问三不知了。这让我对这次学习更印象深刻了,就如老师说过:“学习是反复的,不是一蹴而就的”。
多个类可以实现相同的接口,一个类也可以实现多个接口。拿代码解释吧:
interface Singer { public void sing(); public void sleep(); } interface Painter { public void paint(); public void eat(); } class Student implements Singer { private String name; Student(String name){ this.name = name; } public void study(){ System.out.println("studying"); } public String getName(){ return name; } public void sing(){ System.out.println("student is singing"); } public void sleep(){ System.out.println("student is sleeping"); } } class Teacher implements Singer,Painter {//可以实现多个接口,每个接口间用“,”连接;实现多个接口,就必须将每个接口的抽象方法都要实现 private String name ; public String getString(){ return name; } Teacher(String name ){ this.name = name; } public void teach(){ System.out.println("teaching"); } public void sing(){ System.out.println("teacher is singing"); } public void sleep(){ System.out.println("teacher is sleeping"); } public void paint(){ System.out.println("teacher is painting"); } public void eat(){ System.out.println("teacher is eating"); } }上面有两个接口,一个是Singer接口,另一个是Painter接口。
存在类Student、Teacher,这两个都实现了Singer接口:多个类可以实现同一个接口。
类Teacher实现了Singer接口和Painter接口:一个类可以实现多个接口(接口实现用implements;继承用Extends)。
对于类实现接口,必须实现接口内定义的方法,而多重实现就是讲多个接口内的方法都要实现。例如Student必须实现Singer接口中的sing()和sleep()两个方法,而Teacher必须实现Singer和Painter两个接口中的sing()、sleep()、paint()和eat()四个方法。
运行结果如下:
接口之间也是可以继承的:
interface Protectable { public void beProtected(); } interface A extends Protectable {//要实现A,就必须实现A和Protectable两个接口 void m(); double getMoney();//与Valuable接口中的方法相同,可以被编译成功 //void getMoney();//与Valuable接口中的方法名相同,但是返回值不同,则编译不会成功,产生了方法混淆,调用的时候不能清除说明 }
接口继承和类继承是相似的,所以又说接口是一种特殊的抽象类(因为接口的方法只定义不实现)。那么会给类实现产生什么影响呢?
class Hen implements A { public void m(){} public void beProtected(){} //此方法产生混淆,编译失败 //public void getMoney(){ } public double getMoney(){ return 1.0; } } 类Hen实现接口A,相当于即实现接口A,又实现接口Protectable。相当于一个类实现了多个接口,只不过这两个接口之间存在了继承关系,那么类就可以直接实现一个接口便可以间接的实现了另一个接口。
一边学习接口实现,一边就在思考如果两个接口中定义了相同的方法,结果会怎样?想着想着,视频中也就给出了提示。
当如果方法相同(方法名、参数个数、参数类型、返回值都相同),编译也会成功,证明两个接口对于这个方法都可见。但是,如果两个方法的返回值不相同,其它都相同,那么编译就会出错,因为方法产生了混淆:
public interface Valuable { public double getMoney(); } interface Protectable { public void beProtected(); } interface A extends Protectable {//要实现A,就必须实现A和Protectable两个接口 void m(); double getMoney();//与Valuable接口中的方法相同,可以被编译成功 void getMoney();//与Valuable接口中的方法名相同,但是返回值不同,则编译不会成功,产生了方法混淆,调用的时候不能清除说明 } class Hen implements A { public void m(){} public void beProtected(){} //此方法产生混淆,编译失败 public void getMoney(){ } public double getMoney(){ return 1.0; } } 编译异常:
所以实现多个接口时一定要仔细注意方法问题哦!
