Java中的嵌套虚拟类

时间:2017-05-22 05:10:34

标签: java polymorphism inner-classes

如果我们考虑以下代码,多态性应该发生,因为它在java中的嵌套类中是允许的,但是,当调用inner class构造函数polymorphism不适用时,new Innner1()适用到声明的实例类型 不是实际的类型。

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");
        }
    }
}

有些人可以帮助我理解这种行为。

伙计们我已经更新了代码并且编译正常并且没有类强制转换

请检查下面的输出。

I am In
I am In
I am In2

2 个答案:

答案 0 :(得分:2)

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

 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的实例,并将其分配给声明为obj的变量Outer。这将执行Outer2Outer默认构造函数。

第2步:

您创建了In。当两个内部类不会被调用In时,真正创建的行为会更好理解,但当obj被声明为Outer时,调用obj.new In(),由于obj的类型,将创建Outer > In

在这里,您将获得第一个输出:

I am In

第3步:

您再次创建Outer2的实例,并将其分配给声明为in2的变量Outer2! < - 这在这里非常重要。

这将执行Outer2Outer默认构造函数。

第4步:

您再次创建In。但现在,当in2被声明为Outer2时,由于in2.new In()的类型,调用in2将立即创建Outer2 > In

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

I am In
I am In2

答案 1 :(得分:-1)

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

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

        obj.new Innner1();

        Outer2 obj2 = (Outer2) obj;
        obj2.new Innner1();
    }

理想情况下,这不是一个有效的情况,因为首先应创建父类,然后创建子类,否则它将成为永无止境的层次结构。父母将拥有子对象,该对象将再次具有父对象。这就是当您执行当前代码时得到类似

的响应的原因

线程中的异常" main" java.lang.ClassCastException: Outer cannot be cast to Outer2     在Outer.main(Outer.java:14) 我在

理想情况下你应该

 public class Outer {

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

和outer2为

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

你在这里看到在子类'之前调用的父内部类的构造函数。