问题描述
在下面的示例中(在注释块中),我试图覆盖匿名类的 jump()
方法,但是出现编译错误。有人能帮我理解这里出了什么问题吗?
class Animal {
public void bark() {
System.out.println("Inside bark");
}
public void jump() {
System.out.println("Inside jump");
}
}
public class AnonymousClassExample001 {
public static void main(String[] args) {
Animal animal = new Animal() {
public void bark() {
System.out.println("Subclass bark");
}
}; /* {
public void jump() {
System.out.println("Subclass jump");
}
};*/
/**
* Question is: Why can't we override by extending an anonymous class
* as attempted (and commented) above?
* */
animal.bark(); // Subclass bark
animal.jump(); // Trying to print "Subclass jump",by overriding (the subclass of Animal) above
}
}
编辑:
这是我在 IDE 中遇到的编译错误 - ';' expected
。
从评论来看,似乎有些人没有得到我的问题。通过上面的例子,我想了解我们是否可以覆盖匿名类的方法?。
同样,主要动机是查看(并理解)为什么 Java 编译器允许通过启动 {}
块后跟 new Animal()
来创建匿名类,并且不允许进一步执行相同的行为(链接 {}
块以允许创建更多子类)
解决方法
不要结束并重新启动块,在一个块中覆盖这两种方法,就像在常规子类中一样:
class AnonymousClassExample001 {
public static void main(String[] args) {
Animal animal = new Animal() {
@Override
public void bark() {
System.out.println("Subclass bark");
}
@Override
public void jump() {
System.out.println("Subclass jump");
}
};
animal.bark(); // Subclass bark
animal.jump(); // Subclass jump
}
}
更新
问题的更新说明您正在尝试对匿名类进行子类化,例如你正在尝试这样做:
class AnonymousClassExample001 {
public static void main(String[] args) {
Animal barkingAnimal = new Animal() {
@Override
public void bark() {
System.out.println("Subclass bark");
}
};
Animal jumpingAnimal = <subclass barkingAnimal> { // Can't be done
@Override
public void jump() {
System.out.println("Subclass jump");
}
};
barkingAnimal.bark(); // Subclass bark
barkingAnimal.jump(); // Inside jump
jumpingAnimal.bark(); // Subclass bark
jumpingAnimal.jump(); // Subclass jump
}
}
你不能这样做,因为未命名匿名类不能被识别为基类。但是,您可以使用本地类来实现,这些类就像命名的匿名类,听起来很矛盾:
class AnonymousClassExample001 {
public static void main(String[] args) {
class BarkingAnimal extends Animal {
@Override
public void bark() {
System.out.println("Subclass bark");
}
};
class JumpingAnimal extends BarkingAnimal {
@Override
public void jump() {
System.out.println("Subclass jump");
}
};
Animal barkingAnimal = new BarkingAnimal();
Animal jumpingAnimal = new JumpingAnimal();
barkingAnimal.bark(); // Subclass bark
barkingAnimal.jump(); // Inside jump
jumpingAnimal.bark(); // Subclass bark
jumpingAnimal.jump(); // Subclass jump
}
}
或者,jumpingAnimal
也可以使用匿名类语法而不是本地类语法来完成。
我觉得应该是这样
public class AnonymousClassExample001 {
public static void main(String[] args) {
Animal animal = new Animal() {
public void bark() {
System.out.println("Subclass bark");
}
public void jump() {
System.out.println("Subclass jump");
}
};
/**
* Question is: Why can't we override by extending an anonymous class
* as attempted (and commented) above?
* */
animal.bark(); // Subclass bark
animal.jump(); // Trying to print "Subclass jump",by overriding (the subclass of Animal) above
}
}