gpt4 book ai didi

java - 当您执行 A thing = new B(); 时,实例变量调用如何工作?其中 B 是 A 的子类?

转载 作者:行者123 更新时间:2023-12-01 06:57:37 25 4
gpt4 key购买 nike

这可能在某个地方得到了回答,但我不知道要搜索什么。想象一下您有以下内容...

父类(super class) Animal.java

public class Animal {
public String noise = "squeak";
public String toString() { return noise; }
}

子类,Lion.java

public class Lion extends Animal {
public String noise = "ROAR!!";
public String toString() { return noise; }
}

主类,Runner.java

public class Runner {
public static void main(String[] args) {
Animal a = new Animal();
System.out.println(a);
System.out.println(a.noise);
Lion b = new Lion();
System.out.println(b);
System.out.println(b.noise);
Animal c = new Lion();
System.out.println(c);
System.out.println(c.noise);
}
}

输出为:

squeak
squeak
ROAR!!
ROAR!!
ROAR!!
squeak

为什么 c.noise 会返回吱吱声?实例方法调用和实例变量之间有什么区别,一个返回您期望的内容,而另一个则不返回? Java 为什么要这样做?

谢谢

最佳答案

简短回答:

您可以覆盖方法,但无法覆盖字段。

长答案:

每个类都可以看到它自己及其父类的方法和字段(私有(private)方法除外)。如果子类删除了一个方法,其名称与其父类中的方法名称相同,则该方法将被重写 - 如果该方法以某种方式在子实例上调用(即使是从父方法之一),将使用全新的方法而不是父方法。子级仍然可以通过 super.method(...) 调用来调用其最后一个父级的原始方法。

但是当我们来到田野时,情况就不同了。如果子类声明了一个新字段,其名称与父类中的字段完全相同,它将简单地隐藏父类的字段而不会覆盖,就像局部变量隐藏全局变量一样。因此,子方法将只看到子方法的字段,但父方法将继续看到父方法的字段,并且子方法将不会以任何方式从父类中可见 - 这就是您所拥有的。

子级可以通过((Parent)this).field访问其父级的字段。

关于java - 当您执行 A thing = new B(); 时,实例变量调用如何工作?其中 B 是 A 的子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7735536/

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