我有两个类,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》。