通过这次学习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;
}
}
编译异常:
所以实现多个接口时一定要仔细注意方法问题哦!