Java中的嵌套虚拟类 如果考虑下面的代码,多态性应该在java中的嵌套类中发生,但是,当调用内部类< /COD>构造函数多态> 不适用,即新的InNel1()/Cuff>应用于实例的声明类型。 不是在实际类型上 public class Outer { public class In { public In() { System.out.println("I am In"); } } public static void main(String[] args) { Outer obj = new Outer2(); obj.new In(); Outer2 in2 = (Outer2) obj; in2.new In(); } } class Outer2 extends Outer { public class In extends Outer.In { public In() { System.out.println("I am In2"); } } }

Java中的嵌套虚拟类 如果考虑下面的代码,多态性应该在java中的嵌套类中发生,但是,当调用内部类< /COD>构造函数多态> 不适用,即新的InNel1()/Cuff>应用于实例的声明类型。 不是在实际类型上 public class Outer { public class In { public In() { System.out.println("I am In"); } } public static void main(String[] args) { Outer obj = new Outer2(); obj.new In(); Outer2 in2 = (Outer2) obj; in2.new In(); } } class Outer2 extends Outer { public class In extends Outer.In { public In() { System.out.println("I am In2"); } } },java,polymorphism,inner-classes,Java,Polymorphism,Inner Classes,有人能帮我理解这种行为吗 伙计们,我已经更新了代码,它编译得很好,没有类强制转换异常 请检查下面的输出 I am In I am In I am In2 根据您的代码,您正在尝试在父类中创建子类的对象 public static void main(String[] args) { Outer obj = new Outer(); obj.new Innner1(); Outer2 obj2 = (Outer2) obj; o

有人能帮我理解这种行为吗

伙计们,我已经更新了代码,它编译得很好,没有类强制转换异常

请检查下面的输出

I am In
I am In
I am In2

根据您的代码,您正在尝试在父类中创建子类的对象

public static void main(String[] args) {
        Outer obj = new Outer();

        obj.new Innner1();

        Outer2 obj2 = (Outer2) obj;
        obj2.new Innner1();
    }
理想情况下,这是无效的,因为首先应该创建父类,然后创建子类,否则它将成为一个永无止境的层次结构。父对象将具有子对象,该子对象也将具有父关系及其子对象。这就是为什么当您执行当前代码时会得到如下响应

线程“main”
java.lang.ClassCastException中的异常:外部无法强制转换为外部2
at Outer.main(Outer.java:14) 我在

理想情况下,你应该

 public class Outer {

    public class Innner1 {
        public Innner1() {
            System.out.println("I am In");
        }
    }
}
外面是

class Outer2 extends Outer {
    public class Innner1 extends Outer.Innner1 {
        public Innner1() {
            System.out.println("I am In2");
        }
    }

    public static void main(String[] args) {
        Outer obj = new Outer();

        obj.new Innner1();

        Outer2 obj2 = new Outer2();
        obj2.new Innner1();
    }
}
在这种情况下,结果将是

I am In
I am In
I am In2

在这里,您可以看到在“子类”之前调用的父类内部类的构造函数

这里发生了什么,为什么会产生这种特殊输出:

 public static void main(String[] args) {
    Outer obj = new Outer2();  // Step 1
    obj.new In();              // Step 2
    Outer2 in2 = (Outer2) obj; // Step 3
    in2.new In();              // Step 4
 }
步骤1:

创建
Outer2
的实例,并将其分配给声明为
Outer
的变量
obj
。这将执行
Outer2
Outer
默认构造函数

步骤2:

您可以在中创建一个
。当两个内部类都不会在
中调用
,但当
obj
被声明为
Outer
时,由于类型为
obj
,调用
obj.new In()
将在
中创建一个
Outer>

这是您的第一个输出:

I am In
步骤3:

再次创建
Outer2
的实例,并将其分配给声明为
Outer2
的in2
变量
!!现在进入

现在,您可以获得第二个和第三个输出:

I am In
I am In2

UH您不能将
Outer
强制转换为
Outer2
obj
Outer
的一个实例,但不是
Outer2
的一个实例。代码正在编译,并且在那里……编译器不会告诉您
(Outer2)obj
实际上不工作,也不会检查它。它只会在
运行时引起
ClassCastException
,因为您的工作是对类型执行有效的和已检查的强制转换(例如使用
instanceof
),您希望得到什么输出?由于代码现在在类型转换方面是正确的,我想说,至少对我来说,一切都按照预期进行。正如我在问题中提到的,没有多态性。。