当前位置: 首页 > 知识库问答 >
问题:

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

雍焱
2023-03-14

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

共有1个答案

郎意
2023-03-14

这种情况与anonymous类有一个名称完全相同:

class SomeOtherClass {
    public void methodFromSuperClass() { }
}

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

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

    html" target="_blank">public void subClassMethod() {
        System.out.println("Sub class method");
    }    
}

你做到了:

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

您不同意不能在这里调用subclassmethod吗?毕竟,编译器知道ASomeOtherClass类型,但不知道它是SomeOtherClass的哪个子类。它并没有分析您的代码,从而看到您实际上为它分配了subclass的实例。

与匿名类的情况基本相同。只是这一次,子类在您的代码中没有名字,但它仍然是一个子类,“编译器没有分析您的代码”这一推理同样适用。

由于匿名子类没有名称,您不能像命名子类示例中那样执行subclass a=new subclass();之类的操作,但自从Java 10以来,您可以执行:

var a = new SomeOtherClass() { ... };

var允许编译器为您推断变量的类型,而无需您说出类型名称。编译器将把匿名子类推断为A的类型,这将允许您执行以下操作:

a.subClassMethod();

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

 类似资料:
  • 问题内容: 最近,我遇到了一个神秘的问题,在Android项目,我描述了这里。我以某种方式解决了问题,但仍然不知道其背后的确切原因。 假设我想在内部类中调用函数foo()。问题是,直接调用它有什么区别 或使用外部类实例对其进行调用 此外,如果有人能检查我与此相关的最后一个问题,并向我提供有关错误发生原因的线索,我将不胜感激。非常感谢。 PS:我在某处读到,非静态内部类将始终持有外部类的实例。因此,

  • 问题内容: 我已经看到了几个与Java中类似的示例,希望有人可以解释发生了什么。似乎可以内联定义一个新类,这对我来说真的很奇怪。 第一行是预期的输出行,因为它只是toString。但是第二似乎函数可以内联重写。 为此有技术术语吗? 还是任何更深入的文档? 如果我有以下代码: 代码输出: 问题答案: 它是一个匿名内部类。您可以在Java文档内部类链接中找到有关它的更多信息。 编辑 我正在添加一个更好

  • 问题内容: 请看下面的代码: 在上面的代码中,在方法ModifyList()中声明的匿名内部类的实例能够访问传递给该方法的参数。AFAIK Java为内部类创建一个单独的字节码文件。 谁能解释一下Java在字节码级别上如何处理这些局部变量绑定?我的意思是,Java如何精确跟踪对作为参数传递给该方法的对象的引用? 任何帮助将不胜感激! [抱歉我的英语不好! 如果您理解我的问题,请编辑这篇文章,并删除

  • 我的示例显示,我试图向匿名类添加一些额外的方法,通常我如何调用我创建的额外方法。

  • 本文向大家介绍Java中定义了几种类型的匿名内部类?,包括了Java中定义了几种类型的匿名内部类?的使用技巧和注意事项,需要的朋友参考一下 一个匿名内部类是声明一个内部类没有任何类名的。换句话说,一个无名的内部类称为匿名内部类。由于它没有名称,因此它不能具有构造函数, 因为我们知道构造函数名称与类名称相同。 我们可以定义一个匿名内部类,并一步一步使用new 运算符创建其对象。 语法 Java匿名内