gpt4 book ai didi

java - 解释这个输出

转载 作者:搜寻专家 更新时间:2023-11-01 02:09:01 25 4
gpt4 key购买 nike

class A {
private int a = 10;

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}
}

class B extends A {
public int a = 20;
}

public class Demo {
public static void main(String args[]) {
B a = new B();
System.out.println(a.getA());
}
}

输出:10
由于父类中的所有字段都存在于子对象中,因此子对象中有两个字段共享相同的名称(a)和getter和setter,所以java如何解析这个getter和父类中私有(private)字段的设置方法?

最佳答案

getA() 方法只在父类(super class)中定义,并且只能访问父类(super class)的成员。它无法知道子类的a,所以子类的a不能隐藏它。

子类的成员a是private还是public无关。如果您在子类中将 a 声明为私有(private),您将看到相同的行为。

更新:这里试图回答更普遍的问题:如何解析在父类和子类中定义的成员?

考虑 OP 示例的以下扩展:

class A {
public int a = 10;

public int getA() {
return a;
}

public void setA(int a) {
this.a = a;
}
}

class B extends A {
public int a = 20;
}
class C extends B {
public int getA() {
return a;
}
}

public class Demo {
public static void main(String args[]) {
B a = new B();
System.out.println(a.getA());

C c = new C();
System.out.println(c.getA());
}
}

在这里,我们看到输出 1020,这意味着类 CgetA() 方法是读取 B 类版本的 a

现在让我们看看如果我们将 BA 版本设为私有(private)会发生什么。

class B extends A {
private int a = 20;
}

如果我们尝试编译,我们会得到一个编译器错误:

Demo.java:18: error: a has private access in B

上面的实验似乎表明每个类都将尝试通过查看自身或在类层次结构中向上移动直到找到第一个 a 来解决 a。如果 a 对它可见(意味着 publicprotected),那么它将返回它。如果那个 a 不可见,那么它就不会编译。

关于java - 解释这个输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22587330/

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