以下程序使用名为 Anonymous
的内部类,它本身扩展了其封闭类 Main
。
package name;
public class Main
{
private final String name;
Main(String name)
{
this.name = name;
}
private String name()
{
return name;
}
private void reproduce()
{
new Anonymous().printName();
}
private class Anonymous extends Main
{
public Anonymous()
{
super("reproduce");
}
public void printName()
{
System.out.println(name());
}
}
public static void main(String[] args)
{
new Main("main").reproduce();
}
}
main() 方法中唯一的语句调用外部类 Main
的构造函数,提供一个字符串 main 然后是方法 reproduce()
正在被调用。
reproduce 方法
包含语句 new Anonymous().printName();
,它调用 上的
类对象。 printName()
方法>匿名super();
构造函数正在向其封闭的父类(super class) Main
提供一个新字符串 reproduce。
因此,printName
方法 System.out.println(name());
中的语句应该显示字符串 reproduce 而不是main 但它始终显示字符串 main。为什么会这样?
最佳答案
因为您已将 Main.name()
声明为 private
,所以它作为父类(super class)方法不可见。但是,它作为 Anonymous
的封闭类的方法是可见的,因此它在封闭对象上被调用。
因此,如果您将 Main.name()
声明为 public
或 protected
,您确实会看到 “reproduce”
。
或者,如果您将 Anonymous
声明为 static
,它将不再编译。
关于java - Java 中扭曲的内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8160230/