Скрученный внутренний класс в Java - PullRequest
5 голосов
/ 17 ноября 2011

Следующая программа использует внутренний класс с именем 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 method содержит инструкцию new Anonymous().printName();, которая вызывает метод printName() для объекта класса Anonymous. Конструктор super(); предоставляет новую строку , воспроизводящую , в свой суперкласс Main.


Соответственно, оператор в методе printName System.out.println(name()); должен отображать строку Воспроизвести вместо main , но он всегда отображает строку main . Почему это так?

1 Ответ

16 голосов
/ 17 ноября 2011

Поскольку вы объявили Main.name() как private, поэтому он не отображается как метод суперкласса.Однако он виден как метод класса Anonymous, поэтому он вызывается для объекта.

Так что если вы объявите Main.name() как public или protected, выдействительно увидит "reproduce".Кроме того, если вы объявите Anonymous как static, он больше не будет компилироваться.

...