父子类类型转换
- 向上转型(子类转换成父类,自动转型):创建子类对象,当做父类使用,在调用方法的时候优先去找子类中的属性和方法,如果子类中没有再去父类中去寻找。也就是说如果子类覆盖重写了父类的方法,当子类实例化给父类在调用方法的时候调用的子类中的方法。如果父类和子类有相同的属性,当子类实例化给父类在调用属性的时候调用是父类的属性。
- 父类指向子类的方法不能调用子类的特有方法,也不能调用子类的特有属性。
- 向下转型:将父类对象转换为子类对象。使用 instanceof 关键字来判断是否父类是否是某一个子类实例化而来的,如果是可以进行强制转换。
- 抽象类作为父类的时候也可以进行类型转换
多态
- 继承多态:通过继承的方式来体现多态。实例化一个子类的对象来指向父类的引用。父类的引用指向某一个子类的对象,当我们将父类的引用指向另外一个子类的对象的时候在调用方法的时候就会调用当前子类中的方法。继承多态,不仅仅是父类是抽象类,父类是普通类也可以;子类对父类有方法重写;父类的引用执行子类的实例,调用覆盖重写的这个方法的时候,调用的是子类的方法。
- 对象的多态:一个对象有多种形态。
- 多态可以降低程序的耦合度,提高程序的扩展力
- 有了封装以后,就有了整体的这种概念,就会有对象与对象之间的继承关系,对象之间有继承关系才能够进行方法的覆盖重写和多态。
权限
private 和 protected 是不能用来修饰类的
public | protected | (default) | private | |
---|---|---|---|---|
同一个类 | √ | √ | √ | √ |
同一个包 | √ | √ | √ | × |
不同包子类 | √ | √ | × | × |
不同包非子类 | √ | × | × | × |
内部类
- 在一个类中包含另外一个类,内部类外用的时候是不能直接使用的,一定要创建内部类对象,需要 new 外部对象.new 内部类对象,内部类如果访问外部类的时候可以多以访问,权限不影响。当内部类和外部类重名的时候内部类成员变量可以直接访问,也可以this.属性名,如果要访问外部类的方法则需要使用 外部类名.this.属性名。
- 实例内部类:不能使用静态成员变量,创建实例内部类的时候,外部类的实例必须已经创建好了。也就是说在创建实例内部类的时候必须有外部类的引用。
- 静态内部类:创建静态内部类的时候,可能不用有外部类的引用,静态内部类可以访问外部类的静态变量,但是如果要访问成员变量,那么就需要实例化外部类。
- 局部内部类:类定义在方法的内部,只有当前方法才能够使用,和局部变量一样。局部内部类中不能包含静态成员变量。
- 匿名内部类:创建接口的时候直接 new 接口 {},{} 就是一个匿名类,实现了接口的类