[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父类,则改变和获取的是子类自己的成员变量。

原文地址:https://www.cnblogs.com/shuai2019/p/11103328.html

时间: 2024-10-29 18:27:54

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

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类。 (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法。 (3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承。 (4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承。 分析以上程

继承的基本概念: (1)Java不支持多继承,也就是说子类至多只能有一个父类. (2)子类继承了其父类中不是私有的成员变量和成员方法,作为自己的成员变量和方法.(3)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量不能被继承.(4)子类中定义的成员方法,并且这个方法的名字返回类型,以及参数个数和类型与父类的某个成员方法完全相同,则父类的成员方法不能被继承. 分析以上程序示例,主要疑惑点是“子类继承父类的成员变量,父类对象是否会实例化?私有成员变量是否会被继承?被继承的成员变量

Java反射理解(四)-- 获取成员变量构造函数信息

Java反射理解(四)-- 获取成员变量构造函数信息 步骤 获取成员变量信息: obj.getClass() 获取类类型对象 成员变量也是对象,java.lang.reflect.Field 类中封装了关于成员变量的操作: getFields() 方法获取的是所有的public的成员变量的信息 getDeclaredFields() 获取的是该类自己声明的成员变量的信息 getType() 得到成员变量的类型的类类型 getName() 得到成员变量的名称 获取成员变量构造函数信息: obj.g

【转】Java父类与子类的 内存引用讲解

从对象的内存角度来理解试试.假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.现在通过代码来看看内存的分配情况:Father f = new Father();     //系统将分配1M内存.Son s = new Son();           //系统将分配1.5M内存!因为子类中有一个隐藏的引用super会指向父类实例,所以在实例化子类之前会先实例化一个父类,也就是说会先执行父类的构造函数.由于s中包含了父类的实例,所

【转】Java 多线程(四) 多线程访问成员变量与局部变量

原文网址:http://www.cnblogs.com/mengdd/archive/2013/02/16/2913659.html 先看一个程序例子: public class HelloThreadTest { public static void main(String[] args) { HelloThread r = new HelloThread(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start();

Java 多线程(四) 多线程访问成员变量与局部变量

先看一个程序例子: public class HelloThreadTest { public static void main(String[] args) { HelloThread r = new HelloThread(); Thread t1 = new Thread(r); Thread t2 = new Thread(r); t1.start(); t2.start(); } } class HelloThread implements Runnable { int i; @Ove

JAVA类与对象(四)----成员变量与局部变量 、成员方法、构造方法

类体中的变量分为两部分.变量定义部分定义的变量为类的成员变量,在方法体中定义的变量和方法中涉及的变量称为局部变量. 成员变量和局部变量的区别: (1).成员变量在整个类中都有效,局部变量只在定义它的方法中有效 (2).成员变量分为实例成员变量(简称实例变量)和类变量(简称静态变量),如果在成员变量类型前加static,这个变量就称为类变量. (3).如果局部变量的名字与成员变量的名字相同,则成员变量被隐藏 ,也就是说,这个成员变量在这个方法中暂时失效. 例: public class Benso

java中的类修饰符、成员变量修饰符、方法修饰符。

类修饰符: public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final,将一个类生命为最终(即非继承类),表示他不能被其他类继承. friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类. 成员变量修饰符: public(公共访问控制符),指定该变量为公共的,他可以被任何对象的方法访问. private(私有访问控制符)指定该变量只允许自己的类的方法

java多线程执行任务,处理共享成员变量的安全问题

java多线程执行任务时,为了避免任务的重复执行,可以通过synchronized关键字处理共享成员变量,具体代码如下: // 多线程处理任务方法 private void processMultiTask(final List<LogStatTask> list, int threadCount) throws Exception { // 根据设定的线程数处理任务列表 for (int i = 0; i < threadCount; i++) { TaskThread thread

java中的类修饰符、成员变量修饰符、方法修饰符

类修饰符:  public(访问控制符),将一个类声明为公共类,他可以被任何对象访问,一个程序的主类必须是公共类. abstract,将一个类声明为抽象类,没有实现的方法,需要子类提供方法实现. final,将一个类生命为最终(即非继承类),表示他不能被其他类继承. friendly,默认的修饰符,只有在相同包中的对象才能使用这样的类. 成员变量 和 方法的访问权限