java - 在 Java 中覆盖匿名类的方法
问题描述
在下面的示例中(在注释块中),我试图覆盖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
}
}
您不能这样做,因为无法将未命名的匿名类标识为基类。但是,您可以使用local classes来做到这一点,就像命名的匿名类一样,这听起来很矛盾:
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
也可以使用匿名类语法而不是本地类语法来完成。
推荐阅读
- python - 有没有更快的方法来循环在 python 中获取请求的页面?
- node.js - 使用 NodeJS 通行证进行 IONIC 身份验证的基本代码
- python - 在 macOS 上写入帧缓冲区
- laravel-5 - 在 laravel5.5 & vuejs2 项目中集成 Bootstrap4
- c# - .net core 2 - 违反唯一键约束
- c++ - 我似乎无法获得在两个 .cpp 文件中保持一致的值
- ios - 缺少 DSYM 来处理崩溃
- python - 摘要没有名为的列
- java - 更改 {if} statemets to try...catch
- javascript - firebase 规则允许新用户在第一次登录时创建其帐户对象