gpt4 book ai didi

java - 有没有办法从抽象类的具体方法访问具体类变量值

转载 作者:行者123 更新时间:2023-11-30 01:52:32 25 4
gpt4 key购买 nike

我了解variable hiding and method overridingvirtual method calling在 java 。我的问题是,为什么变量隐藏在继承的方法中无法生效?这是否意味着我们必须重写每个子类中访问这些变量的方法?

抽象类

public abstract class ClassA{

protected int i = 0;

public void printOurStuff(){
System.out.println(i);
}

public void printMyStuff(){
System.out.println(this.i);
}

public void printSomeStuff(String s){
System.out.println(s);
}

}

具体类

 public class ClassB extends ClassA{

protected int i = 1;

public static main(String[] args){
ClassB b = new ClassB();
b.printOurStuff();
b.printMyStuff();
b.printSomeStuff(b.i);
}

}

结果

001

编辑 - 将字段的访问修饰符从私有(private)更改为 protected 并添加方法printOurStuff

最佳答案

当您声明私有(private)字段时,例如

  private int i = 0;

这意味着只有这个具体类可以访问这个变量。该字段不可用于子类。如果您希望此字段可用于子类,则应将其设为 protected :

  protected int i = 0;

要覆盖此字段的值,您可以使用静态 block ,例如:

public class ClassB extends ClassA {
{
i = 1;
}
}

或者在构造函数中分配一个新值:

public class ClassB extends ClassA {
public ClassB() {
i = 1;
}
}

就您的示例而言,如果您使用调试器检查 ClassB 对象,您会发现实际上有两个 i 字段:一个用于 ClassA 和一个用于 ClassB

更新:

关于i变量受保护的情况:
仔细看看你的类定义。
您不能不同意您声明 i 字段两次:对于 ClassAClassB。 JVM 将尊重此声明并遵循您的指示。如果该字段是protected 甚至是public,您仍然有两个字段。您不能像覆盖方法一样覆盖它们。当访问像 i = ... 这样的字段时,您实际上正在访问距离您的范围最近的字段。对于 ClassB 来说,它是其字段 i,而不是其父类(super class) ClassA 的字段。

此外,您仍然可以按如下方式访问父类(super class)的字段:

super.i = ...

super 是对父类(super class)的引用。

关于java - 有没有办法从抽象类的具体方法访问具体类变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55606045/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com