[Java] 父类和子类拥有同名的成员变量(fields)的情况
程序员文章站
2023-10-18 22:05:10
首先,需要明确的是,无论是通过casting,还是通过将子类对象的reference赋值给父类变量,都无法改变该reference所指对象的真实类型。但当该reference的类型是父类时,将无法调用只存在于子类中的方法。 当子类拥有与父类同名的成员变量时,父类的成员变量并不会被覆盖,而是与子类的成 ......
首先,需要明确的是,无论是通过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 }
运行输出结果为
employee
employee
director
director
因此,当子类的成员变量与父类同名时,若对该成员变量进行操作的方法继承于父类,则改变和获取的是父类的成员变量。
若对该成员变量进行操作的方法为子类所独有,或override父类,则改变和获取的是子类自己的成员变量。