Java调用子类和超类

时间:2015-09-28 18:57:38

标签: java

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.

我完全不知道调用子类及其方法的过程。

1 个答案:

答案 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类。