返回

继承中的作用域: 理清子父类间的变量访问规则

后端

在面向对象编程中,继承是一种重要的特性,它允许派生类从基类继承属性和方法。不过,继承也涉及到一个微妙的概念——作用域。

作用域指的是变量或函数的可访问性范围。在继承中,基类和派生类拥有各自独立的作用域,这意味着它们可以拥有同名的成员(变量或函数),而不会相互干扰。

同名成员的屏蔽

当子类和父类拥有同名的成员时,子类成员将屏蔽 父类同名成员。换句话说,当子类访问同名成员时,它只会访问自己类中定义的成员,而不会访问父类中的同名成员。

示例:

class Parent {
  public int age = 50;
}

class Child extends Parent {
  public int age = 20;
}

public class Main {
  public static void main(String[] args) {
    Child child = new Child();
    System.out.println(child.age); // 输出:20
  }
}

在上面的示例中,Child 类继承了 Parent 类的 age 变量。然而,当我们创建 Child 对象并访问它的 age 变量时,输出的是子类中定义的 age 值(20),而不是父类中定义的 age 值(50)。

基类成员的访问

尽管子类成员会屏蔽同名的父类成员,但派生类仍然可以通过 super 访问父类的成员。super 关键字可以显式地引用父类,允许派生类访问父类的变量和方法。

示例:

class Parent {
  public int age = 50;
}

class Child extends Parent {
  public int age = 20;

  public void printAge() {
    System.out.println("子类年龄:" + age);
    System.out.println("父类年龄:" + super.age);
  }
}

public class Main {
  public static void main(String[] args) {
    Child child = new Child();
    child.printAge();
    // 输出:
    // 子类年龄:20
    // 父类年龄:50
  }
}

在上面的示例中,Child 类通过 super 关键字访问了父类的 age 变量,并打印出了父类和子类的 age 值。

结论

继承中的作用域涉及基类和派生类成员的可访问性。子类成员屏蔽同名的父类成员,但派生类可以通过 super 关键字访问父类的成员。理解继承中的作用域对于编写健壮和可维护的代码非常重要。