Java 为什么我的代码可以编译,但是第一部分和第二部分有运行时错误,而第三部分没有问题

Java 为什么我的代码可以编译,但是第一部分和第二部分有运行时错误,而第三部分没有问题,java,Java,我有7个具有继承关系的类 public class ClassA { public ClassA() { } public void printer(int x, String y) { System.out.println("Class A"); } } 我想问一下,为什么下面的代码能够编译,为什么I和ii会出现运行时错误,而iii是可以的。如果这是一个简单的问题,我很抱歉,但我已经为此绞尽脑汁好几个小时了。谢谢 //

我有7个具有继承关系的类

public class ClassA {

    public ClassA() {
    }

    public void printer(int x, String y)
    {
        System.out.println("Class A");
    }

}

我想问一下,为什么下面的代码能够编译,为什么I和ii会出现运行时错误,而iii是可以的。如果这是一个简单的问题,我很抱歉,但我已经为此绞尽脑汁好几个小时了。谢谢

// part i
ClassA a = new ClassC();
ClassG g = (ClassG)a;
g.printer("hello");

// part ii 
ClassA a = new ClassC();
ClassG g = (ClassG)a;
g.printer("hello", "there");

// part iii
ClassA a = new ClassF();;
ClassC f = (ClassC)a;
f.printer(88,"there");
编辑: 对于第一部分和第二部分,错误为:
线程“main”java.lang.ClassCastException中出现异常:无法将ClassC转换为ClassG。我的问题是关于多态性、向上投射和向下投射。我需要帮助来理解它。谢谢

请记住,继承定义了父类和子类之间的is-a关系。如果子类与父类有直接链接,则可以对其进行强制转换


在这种情况下,它不起作用
ClassG
是-a
ClassC
因为继承,但是不能保证a
ClassC
是-a
ClassG
那么,有什么错误???对不起,我已经把它作为代码了。没有错误,我想知道为什么我的代码能够编译,但是第一部分和第二部分有运行时错误,而第三部分是好的?我的问题是关于多态性、向上投射和向下投射。我需要帮助来理解它。运行时错误就是一个错误。如果你想问为什么会出现错误,你应该在你的问题中包括你遇到的错误(完整的堆栈跟踪)。
ClassG
不是
ClassC
的父类,所以你不能将
ClassC
实例转换成
ClassG
实例。我可以问一下为什么它一开始就编译了吗?
public  class ClassC  extends ClassA{

    public ClassC() {
    }

    public void printer(String x, String y)
    {
        System.out.println("Class C");
    }

}
public class ClassD  extends ClassC{

    public ClassD() {
    }
       public void printer(String a, String b)
    {
        System.out.println("Class D");
    }

}
public class ClassE extends ClassC{

    public ClassE() {
    }

    public void printer(String x)
    {
        System.out.println("Class E");
    }

}
public class ClassF extends ClassE{

    public ClassF() {
    }

       public void printer(int x)
    {
        System.out.println("Class F");
    }
}
public class ClassG  extends ClassE{

    public ClassG() {
    }

           public void printer(String x)
    {
        System.out.println("Class G");
    }

}
// part i
ClassA a = new ClassC();
ClassG g = (ClassG)a;
g.printer("hello");

// part ii 
ClassA a = new ClassC();
ClassG g = (ClassG)a;
g.printer("hello", "there");

// part iii
ClassA a = new ClassF();;
ClassC f = (ClassC)a;
f.printer(88,"there");