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

时间:2013-11-08 03:40:03

标签: java

如果我有以下课程:

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

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

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

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

返回语法错误

3 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分:1)

因为类没有名称,所以在编译时不能引用它的类型定义。编译器只能将它知道为TestObject,它没有boo()方法

答案 2 :(得分: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(),因为aTestObjectTestObject没有名为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来调用添加到派生类的新方法:

((Derived)b).another();

您无法使用匿名内部类(这只是用于派生新子类的语法快捷方式)的原因正是因为它们是匿名的 - 没有可用于将它们转换为的类型。

顺便说一下,当你想到它时,你无法通过类型another()访问Base的原因非常简单。虽然DerivedBase,但编译器无法知道Base b持有Derived而不是{em>的其他子类Base {1}} 没有拥有another()方法。

希望有所帮助。