1 接口概述
1.接口就是一种公共的规范标准。 2.接口是一种引用数据类型,最重要的是抽象方法。 2 接口的定义格式
public interface 接口名称{ //抽象方法 //默认方法 //静态方法 //私有方法 } 2-1 抽象方法
抽象方法:使用abstract关键字修饰,可以省略,没有方法体。该方法供子类实现使用。代码如下:
public interface InterFaceName{
[public] [abstract] void method();
}
2-2 默认方法
从Java 8开始,接口里允许定义默认方。
默认方法:使用default关键字修饰不可省略,供子类调用或者子类重写。
public interface InterFaceName{
[public] default void method(){
// 执行语句
}
}
默认方法是为了解决接口升级问题 2-3 静态方法
从Java 8开始,接口里允许定义静态方法。
静态方法:使用static修饰,供接口直接调用。
public interface InterFaceName{
[public] static void method(){
// 执行语句
}
}
静态方法应该通过接口名称进行调用,不能通过实现类对象调用接口静态方法 2-4 私有方法
从Java 9开始,接口里允许定义私有方法。 解决多个默认方法之间重复代码问题。
普通私有方法: private 返回值类型 方法名称(参数列表) { 方法体 }
静态私有方法: private static 返回值类型 方法名称(参数列表) { 方法体 } 2-5 成员变量
成员变量其实是常量,格式:public static final int A=1;
[public] [static] [final] 数据类型 常量名称=数据值;
注意:
常量必须进行赋值,而且一旦赋值不能改变。
常量名称完全大写。
3 使用接口的时候,需要注意
1.接口是没有静态代码块或构造方法的。
-
类与类之间是单继承的,直接父类只有一个。
类与接口之间是多实现的,一个类可以实现多个接口。
接口与接口之间是多继承的。
3.如果实现类所实现的多个接口当中,存在重复的抽象方法,那么只需要覆盖重写一次即可。
4.如果实现类实现的多个接口当中,存在重复的默认方法,那么实现类一定要对其中的默认方法进行覆盖重写。
5.一个类如果直接父类当中的方法,和接口当中的默认方法产生了冲突,优先用父类当中的方法。 4 方法覆盖重写的注意事项
1.必须保证父子类之间方法的名称相同,参数列表也相同。 @Override:写在方法前面,用来检测是不是有效的正确覆盖重写。 这个注解就算不写,只要满足要求,也是正确的方法覆盖重写。
2.子类方法的返回值必须[小于等于]父类方法的返回值范围。 提示:object类是所有类的公共最高父类,String就是object的 子类。
3.子类方法的权限必须[大于等于]父类方法的权限修饰符。
提示: public > protected > (default) > private
备注: (default)不是关键字default,而是什么都不写,留空。
5 多态中的方法与成员变量的使用规则(重难点)
(1) 成员变量使用规则:看等号左边是谁优先使用谁,没有则往上找。
(2) 运行方法使用规则;new谁,优先调用谁,没有则往上找;
总结: 成员变量:编译看左边,运行还看左边。
成员方法:编译看左边,运行看右边。
换句话说,当子类中有一个A方法,父类中没有该方法,则编译不通过;
当子类中重写了父类的B方法时,编译时父类有B方法,编译通过。运行先到子类中找,如果子类中有,则调用子类中的该方法,没有则往上找。
6 Final关键字与内部类(重点、难点)
(1) final关键字代表最终、不可改变的。常见四种用法: . 1. 可以用来修饰-一个类,表示这个类是不可以被继承的。…class final A{…};
2. 可以用来修饰一个方法,表示这个方法不能被覆盖重写的。…p final void…
注意:如果一个类的方法被private final修饰,则该类的子类还是可以写一个同名的方法,但该方法不是重写方法。Private方法不能被覆盖重写。
3.可以用来修饰一个局部变量,可以声明时赋值,或者后面赋一次值,二选一。
4.可以用来修饰一个成员变量,可以声明时赋值,或者在所有构造方法内赋值。
(2) 注意事项: 1.对于类、方法来说,abstract关键字和final关键字不能同时使用,因为矛盾。
2.对于基本类型来说,不可改变是说变量中的数据不可改变。
3.对于引用类型来说,不可改变是说变量当中的地址值不可改变。