如果我们考虑以下代码,多态性应该发生,因为它在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
答案 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
。这将执行Outer2
和Outer
默认构造函数。
第2步:
您创建了In
。当两个内部类不会被调用In
时,真正创建的行为会更好理解,但当obj
被声明为Outer
时,调用obj.new In()
,由于obj
的类型,将创建Outer > In
。
在这里,您将获得第一个输出:
I am In
第3步:
您再次创建Outer2
的实例,并将其分配给声明为in2
的变量Outer2
! < - 这在这里非常重要。
这将执行Outer2
和Outer
默认构造函数。
第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
你在这里看到在子类'之前调用的父内部类的构造函数。