Java子类和父类定义相同名字的成员变量

在Java中,一个子类可以继承父类的成员变量,但有时我们可能需要在子类中定义与父类同名的成员变量。这种情况下,子类的成员变量会隐藏父类的同名成员变量。本文将详细介绍Java中,当子类和父类定义相同名字的成员变量时,它们的作用域和访问规则。

成员变量的作用域

在Java中,成员变量的作用域决定了它们在哪个范围内可见。

  • 类级别的成员变量(静态变量)在整个类中可见。
  • 对象级别的成员变量(实例变量)在每个对象中可见。

隐藏父类的成员变量

当子类定义了与父类同名的成员变量时,子类的成员变量会隐藏父类的同名成员变量。这种隐藏是因为子类中的成员变量与父类中的成员变量具有相同的名称。

下面是一个示例代码,演示了子类隐藏父类成员变量的情况:

class ParentClass {
    String name = "Parent";
}

class ChildClass extends ParentClass {
    String name = "Child";
}

public class Main {
    public static void main(String[] args) {
        ChildClass child = new ChildClass();
        ParentClass parent = child;

        System.out.println(child.name);  // 输出 "Child"
        System.out.println(parent.name); // 输出 "Parent"
    }
}

在上面的代码中,ParentClassChildClass分别定义了一个名为name的成员变量。当我们创建一个ChildClass对象并将其赋值给ParentClass类型的变量时,子类的成员变量会隐藏父类的成员变量。因此,当我们通过childparent对象访问name成员变量时,它们分别返回子类和父类的值。

访问父类的成员变量

尽管子类的成员变量隐藏了父类的同名成员变量,但我们仍然可以通过特殊的语法来访问父类的成员变量。在Java中,使用super关键字可以引用父类的成员变量。

下面是修改后的示例代码,演示了如何访问父类的成员变量:

class ParentClass {
    String name = "Parent";
}

class ChildClass extends ParentClass {
    String name = "Child";

    void printNames() {
        System.out.println(name);       // 输出 "Child"
        System.out.println(super.name);  // 输出 "Parent"
    }
}

public class Main {
    public static void main(String[] args) {
        ChildClass child = new ChildClass();
        child.printNames();
    }
}

在上述代码中,我们在ChildClass中添加了一个名为printNames()的方法。在该方法中,我们使用super.name来访问父类的成员变量,以便打印出父类的值。

总结

当子类和父类定义相同名字的成员变量时,子类的成员变量会隐藏父类的同名成员变量。通过使用super关键字,我们可以访问父类的成员变量。这种隐藏和访问父类成员变量的能力使得我们可以在子类中自定义和扩展父类的成员变量,从而实现更灵活的代码设计。