重写补充
子类重写的方法,返回类型和父类的返回类型必须一致或者是其子类
class Grandpa{
public String call(){
return null;
}
}
class Father extends Grandpa{
@Override
public Object call() {
return new Array();
}
}
以上情况会报错:因为子类重写的方法返回类型Object是其父类返回类型String的父类
子类方法不能缩小父类方法的访问权限
class Grandpa{
public String call(){
return null;
}
}
class Father extends Grandpa{
@Override
protected String call() {
return null;
}
}
以上情况会报错:因为子类重写方法的时候缩小了访问权限(public->protected)
public > protected > default(默认的) > private
多态补充
- 编译类型和运行类型可以不一致
- 编译类型确定之后不能改变
- 运行类型可以改变
Animal Animal = new Dog();
animal = new Cat();//改变运行类型
animal对象可以调用父类中的所有成员(需要遵守访问权限),但是不能调用子类的特有的成员(因为处于编译阶段)
向下转型
Cat cat = animal.Cat();
转型之后cat对象可以使用Cat这个类的所有权限允许方法和属性(相当于编译类型从Animal类转换成Cat类,运行类型Cat类)
但是不允许
Dog dog = animal.Dog();
向下型转必须发生在父类引用指向子类对象之后,并且只允许这两者的转换
动态绑定机制
public class DynamicBinding {
public static void main(String[] args) {
A a = new B();
System.out.println(a.sum());//40
System.out.println(a.sum1());//30
}
}
class A{
public int i = 10;
public int sum(){
return getI() + 10;
}
public int getI(){
return i;
}
public int sum1(){
return i + 10;
}
}
class B extends A{
public int i = 20;
public int sum(){ //如果注销此方法,结果为30
return i + 20;
}
public int getI(){
return i;
}
public int sum1(){//如果注销此方法,结果为20
return i + 10;
}
}
当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
当调用对象属性的时候,没有动态绑定机制,哪里声明,那里使用
多态数组
数组的定义类型为父类类型,保存的是子类类型的数据