我们如何调用在 java 匿名 class 中覆盖的方法?
How can we call methods overridden in a java anonymous class?
考虑以下代码:
abstract class AbstractClass {
abstract m1();
}
public class Test {
public static void main(String [] args) {
AbstractClass obj = new AbstractClass() {
@Override void m1() {
System.out.print("Instance of abstract class !");
}
};
obj.m1();
}
}
下面是我对这段代码不理解的地方。
我读到匿名 class 创建了名称未知的 class,它扩展了提供引用的 class(这里是抽象的 AbstractClass)。
我还记得,如果对象引用了父对象 class,我们就不能实现子对象 class 的方法。
请参阅下面的代码块
Parent obj = new Child();
obj.methodOfParent();
obj.methodOfChild(); //this gives error
如果 Anonymous Class 扩展了它的 Parent Class 提供了引用,那么我的观点是,那么我们如何从 Anonymous Class?
调用 Parent Class 的覆盖方法
调用父类的重写方法和调用子类的方法是有区别的。如果方法在 class T
中声明,您可以在静态类型为 T
的变量上调用它,而不管该方法实际在何处实现。
在您的示例中,如果 obj.methodOfParent()
恰好是 Child
的方法覆盖,Child
中的方法将 运行,即使 obj
的静态类型是 Parent
.
相同的机制在匿名 classes 中发挥作用:允许您调用 obj.m1()
的原因是 m1()
已在父 class 中声明.
我猜你只漏掉了一点。让我举个例子:
class Parent {
public void methodOfParent() {}
public void methodOfParentToBeOverriden() {}
}
class Child extends Parent {
@Override public void methodOfParentToBeOverriden() {}
public void methodOfChild() {}
}
Parent obj = new Child();
obj.methodOfParent(); //this is OK
obj.methodOfParentToBeOverriden(); // this is OK too
obj.methodOfChild(); //this gives error
((Child)obj).methodOfChild(); //this is OK too here.
请注意,当您调用 obj.methodOfParentToBeOverriden()
时,它将调用子 class 的实现。独立你是否将此对象转换为Parent类型。
考虑以下代码:
abstract class AbstractClass {
abstract m1();
}
public class Test {
public static void main(String [] args) {
AbstractClass obj = new AbstractClass() {
@Override void m1() {
System.out.print("Instance of abstract class !");
}
};
obj.m1();
}
}
下面是我对这段代码不理解的地方。
我读到匿名 class 创建了名称未知的 class,它扩展了提供引用的 class(这里是抽象的 AbstractClass)。
我还记得,如果对象引用了父对象 class,我们就不能实现子对象 class 的方法。
请参阅下面的代码块
Parent obj = new Child();
obj.methodOfParent();
obj.methodOfChild(); //this gives error
如果 Anonymous Class 扩展了它的 Parent Class 提供了引用,那么我的观点是,那么我们如何从 Anonymous Class?
调用 Parent Class 的覆盖方法调用父类的重写方法和调用子类的方法是有区别的。如果方法在 class T
中声明,您可以在静态类型为 T
的变量上调用它,而不管该方法实际在何处实现。
在您的示例中,如果 obj.methodOfParent()
恰好是 Child
的方法覆盖,Child
中的方法将 运行,即使 obj
的静态类型是 Parent
.
相同的机制在匿名 classes 中发挥作用:允许您调用 obj.m1()
的原因是 m1()
已在父 class 中声明.
我猜你只漏掉了一点。让我举个例子:
class Parent {
public void methodOfParent() {}
public void methodOfParentToBeOverriden() {}
}
class Child extends Parent {
@Override public void methodOfParentToBeOverriden() {}
public void methodOfChild() {}
}
Parent obj = new Child();
obj.methodOfParent(); //this is OK
obj.methodOfParentToBeOverriden(); // this is OK too
obj.methodOfChild(); //this gives error
((Child)obj).methodOfChild(); //this is OK too here.
请注意,当您调用 obj.methodOfParentToBeOverriden()
时,它将调用子 class 的实现。独立你是否将此对象转换为Parent类型。