为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

手掌心 2023-07-28 15:14:25
我想知道是否可以在 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?
查看完整描述

3 回答

?
呼唤远方

TA贡献1856条经验 获得超11个赞

您可以在 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表达式来实现。


查看完整回答
反对 回复 2023-07-28
?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

更多的是附录,因为其他答案并不是 100% 完整:

您可以在 Java 中的匿名类中定义新方法或字段,但是当您将该匿名类定义分配给父类类型时,您将无法调用匿名类中定义的新方法或通过父类参考。

这是正确的,但从 Java 10 开始,我们有了关键字var

var cat = new Cat() { int legs = 4; ...

现在编译器知道:您不仅创建了该匿名内部类,而且现在编译器知道这是该内部cat类的实例。在此之前,您只能使用引用来表示内部类的实例。现在您可以使用知道这比普通猫“更多”的东西。因此,使用 java 10,您现在可以在该内部类之外执行操作!现在有一种方法来表示内部类实例,以跟踪其真实性质!CatvarSystem.out.println(cat.legs)

这实际上在现实世界中很有价值,例如:

Henri Tremblay 很好地使用了这个技巧,使用匿名内部类来模拟 Java 中元组的概念。


查看完整回答
反对 回复 2023-07-28
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

首先,您的代码未编译。要声明类,不应使用括号。


假设你的具体类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!


查看完整回答
反对 回复 2023-07-28
  • 3 回答
  • 0 关注
  • 131 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信