猿问

是否可以向匿名类添加属性而不是仅覆盖其方法?

我想知道是否可以在 JAVA 中向匿名类添加属性?,maby 是一个简单的问题,但这里的技巧是我在 google 上看到一些代码正在这样做,但当我在 Netbeans 中尝试时,它没有发生。


我以匿名方式创建了该类的一个实例,但我没有覆盖该方法,而是添加了其他方法和一个变量,并且该实例很简单,在谷歌中,其他人动态地创建了该类,我不明白为什么?


 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?


手掌心
浏览 132回答 3
3回答

呼唤远方

您可以在 Java 中的匿名类中定义新方法或字段,但是当您将该匿名类定义分配给父类类型时,您将无法调用匿名类中定义的新方法或通过父类参考。当你做这样的事情时:Cat gato = new Cat() {    int legs = 4;    public void scratch() {         System.out.println("scratch");    }}您实际上是Cat用匿名类扩展该类,然后在该匿名子类中定义新方法。现在,当您将子类实例分配给父类引用时,无法通过父类引用调用新方法,因为父类不知道它们。要调用它,您需要立即调用它:new Cat() {    int legs = 4;    public void scratch() {         System.out.println("scratch");    }}.scratch();因此,您可以在匿名子类中定义新方法或字段,但不能通过父引用调用它们,要么在内部使用它们,要么直接调用它们(如我演示的那样)。通常,匿名类会重写父类方法或内联实现接口。Java 8之前的函数式接口可以通过匿名类来实现,Java 8之后主要通过lambda表达式来实现。

米琪卡哇伊

更多的是附录,因为其他答案并不是 100% 完整:您可以在 Java 中的匿名类中定义新方法或字段,但是当您将该匿名类定义分配给父类类型时,您将无法调用匿名类中定义的新方法或通过父类参考。这是正确的,但从 Java 10 开始,我们有了关键字var:var cat = new Cat() { int legs = 4; ...现在编译器知道:您不仅创建了该匿名内部类,而且现在编译器知道这是该内部cat类的实例。在此之前,您只能使用引用来表示内部类的实例。现在您可以使用知道这比普通猫“更多”的东西。因此,使用 java 10,您现在可以在该内部类之外执行操作!现在有一种方法来表示内部类实例,以跟踪其真实性质!CatvarSystem.out.println(cat.legs)这实际上在现实世界中很有价值,例如:Henri Tremblay 很好地使用了这个技巧,使用匿名内部类来模拟 Java 中元组的概念。

素胚勾勒不出你

首先,您的代码未编译。要声明类,不应使用括号。假设你的具体类Cat是这样的。class Cat {    void meow() {        System.out.println("I'm a cat!");    };}你可以像这样实例化匿名类Cat cat = new Cat() {    int lives = 9;    @Override    void meow() {        super.meow();        System.out.printf("And I have %s lives!", lives);    }};cat.meow();//prints:   //I'm a cat!//And I have 9 lives!
随时随地看视频慕课网APP

相关分类

Java
我要回答