Java 为什么我不能在匿名内部类中创建新方法?

Java 为什么我不能在匿名内部类中创建新方法?,java,Java,如果我有以下课程: public class TestObject { public String Hooray() { return "Hooray!"; } } 很明显,我可以实例化这个对象,我知道必须进行某种子类化,因为我可以重写Hooray方法,但是如果有子类化,为什么我不能在匿名类中创建一个新方法呢 TestObject a = new TestObject() { public String Boo() { return "Booooo";

如果我有以下课程:

public class TestObject {
  public String Hooray() {
    return "Hooray!";
  }
}
很明显,我可以实例化这个对象,我知道必须进行某种子类化,因为我可以重写Hooray方法,但是如果有子类化,为什么我不能在匿名类中创建一个新方法呢

TestObject a = new TestObject() {
    public String Boo() {
        return "Booooo";
    }
};

System.out.println(a.Boo());

返回语法错误

,因为该类没有名称,所以不能在编译时引用其类型定义。编译器只能知道它是一个TestObject,它没有boo方法

您可以创建这个方法,boo方法没有任何问题,只是前面有一个大写字母。问题是在匿名类之外,Boo方法不可用,因为它没有作为类的API的一部分公开

这与任何实现接口的类都是一样的。。。如果类具有不属于接口的方法甚至公共方法,则需要将实例强制转换为特定类才能访问这些方法

不幸的是,由于这是一个匿名类,您无法将其转换为您不知道要将其转换为什么

这些内部方法仍然有用,但您必须从匿名类内部调用它们,而不是从外部调用它们。

public class TestObject {
  public String Hooray() {
    return "Hooray!";
  }
}

TestObject a = new TestObject() {
    public String Boo() {
        return "Booooo";
    }
}

System.out.println(a.Boo());
你不能这样做。您可以在匿名内部类中创建新方法,事实上,您是。但是您不能从外部调用a.Boo,因为a是一个TestObject,TestObject没有名为Boo的方法。这和你不能这么做的原因是一样的:

public class Base {
    public void something (); 
}

public class Derived extends Base {
    public void another ();
}

Base b = new Derived();
b.another(); // b is a Base, it must be cast to a Derived to call another().
在上面的示例中,必须将b强制转换为派生类才能调用添加到派生类中的新方法:

((Derived)b).another();
匿名内部类只是派生新子类的语法快捷方式,不能这样做的原因正是因为它们是匿名的——没有可用于强制转换它们的类型

顺便说一下,您无法通过类型库访问另一个类型的原因非常简单。虽然派生是一个基,但编译器无法知道基b是否持有派生,而不是其他没有其他方法的基子类


希望有帮助

你可以;只要在最后一个}后面加一个分号就行了。没有语法错误。错误通常会向您介绍他们自己,告诉您他们的名字和一些他们自己的情况。他们不是陌生人。啊,对不起。我从我的笔记本电脑上手动复制了这个,忘记了分号。我仍然得到类型TestObject的方法Boo是未定义的。这个错误是准确的。TestObject中没有方法Boo。在匿名内部类中有一个方法Boo。这很有意义。谢谢