Внутренние классы, унаследованные от включающего класса в Java - PullRequest
1 голос
/ 16 ноября 2011

Следующая Java-программа просто вычисляет площадь круга. Он использует концепцию внутренних классов, доступных в Java. Один из внутренних классов (FirstInner) наследует охватывающий его класс с именем Outer , а класс SecondInner по очереди получает FirstInner . Программа работает просто отлично. Там нет никаких проблем вообще. Давайте посмотрим на это.

package innerclass;

import innerclass.Outer.SecondInner;   // Need to be inherited.
import java.util.Scanner;

class Outer
{
    protected double r;

    public Outer()
    {

    }

    public Outer(double r)
    {
        this.r=r;
    }

    public class FirstInner extends Outer
    {
        public FirstInner(double r)
        {
            super(r);
        }
    }

    final public class SecondInner extends FirstInner
    {
        public SecondInner(double r)
        {
            Outer.this.super(r);       //<-------------
        }

        public void showSum()
        {
            System.out.print("\nArea of circle = "+(Math.pow(r, 2)*Math.PI)+"\n\n");
        }
    }
}

final public class Main
{
    public static void main(String[] args)
    {
        Scanner s=new Scanner(System.in);
        System.out.print("\nEnter radius:->");
        double r=s.nextDouble();

        Outer o=new Outer();
        SecondInner secondInner = o.new SecondInner(r);
        secondInner.showSum();
    }
}

Теперь в классе SecondInner я квалифицирую его как суперкласс, который является FirstInner классом сначала с этим и снова с Outer как Outer.this.super(r);, который просто выглядит как super(r);.


Использование только super(r) вместо Outer.this.super(r); вызывает ошибку времени компиляции, указывающую, что " не может ссылаться на это, пока конструктор супертипа не был вызван ". Почему это так? Я имею в виду, почему я должен использовать Outer.this.super(r);, а не просто super(r)?


Еще один момент, когда я делаю класс FirstInner статическим, программа не выдает ошибку времени компиляции и позволяет использовать super(r) вместо Outer.this.super(r);. Почему?

Ответы [ 2 ]

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

Я получаю другую ошибку из моей среды Eclipse:

"Нет доступного экземпляра типа Outer, доступного из-за некоторого промежуточного конструктора"

Это более понятно и может быть связано стот факт, что вы не можете создать экземпляр нестатического внутреннего класса до того, как будет создан внешний класс.

1 голос
/ 16 ноября 2011

Пожалуйста, посмотрите пример, который описан здесь.

15.11.2 Доступ к членам суперкласса с использованием супер

Из явы тут

http://download.oracle.com/javase/tutorial/java/javaOO/nested.html

Экземпляр InnerClass может существовать только внутри экземпляра OuterClass и имеет прямой доступ к методам и полям своего включающий экземпляр.

Исходя из этого утверждения, следующий подход имеет смысл. Вы обращаетесь к экземпляру с помощью «this» путем разрешения с помощью имени класса, которое определено здесь в первичных выражениях.

http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#20860

class SecondInner extends FirstInner
        {

            public SecondInner(double r)
            {
                Outer.this.super(r);       //<-------------
            }

            public void showSum()
            {
                System.out.print("\nArea of circle = "
                  +(Math.pow(r, 2)*Math.PI)+"\n\n");
                }
            }
}

Например, если ваш SecondInner должен быть объявлен в FirstInner, к нему нужно обращаться с помощью FirstInner.this.super ()

...