0

如果我有以下课程:

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

我显然可以实例化该对象,并且我知道必须进行某种子类化,因为我可以覆盖 Hooray 方法,但是如果有子类化,为什么我不能在匿名类中创建一个新方法?

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

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

返回语法错误

4

3 回答 3

5

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

这与任何实现接口的类相同......如果该类具有不属于接口的方法(甚至是公共方法),那么您需要将实例强制转换为特定类才能访问这些方法。

不幸的是,因为这是一个匿名类,所以你不能强制转换它(你不知道把它强制转换成什么)。

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

于 2013-11-08T03:45:36.353 回答
1

因为这个类没有名字,你不能在编译时引用它的类型定义。编译器只能知道它是一个TestObject,它没有boo()方法

于 2013-11-08T03:45:26.003 回答
1

你有这个:

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

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

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

你不能这样做。您可以在匿名内部类中创建新方法,事实上,您可以。但是您将无法a.Boo()从外部调用,因为ais aTestObject并且TestObject没有方法 named 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为 aDerived来调用添加到派生类的新方法:

((Derived)b).another();

您不能使用匿名内部类(它们只是派生新子类的语法快捷方式)执行此操作的原因正是因为它们是匿名的 - 没有可供您将它们转换为的类型。

顺便说一句,您无法another()通过 type访问的原因Base很简单,当您考虑它时。虽然Derived是 a Base,但编译器无法知道它Base b持有 aDerived而不是其他Base一些没有方法的子类another()

希望有帮助。

于 2013-11-08T03:47:49.533 回答