java - Java 中扭曲的内部类

标签 java inner-classes

以下程序使用名为 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 的构造函数,提供一个字符串 ma​​in 然后是方法 reproduce() 正在被调用。


reproduce 方法 包含语句 new Anonymous().printName();,它调用 上的 printName() 方法>匿名 类对象。 super(); 构造函数正在向其封闭的父类(super class) Main 提供一个新字符串 reproduce


因此,printName 方法 System.out.println(name()); 中的语句应该显示字符串 reproduce 而不是ma​​in 但它始终显示字符串 ma​​in。为什么会这样?

最佳答案

因为您已将 Main.name() 声明为 private,所以它作为父类(super class)方法不可见。但是,它作为 Anonymous 的封闭类的方法是可见的,因此它在封闭对象上被调用。

因此,如果您将 Main.name() 声明为 publicprotected,您确实会看到 “reproduce”。 或者,如果您将 Anonymous 声明为 static,它将不再编译。

关于java - Java 中扭曲的内部类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8160230/

相关文章:

java - 从内部类对象获取外部类对象

flutter - 有没有办法在 dart 中实现内部类?

java - 为什么我需要提供封闭类对象而不是封闭类对象

java - JSP 变量不是变量

java - 使用正则表达式存储整个单词

java - 如何在 Java 中有效生成完美的数字到数字不变数?

java - 从另一个类调用 JFrame 的方法

java - CompletionStage 是否总是将异常包装在 CompletionException 中?

Kotlin 嵌套枚举类

java - 如何将比较器添加到内部类?