当2个课程被投入时会得到什么?是对象吗?

时间:2012-02-03 12:08:07

标签: java casting

我有3个班级A,B和c如下

A.java

class A
{
    protected A(){
        System.out.println("A");
    }
    void show()
    {
        System.out.println("showA");
    }
}

B.java

class B extends A
{
    B(){
        System.out.println("B");
    }
    void show()
    {
        System.out.println("showB");
    }
}

C.java

class C extends B
{
    C(){
        System.out.println("C");
    }
    void show()
    {
        System.out.println("showC");
    }
    public static void main(String... args)
    {
        A a= (B)new C();
        a.show();
    }
}

执行时给出输出

D:\java\rmi\Hello>javac C.java

D:\java\rmi\Hello>java C
A
B
C
showC

我知道一个超类不能被转换为子类。但是在输出中为什么在超类B被强制转换时执行C类方法(show)?

A a= (B)new C();

如果这是正确的那么它是什么才能被转移到B? 我的意思是这里新的C()将调用C构造函数,因此调用相应的输出 new C().show();(B)new C().show();之间有什么区别?

4 个答案:

答案 0 :(得分:1)

投射对象不会改变其类型。

(B) new C();

仍将创建C类型的对象,无论你将它投射到什么。但是,如果你只创建一个B,它当然只会是一个B,这就是为什么在你执行时没有调用C的构造函数的原因

(C) new B();

答案 1 :(得分:1)

错误“B不能在C.main转换为C”意味着超类B由C进行转换,这是一个子类。(只需反复阅读它,你就会理解它。)

您可以使用上部元素转换层次结构中的较低元素,但不能反之亦然。
希望你明白了:)

答案 2 :(得分:0)

B类不扩展C,所以它不知道它并且不能被转换为C.使用java,你可以向下投射而不是向上投射。

确定:

A a= (B)new C();

- > C继承自B,因此可以进行强制转换

不行

A a= (C)new B();

- > B不从C继承,因此无法转换为

另见:Downcasting in Java

编辑: 请考虑编辑您的问题,因为大多数用户倾向于首先更正错误。 (删除错误并将其分解为原始问题)

“new C()。show();和(B)new C()。show();”之间有什么区别?“ 这称为“多态”。两个调用之间没有区别,因为java总是执行层次结构最低级别的方法。

例如:

class Bird{
 public void fly(){
   System.out.println("I am flying");
}}

class Duck extends Bird{
 public void fly(){
   System.out.println("I can not fly");
}}

class Test{
 public static void main(String[] args){
  Bird[] birds = {new Bird(), new Duck()};
  for (Bird b: birds){
   b.fly();
  }
}

这将输出:

I am flying
I cannot fly

答案 3 :(得分:0)

创建类的对象时,首先创建其超类对象。 所以,当你说     A =(B)新的C(); 在创建C的对象时,首先创建其超类对象。因此C的对象可以转换为B. 但是在后一种情况下,在创建B的对象时,它是不可能的。

永远记住,子类对象可以被转换为超类,因为超类对象不能被转换为它的子类,这是由你在第二种情况下完成的,因此它会给你编译错误。