java中父类和子类的成员变量可以重名吗

在Java中,子类可以声明一个与父类同名的成员变量,这称为字段隐藏(Field Hiding); 如果子类中定义了一个与父类同名的成员变量,则会发生字段隐藏,而不是覆盖。这意味着子类中的同名成员变量会"遮蔽"掉父类中的那个变量,但这并不影响父类中原有成员变量的存在。但需要注意以下关键点:

核心规则:

  1. 允许声明同名变量:语法上完全允许子类定义与父类同名的成员变量。

  2. 独立存储 :父类和子类的同名变量是两个独立存储的变量,互不影响。

  3. 访问规则

    • 在子类方法中直接使用变量名时,默认访问的是子类自己的变量

    • 若需访问父类的同名变量,必须使用 super.变量名(如 super.c)。

  4. 多态不适用 :字段访问不遵循多态规则,由引用类型决定访问哪个变量。

示例代码:

java 复制代码
class Parent {
    int c = 10; // 父类成员变量
}

class Child extends Parent {
    int c = 20; // 子类隐藏父类的c

    void print() {
        System.out.println(c);         // 20 (子类变量)
        System.out.println(super.c);   // 10 (父类变量)
    }
}

public class Main {
    public static void main(String[] args) {
        Parent obj1 = new Child();
        System.out.println(obj1.c);    // 10 (引用类型为Parent,访问父类变量)

        Child obj2 = new Child();
        System.out.println(obj2.c);    // 20 (引用类型为Child,访问子类变量)
    }
}

总结:

场景 访问结果
子类方法中直接写 c 子类的变量
子类方法中写 super.c 父类的变量
通过父类引用 Parent obj 访问 父类的变量(编译时决定)
通过子类引用 Child obj 访问 子类的变量
相关推荐
earthzhang20217 小时前
【2051】【例3.1】偶数
开发语言·数据结构·算法·青少年编程·图论
天天摸鱼的java工程师7 小时前
别再写那些重复代码了!8年Java老兵教你用 Hutool 提升开发效率
java·后端
喝杯绿茶8 小时前
springboot中的事务
java·spring boot·后端
专注VB编程开发20年8 小时前
.NET Reflector反编绎,如何移除DLL中的一个公开属性
开发语言·c++·c#
麦兜*8 小时前
多阶段构建:打造最小化的 Spring Boot Docker 镜像
java·spring boot·后端·spring cloud·docker
oak隔壁找我8 小时前
Spring Boot Starter 入门教程
java·后端
YoungP8 小时前
【Effective Java 条目一】-- 用静态工厂方法替代构造器
java
高山上有一只小老虎8 小时前
求最大连续bit数
java·算法
vxiam14xxx8 小时前
【Java Swing 项目】java 聊天系统
java·开发语言·python
Dylan的码园8 小时前
以二叉树问题为基础的递归调试学习(上)
java·学习·算法·leetcode·r-tree