Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将属性添加到匿名类,而只覆盖其方法?_Java_Anonymous Class - Fatal编程技术网

Java 是否可以将属性添加到匿名类,而只覆盖其方法?

Java 是否可以将属性添加到匿名类,而只覆盖其方法?,java,anonymous-class,Java,Anonymous Class,我想知道是否有可能在JAVA?中向一个注释性类添加属性,maby是一个简单的问题,但这里的诀窍是,我在google上看到一些代码正在这样做,但当我在Netbeans中尝试时,它没有发生 我以注释性的方式创建了一个类的实例,但是我没有重写这个方法,而是添加了other和一个变量,这个实例很简单,在google中,其他人都在动态创建这些类,我不知道为什么 public class Cat(){ public void sayMew(){} } Cat gato = new Cat{ @

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

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

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

假设您的具体类
Cat
如下所示

class Cat {
    void meow() {
        System.out.println("I'm a cat!");
    };
}
您可以像这样实例化anonymus类

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!

更多的是附录,因为另一个答案不是100%完整:


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

这是正确的,但自Java 10以来,我们有了
var
关键字:

var cat = new Cat() { int legs = 4; ...
现在编译器知道:不仅您创建了匿名内部类,而且现在编译器知道
cat
是该内部类的一个实例。在此之前,您只能使用
Cat
引用表示内部类的实例。现在,你可以使用一些知道这比普通猫“更多”的东西。因此,使用Java10和
var
您现在可以在该内部类的
外部执行
System.out.println(cat.legs)
!现在有一种方法可以表示跟踪其真实性质的内部类实例

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

Henri Tremblay使用匿名内部类很好地模拟了Java中元组的思想


如果可以对在第二个代码块中创建的对象调用
scratch()
方法,那么该对象实际上不是
Cat
类型吗?@MihirKekkar该对象将是
Cat
的子类,因此您可以使用Cat的API以及在匿名类上定义的方法。这非常有趣。我想我从你的回答中学到了一些新的东西。