又称隐式转型、自动转型
父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类独有方法
小类转型为大类
父类的静态方法不允许子类重写,只能调用父类原有的静态方法
如果一定要调用子类中的静态方法就需要向下转型后再调用
又称强制类型转换
子类引用指向父类对象,此处必须进行强转,可以调用子类特有的方法
必须满足转型条件才可以强转(子类之间不能互相转换)
instanceof运算符:用于判断左边的类是否是右边的类的子类,返回true/faluse
通过abstract关键字修饰的类称为抽象类(放在class前面)
抽象类不允许直接实例化,可以通过向上转型,指向子类实例
应用场景:某个父类只是知道其子类应该包含怎样的方法,但无法准确知道这些子类如何实现这些方法。
方法前加上abstract后方法成为抽象方法
抽象方法不能有方法体,即不需要大括号和里面的代码,要在原来的方法名后加分号
子类必须重写父类的抽象方法
抽象子类不需要重写父类的抽象方法
使用规则:
1.abstract定义抽象类
2.抽象类不能直接实例化,只能被继承,可以通过向上转型完成对象实例
3.abtract定义抽象方法,不需要具体实现
4.包含抽象方法的类一定是抽象类
5.抽象类中可以没有抽象方法
6.static\final\private 不能与abstract并存
通过implements关键字实现
接口访问修饰符:public\默认 。 只能写这两种不能写别的
接口中抽象方法可以不写abstract关键字
接口内方法系统默认public的访问权限
实现类如果不是抽象类就要实现接口中所有的方法,如果是抽象类就不需要
接口中可以包含常量,默认public static final。
如在接口中 int temp = 20;就相当于public static final int temp = 20;
接口和实现类存在同名信息时,用接口实例化一个实现类后调用的同名信息是接口里的
接口可以实现多继承,即一个子接口可以同时继承多个父接口
一个类可以继承自一个父类,同时实现多个接口
default:默认方法,写在方法前面可以使接口中的方法带方法体
可以在实现类中重写并通过接口的引用调用
static:静态方法,可以带方法体
不可以在实现类中重写可以通过接口名调用
静态方法需要通过接口名去调用
接口.super.方法:表示调用接口中默认的方法
不加super只能访问接口中的静态成员
实现类必须重写一个满足自己特征的方法
如果这个类已经继承自父类那么默认情况下会直接调用父类的重名方法。
父类属性与接口中常量同名时:程序无法自动辨别,需要在子类中重新定义那个重名变量才能正常使用
一个类定义在另一个类里面或者一个方法里面,称为内部类
包含内部类的类称为外部类
作用:更好地实现了信息隐藏
分类:成员内部类、静态内部类、方法内部类、匿名内部类
获取内部类对象实例:
方式1:外部类.内部类 对象名= new 外部类.new 内部类
方式2:对象名 = 外部类对象.new 内部类
方式3:对象名 = 外部类对象.获取方法
内部类在外部使用时,无法直接实例化,需要借由外部类信息才能完成实例化
内部类的访问修饰符可以任意,但是访问范围会受到影响
内部类可以直接访问外部类的成员;如果出现同名属性,优先访问内部类中定义的
可以使用外部类.this.成员的方式,访问外部类中同名的信息
外部类访问内部类信息需要通过内部类实例,无法直接访问
内部类编译后.class文件命名:外部类$内部类.class
1.静态内部类中,只能直接访问外部类的静态方法,如果需要调用非静态方法,可以通过对象实例化
2.静态内部类对象实例时可以不依赖于外部类对象
3.可以通过外部类.内部类,静态成员的方式访问内部类中的静态成员
4.当内部类属性与外部类属性同名时默认直接调用内部类中的成员;如果需要访问外部类中的静态属性,可以通过外部类.属性的方式;如果需要访问外部类中的非静态属性,可以通过new 外部类().属性的方式
定义在外部类方法中的内部类,也称局部内部类
1.定义在方法内部,作用范围也在方法内
2.和方法内部成员使用规则一样,class前面不可以添加public、private、protect、static
3.类中不能包含静态成员
4.类中可以包含final\abstract修饰的成员
将类的定义和创建放到一起完成
类名 对象名 = new 构造方法();
语法:
test.getRead(new Person(){
@Override
public void read() {
System.out.println("...");
}
});
优点:对内存和系统性能影响较小
缺点:只能调用一次
适用场景:
1.只用到类的一个实例
2.类在定义后马上使用
3.给类命名并不会导致代码更容易被理解
匿名内部类编译后生成的.class文件命名为外部类名$1(2,3……).class
匿名内部类没有类型名称、实例对象名称
无法使用private/public/protect/abstract/static修饰
无法在匿名内部类编写构造方法,但可以通过构造代码块完成初始化
匿名内部类中不能出现静态成员
可以实现接口,也可以继承父类,但不可兼得