超类可以调用子类

时间:2015-04-18 11:41:23

标签: java

在我的印象中,超类不能在java中调用子类。但今天我写了这样的代码,这让我感到困惑......请帮助我!谢谢

package CW;

public class A extends B {
    int a =100;
    public A(){
        super();
        System.out.println(a);
        a=200;
    }
    public static void main(String[] args) {
        System.out.println(new A().a);
    }
}
class B{
    public B(){
        System.out.println(((A) this).a);

    }
}

Java是否有这样的语法?((A) this).a

超类可以调用子类。是否允许?

1 个答案:

答案 0 :(得分:2)

我认为你的主要困惑是由于在编译时没有发现某些转换错误,而是它们只能在运行时识别,这就是为什么在最好的时候铸造可能是棘手的,而在最坏的情况下则是完全危险的。仅仅因为代码编译并不意味着它是安全的。例如,如果你把它放在main方法中:

System.out.println(new B());

您的程序将编译但会崩溃。

此代码:

((A) this).a

将任何对象this表示为编译器作为A对象,并且允许,因为编译将允许向上转换和向下转换。它在运行时实际上可能是也可能不是A类型,但由于section 5.5 of the JLS中制定的强制转换规则,编译器将允许它:

  

给定编译时引用类型S(源)和编译时引用类型T(目标),如果由于以下规则而没有发生编译时错误,则从S到T存在转换转换。

     

如果S是班级类型:

     
      
  • 如果T是类类型,则为| S | &lt ;: | T |,或| T | <:| S |。否则,将发生编译时错误。
  •