一句话:对象现在是什么类型调用的就是什么类型的静态成员,但它调用的实例成员都是它自己的东西(因为它就是那个实例)不用考虑它现在是不是被转换成了父类类型。
隐藏和覆盖的区别
重定义(隐藏)这个操作只发生在子类有一个和父类相同的静态方法/变量时,父类的同名的属性或者方法形式上不见了,实际是还是存在的。
重写(覆盖)是子类有与父类相同的方法,子类的返回类型可以是父类返回类型的子类(称为协变)
被隐藏的属性,在子类被强制转换成父类后,访问的是父类中的属性,在无强制转换时子类要访问父类的属性使用super关键字。
public class keji extends Dog{
static void eat(){
System.out.println("柯基吃了");
}
}
public class Tony extends keji{
public static void main(String[] args) {
keji tony = new Tony();
System.out.println("tony是否是keji类型:"+String.valueOf(tony instanceof keji));
System.out.println("tony是否是Tony类型:"+String.valueOf(tony instanceof Tony));
tony.eat();
}
static void eat(){
System.out.println("Tony吃了");
}
}
//tony是否是keji类型:true
//tony是否是Tony类型:true
//柯基吃了
被覆盖的方法,在子类被强制转换成父类后,调用的还是子类自身的方法,这是多态的一部分
public class keji extends Dog{
void eat(){
System.out.println("柯基吃了");
}
}
public class Tony extends keji{
public static void main(String[] args) {
keji tony = new Tony();
System.out.println("tony是否是keji类型:"+String.valueOf(tony instanceof keji));
System.out.println("tony是否是Tony类型:"+String.valueOf(tony instanceof Tony));
tony.eat();
}
@Override
void eat(){
System.out.println("Tony吃了");
}
}
//tony是否是keji类型:true
//tony是否是Tony类型:true
//Tony吃了