Java 当铸造两个类时,会铸造什么?它是物体吗?

Java 当铸造两个类时,会铸造什么?它是物体吗?,java,casting,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()

我有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构造函数,从而调用相应的输出,但是
newc().show()之间的区别是什么
(B)新的C().show()此处要强制转换什么?

强制转换对象不会更改其类型

(B) new C();
仍将创建类型为
C
的对象,无论您将其强制转换为什么。但是如果你只创建了一个
B
,它当然只会是一个
B
,这就是为什么在执行时不会调用
C
的构造函数的原因

(C) new B();

类B不扩展C,因此它不了解C,不能转换为C。使用java,可以向下转换,但不能向上转换

确定:

A a= (B)new C();
->C继承自B,因此可以进行强制转换

不正常

A a= (C)new B();
->B不是从C继承的,因此不能将其强制转换为C

另见:

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

“新的C().show()和(B)新的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

创建类的对象时,首先创建其超类对象。 所以当你说 A=(B)新的C(); 在创建C的对象时,首先创建它的超类对象。所以C的对象可以被铸造成B。 但在后一种情况下,在创建B的对象时,这是不可能的

请始终记住,子类对象可以强制转换为超类,而超类对象不能强制转换为其子类,这是在第二种情况下由您完成的,因此它会给您带来编译错误。

错误“B不能在C.main强制转换为C”意味着超类B是由作为子类的C强制转换的。(只要再读一遍,你就会明白的。)

您可以在层次结构中使用较低的元素和较高的元素,但不能使用相反的元素。

希望您能理解:)

好的,但我的问题是关于show方法调用,而不是相应的构造函数。这两个调用是新的C().show();(B)新的C().show()完全相同,没有任何区别?它实际上不是关于
show()
,因为它从未被调用过。异常发生在调用
show
上方的行中。但是,
((B)new C()).show()和
new C().show()
确实是同一种方法。感谢您的解释,但我的问题是关于所有类中都存在的对show()的调用,而C的show是在A=(B)new C()的情况下执行的;。因此,新的C()和show()之间绝对没有区别;和(B)新的C()。show()?这两者之间的区别是,在第一种情况下,新的C()可以被赋予类A、B或C的任何引用,但在第二种情况下(B),新的C()可以被赋予类A或B的引用,但不能赋予C。感谢您的解释,但我的问题是关于所有类中都存在的对show()的调用,C的show是在A=(B)new C()的情况下执行的;。因此,新的C()和show()之间绝对没有区别;和(B)新的C()。show()?java总是采用最低级别的方法,在您的例子中是类“C”,即使是强制转换的。是的,C(),show();和(B)新的C().show();执行相同的方法。