第六章学习内容
1.接口
使用interface来定义一个接口。
接口体中包含常量的声明(没有变量)和抽象方法两部分。接口体中只有抽象方法,没有普通的方法,而且接口体中所有的常量的访问权限一定都是public
,而且是static常量(允许省略public、final和static修饰符),所有的抽象方法的访问权限一定都是public(允许省略public abstract修饰符),例如:
interface Printable{
public static final int MAX = 100; //等价写法:int MAX = 100;
public abstract void add(); //等价写法: void add();
public abstract float sum(float x ,float y);
}
2.实现接口
- 重写接口中的方法:如果一个非抽象类实现了某个接口,那么这个类必须重写这个接口中的所有方法。需要注意的是,由于接口中的方法一定是public abstract 方法,所以类在重写接口方法时不仅要去掉abstract修饰符、给出方法体,而且方法的访问权限一定要明显地用public修饰。
- 如果一个类声明实现一个接口,但没有重写接口中的所有方法,那么这个类必须是抽象类,也就是说,*抽象类既可以重写接口中的方法,也可以直接拥有接口中的方法。
- 程序可以用接口名访问接口中的常量,但是如果一个类实现了接口,那么该类可以直接在类体中使用该接口中的常量。
- 定义接口时,如果关键字interface前面加上public关键字,就称这样的接口是一个public接口。public接口可以被任何一个类发现。如果一个接口不加public修饰,就称作友好接口,友好接口可以被与该接口在同一包中的类实现。
- 如果父类实现了某个接口,那么子类也就自然实现了该接口,子类不必再显式地使用类关键字implements声明实现这个接口。
- 接口也可以被继承,即可以通过关键字extends声明一个接口是另一个接口的子接口。由于接口中的方法和常量都是public的,子接口将继承父接口中的全部方法和常量。
3.接口回调
- 可以把实现某一接口的类创建的对象的引用赋给该接口声明的接口变量中,那么该接口变量就可以调用被类重写的接口方法。实际上,当接口变量调用被类重写的接口方法时,就是通知相应的对象调用这个方法。
举例:
Com com;//声明接口对象
ImpleCom obj= new ImpleCom();//实现接口子类对象
com = obj; //接口回调
- (接口回调非常类似于在第五章中介绍的上转型对象调用子类重写的方法。)
4.理解接口
- 接口可以抽象出重要的行为标准,该行为标准用抽象方法来表示。
- 可以把实现接口的类的对象的引用赋值给接口变量,该接口变量可以调用被该类实现的接口方法,即体现该类根据接口里的行为标准给出的具体行为。
5.接口参数
- 如果准备给一个方法的参数传递一个数值,可能希望该方法的参数的类型是double类型,这样一来就可以向该参数传递byte、int、long、float和double类型的参数。
- 如果一个方法的参数是接口类型,我们可以将任何实现该接口的类的实例的引用传递给该接口参数,那么接口参数就可以回调类实现的接口方法。
6.abstract类与接口的比较
- abstract类和接口都可以有abstract方法。
- 接口中只可以有常量,不能有变量;而abstract类中即可以有常量也可以有变量。
- abstract类中也可以有非abstract方法,接口不可以
SP.第五周学习中碰到的问题
(1)记一个比较蠢的问题(手动捂脸)。
警示自己之后敲代码要认真,不能走神
因为是自己敲的代码,不是复制的源代码,所以导致了如下错误
怎么编译都通不过,最后发现是MAX
不是Max
(2)接口回调中碰到的问题
1)问题描述
第一张图圈出的内容相当于接口回调,使得出现第二张图中的问题。
2)解决方案
删除一行赘余的代码。