首先,需要明确的是,无论是通过casting,还是通过将子类对象的reference赋值给父类变量,都无法改变该reference所指对象的真实类型。但当该reference的类型是父类时,将无法调用只存在于子类中的方法。
当子类拥有与父类同名的成员变量时,父类的成员变量并不会被覆盖,而是与子类的成员变量分别存储在不同的空间,其值仍然可以被改变和访问。
如下例:
1 class Employee{ 2 3 private String title = "Employee"; 4 5 public void setTitle(String title) { 6 this.title = title; 7 } 8 9 public String getTitle() { 10 return this.title; 11 } 12 13 } 14 15 class Manager extends Employee{ 16 17 private String title = "Manager"; 18 19 } 20 21 class Director extends Employee{ 22 23 private String title = "Director"; 24 25 public String getTitle() { 26 return this.title; 27 } 28 } 29 30 public class SameName { 31 32 public static void main(String[] args) { 33 34 Employee e = new Employee(); 35 Employee m = new Manager(); 36 Director d = new Director(); 37 38 System.out.println(e.getTitle()); 39 40 //子类Manager的getTitle方法继承于父类Employee, 41 //因此调用时,访问的是父类的同名成员变量 42 System.out.println(m.getTitle()); 43 44 //子类Director override父类的getTitle方法, 45 //因此调用时,访问的是子类自己的成员变量 46 System.out.println(d.getTitle()); 47 48 //子类Director的setTitle方法继承于父类Employee, 49 //因此调用时,改变的是父类的同名成员变量 50 d.setTitle("President"); 51 System.out.println(d.getTitle()); 52 53 } 54 }