java - 当 2 个类被转换时,什么会被类型转换?是物体吗?

标签 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

我知道父类(super class)不能转换为子类。但是在输出中,为什么在转换为父类(super class) B 时它会执行 C 类方法 (show)?

A a= (B)new C();

如果这是正确的,那么被转换到 B 的是什么? 我的意思是这里 new C() 将调用 C 构造函数,从而调用相应的输出,但是 new C().show();(B)new C().show(); 之间有什么区别?这里转换了什么?

最佳答案

转换对象不会改变其类型。

(B) new C();

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

(C) new B();

关于java - 当 2 个类被转换时,什么会被类型转换?是物体吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9128439/

相关文章:

c++ - 从接口(interface)转换为实现接口(interface)的类的子类

java - 尝试使用生产者和消费者模式打印斐波那契数列

C# 泛型和转换

oracle - pl-sql 中的表转换与转换多重集

java - 注册成功后自动登录用户

c# - 为什么我可以将对象与这些对象的 IEnumerable 进行比较,而不是列表?

swift - 如何将 userInfo 通知中的对象强制转换为 Int?

扩展 java.nio.ByteBuffer 的 Java 循环字节缓冲区

java - 使用 Java 中的 Scanner 读取文件时出现 InputMismatchException

java - 项目没有正确构建?或者是我?