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

Posted shuai2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Java] 父类和子类拥有同名的成员变量(fields)的情况相关的知识,希望对你有一定的参考价值。


首先,需要明确的是,无论是通过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父类,则改变和获取的是子类自己的成员变量。

 

以上是关于[Java] 父类和子类拥有同名的成员变量(fields)的情况的主要内容,如果未能解决你的问题,请参考以下文章

C++中父类和子类的成员函数同名同参数同返回只是父类里面是虚函数,子类没有虚函数限定 有问题吗

java中父类和子类初始化顺序

java的父类和子类的关系都有哪些?

java父类调用子类变量

java父类调用子类变量

成员变量的隐藏,方法的覆盖,super关键字