gpt4 book ai didi

java - 对这个简单的多态性例子感到困惑

转载 作者:行者123 更新时间:2023-12-01 07:35:46 26 4
gpt4 key购买 nike

请看一下这段代码:

class Foo {
public int a;
public Foo() {
a = 3;
}
public void addFive() {
a += 5;
}
public int getA() {
System.out.println("we are here in base class!");
return a;
}
}

public class Polymorphism extends Foo{
public int a;
public Poylmorphism() {
a = 5;
}
public void addFive() {
System.out.println("we are here !" + a);
a += 5;
}
public int getA() {
System.out.println("we are here in sub class!");
return a;
}

public static void main(String [] main) {
Foo f = new Polymorphism();
f.addFive();
System.out.println(f.getA());
System.out.println(f.a);
}
}

这里我们将Polymorphism类的对象引用分配给Foo类型的变量,这是经典的多态性。现在我们调用方法addFive,该方法已在类Polymorphism 中被重写。然后我们从 getter 方法打印变量值,该方法也已在类 Polymorphism 中被重写。所以我们得到的答案是 10。但是当公共(public)变量 a 被 SOP 处理时,我们得到答案 3!!

这是怎么发生的?尽管引用变量类型是 Foo 但它引用的是 Polymorphism 类的对象。那么,为什么访问 f.a 不会导致打印类 Polymorphism 中的 a 值呢?请帮忙

最佳答案

您隐藏了多态性a - 您实际上应该收到编译器警告。因此,这是两个不同的 a 字段。与方法相反,字段不能是虚拟的。好的做法是根本不具有公共(public)字段,而仅具有改变私有(private)状态(封装)的方法。

如果您想将其设为虚拟,则需要将其设为具有访问器方法的属性(例如您所拥有的:getA)。

关于java - 对这个简单的多态性例子感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12446472/

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