在两个类中具有相同名称的Java访问属性



我有两个类,A和B, B从A继承。这两个类都有一个名为w的int类型属性。

在类A中w是公有的,在类B中w是私有的。

我用B构造函数创建了一个A类型的对象——A A = new B()

然而,当我试图访问B的属性时,我发现我只能访问类A中的变量或方法,即使我创建了B类型的对象。

我认为这只有在两个类没有相同的方法或变量时才相关。但是在这种情况下,两个类都有一个名为w的变量,但它只能访问存储在a类中的值。为什么会这样呢?


public class A {
public int w;
private static String str = "K";

public A() {
str+="B";
w+=str.length();
str+=w;
}

@Override
public String toString() {
return str.charAt(w-2)+"P";
}

}

B类

public class B extends A {
public static int w = 2;
private String str = "W";

public B(int x) {
w+=super.w;
str+=super.toString()+w;
}

@Override
public String toString() {
return super.toString() + str;
}
}

测试类

public class Q1 {
public static void main(String[] args) {
A a = new A();
A a2 = new B(1);
System.out.println(a);
System.out.println(a.w);
System.out.println(a2);
System.out.println(a2.w);
B b = new B(2);
System.out.println(b);
}
}

由于变量a的类型是[class]A,因此该变量只能访问类A的成员和方法(取决于访问说明符)——尽管变量a的实际类型是类B

参考javax.swing.JComponent类中的paintComponent方法。方法参数的类型是Graphics,但参数的实际类型是Graphics2D(扩展了Graphics)。但是,为了访问Graphics2D的方法,必须首先强制转换参数,即

Graphics2D g2d = (Graphics2D) g;

这是面向对象范式的一个基本方面。
请参阅@ArunSudhakaran对你的问题的评论

同样,如果你想让变量a访问B类的w成员,你需要强制转换a

A a = new B();
if (a instanceof B) {
B b = (B) a;
System.out.println(b.w);
}

如果你至少使用Java 14,你可以使用模式匹配的instanceof操作符

A a = new B();
if (a instanceof B b) {
System.out.println(b.w);
}

也可参考Josh Bloch的《Effective Java》。

最新更新