抽象类
当父类的某些方法,需要声明,但是又不确定如何实现时,可以将其声明为抽象方法,那么这个类就是抽象类
注意事项
abstract只能修饰类和方法,不能修饰属性和其他的- 抽象类无法被实例化(new)
- 如果一个类继承了抽象类,则它必须实现抽象类的所有抽象方法,除非它自己也声明为 abstract 类
- 抽象方法不能使用
private 、 final 和 static来修饰,因为这些关键字都是和重写相违背的
最佳实现——模板设计模式
接口
接口就是给出一些没有实现的方法,封装到一起,到某个类要使用的时候,再根据具体情况把这些方法写出来
注
- jdk7.0 及以前接口里的所有方法都没有方法体
- jdk8.0 及以后接口类可以有静态方法,默认实现方法,也就是说接口中可以有方法的具体实现,但需要有
default关键字
注意事项
- 所有方法都为
public方法,抽象方法可以省略abstract关键字 - 如果一个普通类要实现接口,必须实现该接口的所有抽象方法
- 抽象类实现接口,可以不用实现接口的方法
- 不可被
实例化(new) - 一个类可以同时实现多个接口
- 接口中的属性只能为
final,而且是public static final修饰符,如int n = 0;实则等价于public static final int n = 0; - 接口中属性的访问方式可以为 接口名.属性名,实现的类名.属性名,实现的类实例化的对象名.属性名
- 一个接口不能继承
其他的类,但可以继承多个别的接口,如interface A extends B,C - 修饰符只能是
public和 默认
多态特性
- 多态参数
- 多态数组
- 多态传递 如果 IS 继承了 IH 接口,而 Teacher 类实现了 IS 接口,那么,实际上就相当于 Teacher 类也实现了 IH 接口
接口 VS 继承
接口和继承解决的问题不同 继承的价值主要在于:解决代码的复用性和可维护性 接口的价值主要在于:设计,设计好各种规范(方法),让其它类去实现这些方法 接口比继承更加灵活,继承是满足 is-a 的关系,而接口只需满足 like-a 的关系 接口在一定程度上实现代码解耦(即 接口规范性 + 动态绑定)
举个形象的例子:老猴子是父类,小猴子是子类,鱼的游泳功能和鸟的飞翔功能是接口
内部类
定义在外部类局部位置上(比如方法内)
局部内部类(有类名)
局部内部类是定义在外部类的局部位置,比如方法中,并且有类名
注意事项
- 不能添加访问修饰符,但是可以使用
final修饰 - 可以直接访问外部类的所有成员,包含私有的
- 作用域:仅在定义它的方法或代码块中
- 局部内部类—访问—->外部类的成员【访问方式:直接访问】
- 外部类—访问—>局部内部类的成员【访问方式:创建对象,再访问】(注意:必须在作用域内)
- 外部其他类—不能访问—–>局部内部类(因为局部内部类地位是一个局部变量)
- 如果外部类和局部内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问,如
System.out.println("外部类的n2="+外部类名.this.n2)
匿名内部类(无类名 重点!!!)
1.本质是类 2. 是内部类 3. 没有名字(其实是系统分配名字而不显示也不能修改名字) 4. 还是一个对象
new 类或接口(参数列表){
//类体
}
注意事项
- 只能使用一次
- 可以直接访问外部类的所有成员,包含私有的
- 作用域:仅在定义它的方法或代码块中
- 匿名内部类—访问—->外部类的成员【访问方式:直接访问】
- 外部类—访问—>匿名内部类的成员【访问方式:创建对象,再访问】(注意:必须在作用域内)
- 外部其他类—不能访问—–>匿名内部类(因为匿名内部类地位是一个局部变量)
- 如果外部类和匿名内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问,如
System.out.println("外部类的n2="+外部类名.this.n2)
最佳实践 当做实参直接传递,简洁高效
定义在外部类成员位置上
成员内部类(没有 static 修饰)
注意事项
- 可添加任意类型的访问修饰符,因为它的地位是一个成员
- 可以直接访问外部类的所有成员,包含私有的
- 作用域:和外部类的其他成员一样,为整个类体
- 成员内部类—访问—->外部类的成员【访问方式:直接访问】
- 外部类—访问—>成员内部类的成员【访问方式:创建对象,再访问】
- 外部其他类—访问—–>成员内部类
- 如果外部类和成员内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.this.成员)去访问,如
System.out.println("外部类的n2="+外部类名.this.n2)
静态内部类(使用 static 修饰)
注意事项
- 可添加任意类型的访问修饰符,因为它的地位是一个成员
- 可以直接访问外部类的所有成员,包含私有的,但不能直接访问
非静态成员 - 作用域:和外部类的其他成员一样,为整个类体
- 静态内部类—访问—->外部类的成员【访问方式:直接访问】
- 外部类—访问—>静态内部类的成员【访问方式:创建对象,再访问】
- 外部其他类—访问—–>静态内部类
- 如果外部类和静态内部类的成员重名时,默认遵循就近原则,如果想访问外部类的成员,则可以使用(外部类名.成员)去访问,如
System.out.println("外部类的n2="+外部类名.n2)
类的五大成员
属性、方法、构造器、代码块、内部类