在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
这种情况与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
吗?毕竟,编译器知道A
是SomeOtherClass
类型,但不知道它是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匿名内