1.多态
多态的基础是动态编译,对象的类型在运行时才确定。
当一个父类引用指向一个子类对象时:
- 父类引用调用父类独有的方法时,则调用该父类方法
- 父类引用调用子类重写的方法时,则调用子类重写后的方法 (并不会去调用父类中的同名方法)
- 父类引用调用子类独有的方法时,会报错,因为父类类型里并没有该方法
Rabbit r1 = new Rabbit();
Animial r2 = new Rabbit();
r1.act();
r2.act(); // 调用子类Rabbit的act方法
2.哪些方法不能被重写
static方法:属于类,不属于实例对象,无法重写
final :在常量池中
private:无法被子类继承
3.instanceof
语法: 对象 instanceof 类
该对象是否属于右边的类,或者属于右边的子类 返回boolean
看的是对象实际是什么类型,而非看对象的引用类型
Animal a = new Rabbit();
Systemn.out.println( a instanceof Animal ); //true
Systemn.out.println( a instanceof Rabbit ); //true
Systemn.out.println( a instanceof Object ); //true
Systemn.out.println( a instanceof Tiger ); //false
Systemn.out.println( a instanceof String ); //编译报错
a实际是Rabbit,所以是属于Rabbit类的,也是Animal类和Object类的派生类。
当左边的对象类型与右边的类没有任何继承关系时,会在编译时报错。
4.类型转换
基本类型:看位数: 64,32,16,8,4 高位数转低位数需要强制类型转换,低转高不需要
引用类型:父类转子类需要强制类型转换,子类转父类不需要
Animal a = new Rabbit(); //子类转父类,不需要强制转换
Rabbit r = (Rabbit)a; //父类转子类,需要强制类型转换,可能会丢失子类的方法