Leo*_*.A. 2 java anonymous-class
我想知道是否可以在JAVA中将属性添加到匿名类吗?maby是一个简单的问题,但是这里的窍门是,我在google上看到了一些这样做的代码,但是当我在Netbeans中尝试时却没有发生。
我以匿名的方式创建了该类的实例,但没有覆盖该方法,而是添加了other和一个变量,并且该实例很简单,在google中,其他帅哥使所有此类都即时生成了,我为什么不能呢?
public class Cat(){
public void sayMew(){}
}
Cat gato = new Cat{
@Override
public void sayMew(){System.out.println("mew");
};
gato.sayMew(); //This works fine.
//Some code over there do this and it didn't work for me:
Cat gato = new Cat(){
int legs = 4;
public void scratch(){System.out.println("scratch");
};
//Even I saw this king of instances be pointed by variables types :/ what
am I doing wrong?
Run Code Online (Sandbox Code Playgroud)
您可以在Java中的匿名类中定义新方法或字段,但是当您将该匿名类定义分配给父类类型时,将无法调用在匿名类中定义的新方法或通过以下方式访问新字段:父类参考。
当您执行以下操作时:
Cat gato = new Cat() {
int legs = 4;
public void scratch() {
System.out.println("scratch");
}
}
Run Code Online (Sandbox Code Playgroud)
您实际上是Cat使用匿名类扩展该类,然后在该匿名子类中定义新方法。现在,当您将子类实例分配给父类引用时,由于父类不了解新方法,因此无法通过父类引用来调用新方法。
要调用它,您需要立即调用它:
new Cat() {
int legs = 4;
public void scratch() {
System.out.println("scratch");
}
}.scratch();
Run Code Online (Sandbox Code Playgroud)
因此,您可以在匿名子类中定义新方法或字段,但不能通过父引用来调用它们,无论是在内部使用它们还是直接调用它们(如我所演示的)。
通常,匿名类将覆盖父类方法或实现接口内联。Java 8之前的功能接口可以通过匿名类实现,而Java 8之后的功能接口主要通过lambda表达式完成。