欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[Java] 父类和子类拥有同名的成员变量(fields)的情况

程序员文章站 2022-06-03 17:59:34
首先,需要明确的是,无论是通过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父类,则改变和获取的是子类自己的成员变量。