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

标签 java anonymous-class

我想知道是否可以在 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?

最佳答案

您可以在 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();

因此,您可以在匿名子类中定义新方法或字段,但不能通过父引用调用它们,要么在内部使用它们,要么直接调用它们(如我演示的那样)。

通常匿名类会重写父类方法或内联实现接口(interface)。 Java 8之前的函数式接口(interface)可以通过匿名类来实现,Java 8之后大多通过lambda表达式来实现。

关于java - 是否可以向匿名类添加属性而不是仅覆盖其方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57932823/

相关文章:

java - 将文档从一个集合复制(如果存在则更新)到另一个集合

c# - 会为匿名变量调用 dispose 吗?

php - 如何在 PHP 中动态创建一个扩展抽象类的匿名类?

c# - 具有匿名类型和用户定义类型的 LINQ 选择查询

java - 如何从 WSDL 生成简单的 java 类?

java - 如何使用 Mapstruct 从具有对象列表和另一个对象的模型实体映射到单个域实体

java - android - 如何动态调整 SurfaceView 的大小?

java - 将多线程与 RMI 结合使用

c# - 如何创建匿名类以便将其传递给通用构造函数?

java - 在Java中使用匿名类返回值