测试代码:
public class Employee {
public String name;
public String getType(){
return "Employee";
}
}
public class Manager extends Employee{
private int money;
public String getType(){
return "Manager";
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Employee A=new Manager();
A.name="Tom";
//A.money=2;//报错
String Type=A.getType();
System.out.println(Type);//Manager
}
通过测试我们发现以下几点:
- A对象可以使用从父类继承下来的非public属性
- A对象无法使用Manager子类新增的money属性
- A对象调用的方法是子类的方法
总结:父类声明子类实例化产生的对象使用的是子类从父类继承的方法和属性。
原理:
Employee A=new Manager();
实际是父类句柄指向子类对象空间,所以使用的属性和方法都是子类对象所有的。而因为是父类的句柄指向的只能是父类所拥有的属性和方法,所以指向的属性和方法实则又必须是是从父类继承而来的。
注意:
不能用子类声明父类实例化对象!
因为子类的句柄指向父类空间时,有可能有部分子类的属性方法是父类所没有的,因此,子类句柄无法指向有效的空间,编译无法通过。