public class prelim {
public static void main(String[] args) {
A a = new A();
System.out.println(a.x);
System.out.println(a.m());
B b = new B();
System.out.println(b.x);
System.out.println(b.m());
a = new B();
System.out.println(a.x);
System.out.println(a.m());
b = (B)a;
System.out.println(b.x);
System.out.println(b.m());
}
}
class A {
int x;
A() {
this(1);
}
A(int x) {
this.x = x;
}
int m() {
return x;
}
}
class B extends A {
int x;
B() {
this(2);
}
B(int x) {
super(x+1);
this.x = super.x + 1;
}
int m() {
return x;
}
}
a = new B();和b =(B)a; a和b的类型是什么,因为它没有被声明。输出是3 4 4 4.我认为a是类型B.所以a.x和a.m()应该是4 4.
我完全不知道调用子类及其方法的过程。
答案 0 :(得分:0)
变量“a”具有类型A,它是声明的类型。变量的类型永远不会改变。 Java中的变量是引用。类型A的变量可以指向类型A的对象或其子类之一(或 null )。
同样,变量“b”具有类型B.它只能指向类型B的对象或 null ,因为B没有子类。
正确的打印输出(为简洁起见,删除换行符)是:
1 1 4 4 3 4 4 4
四个打印输出的对象类型是
A B B B
在第三个打印输出中,a.x访问A类的“x”变量,该变量存在,即使该对象具有B类。