类的扩展
接口和抽象类
- interface 声明接口
- implements实现接口
- 接口约定的是功能,而不是具体实现
- 接口中方法的默认修饰符为public abstract
- 接口中变量的默认修饰符为public static final
- 接口不能创建对象,但是接口可以作为引用类型,将其实现类的对象赋值给接口
- 一个类可以实现多个接口
- 一个接口可以继承多个接口
- 一个类可以同时实现接口并且继承类,关键字extends要放在implements前面
- JAVA8允许在接口中存在静态方法和默认方法(default修饰)(JAVA9规定这两种方法都可以使用private修饰)
- 实现接口必须实现其所有的抽象方法,因为普通类中不能包含抽象方法
- 继承抽象类必须实现抽象类的所有抽象方法,除非该类也是抽象方法
- 抽象类中可以包含具体方法和实例变量,他和具体类的区别是,抽象类不能创建对象
- 接口定义能力,抽象类提供默认实现,实现全部或者部分方法,减少子类要实现的方法。
- 抽象类可以实现接口中的方法,也可以不实现。
- 抽象类和接口中的方法,最终都必须进行实现
内部类
- 静态内部类
1)静态内部类可以有静态变量和实例变量,静态方法和实例方法,构造方法。静态内部类只能可以访问外部类的静态变量和静态方法。
2)为什么不能访问实例变量和方法,因为静态内部类会随着类的加载而加载,当他调用实例方法的时候,实例方法可能还没有进行初始化,所以不能
3)public的静态内部类可以被其他类使用。 外部类.静态内部类
4)静态内部类最终会生成: 外部类$静态内部类 - 成员内部类
1)成员内部类创建需要通过外部类对象来创建
Base b = new Base();
b.Inner i = b.new Inner();
2)成员内部类和外部类对象绑定,不能访问外部类静态变量和静态方法,因为静态变量和静态方法和类本身绑定,是独立使用。 - 方法内部类
1)方法内部类只能再该方法中使用
2)方法是实例方法,方法内部类可以访问外部类的静态方法和变量,实例方法和变量
3)方法内部类还可以访问方法的参数以及局部变量,只不过得用final修饰,再java8之后,可以不用final修饰,不过该变量不能呗重新赋值,否则会编译出错
4)方法内部类的实现原理
将方法内部类单独分离成一个类,将使用到的方法中的参数作为该类的成员变量,将外部类对象作为该类的成员变量,使用到的外部类变量在外部类中创建方法来获取,创建带参的构造方法;把方法中的操作进行封装,存在于该类中;再方法中声明并调用该类中的方法。 - 匿名内部类
枚举
public enum Size{
SMALL, MEDIUM, LARGE
}
public enum Size{
SMALL("S", "小号");
MEDIUM("M", "中号");
LARGE("L", "大号");
private String abbr;
private String title;
//getter setter方法省略
}
- int ordinal() //表示枚举在声明时的顺序
- valueOf(String str) //返回字符串对应的枚举值
- toString() //返回当前枚举对应的字符串