无法在java中的匿名内部类中定义额外的方法

rlcwz9us  于 2021-07-12  发布在  Java
关注(0)|答案(2)|浏览(370)

Anonymous Inner Class 代码编译得很好,没有任何问题,但如果我试图调用额外的方法,它会抛出一个错误。那么,只有 override 使用 anonymous inner class ? 如果是这样,谁能解释一下原因吗?
我的代码是这样的

class SomeClass {

    public static void main(String[] args) {
        SomeOtherClass a = new SomeOtherClass() {

            @Override 
            public void methodFromSuperClass() {

                System.out.println("Method from super class!");
            }

            public void subClassMethod() {
                System.out.println("Sub class method");
            }

        };

        a.methodFromSuperClass(); //This works fine

        a.subClassMethod(); // But calling this extra method throws an error

    }
}

这就是我犯的错误

SomeClass.java:20: error: cannot find symbol
      a.subClassMethod();
      ^
      symbol:   method subClassMethod()
      location: variable a of type SomeOtherClass
    1 error
svmlkihl

svmlkihl1#

这种情况与匿名类的名称完全相同:

class SomeOtherClass {
    public void methodFromSuperClass() { }
}

class Subclass extends SomeOtherClass {
    @Override 
    public void methodFromSuperClass() {

        System.out.println("Method from super class!");
    }

    public void subClassMethod() {
        System.out.println("Sub class method");
    }    
}

你做到了:

SomeOtherClass a = new Subclass();
a.subClassMethod();

你不同意你不能打电话吗 subClassMethod 在这里?毕竟,编译器知道这一点 a 属于类型 SomeOtherClass ,但不是 SomeOtherClass 它是。它不会在很久以前分析您的代码来查看您实际分配的示例 Subclass 去吧。
匿名类的情况基本相同。只是这一次,子类在你的代码中没有名字,但它仍然是一个子类,同样的推理“编译器不会在很久以前分析你的代码”。
由于匿名子类没有名称,因此不能执行以下操作 Subclass a = new Subclass(); 与命名子类示例一样,但由于java 10,您可以执行以下操作:

var a = new SomeOtherClass() { ... };
``` `var` 允许编译器为您推断变量的类型,而无需您说出类型名称。编译器将推断匿名子类作为 `a` ,这将允许您执行以下操作:

a.subClassMethod();

最后,完全允许在匿名类中声明额外的成员—只是很难从匿名类或本地范围之外的任何地方访问它们,因为匿名类没有名称。声明额外的成员有时仍然有用,因为您可以在重写的方法中访问它们。
l2osamch

l2osamch2#

你的假设是正确的。这样调用unoverrided方法是不可能的。考虑一个例子,在这个例子中,您声明了一个接口并用一个具体的类示例化了它,那么您仍然只能访问接口中定义的方法,而不能访问类中定义的方法。

public interface MyInterface{
  public void someMethod();
}
public class MyImpl implements MyInterface{
  //someMethod() implementation
  // ...
  // newMethod()
  public void newMethod(){
    //some implementation
  }
}
public class Main{
  public static void main(String[] args){
    MyInterface inter = new MyImpl();
    inter.someMethod(); // this call is ok
    inter.newMethod();  // this call leads to a Symbol not found Exception, 
                        // because MyInterface has no method named newMethod...
  }
}

希望现在更清楚这是什么意思

相关问题