内部类继承自Java中的封闭类

时间:2011-11-15 22:13:18

标签: java inner-classes

以下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.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 个答案:

答案 0 :(得分:2)

我从Eclipse环境中得到了一个不同的错误:

“由于某些中间构造函数,没有可用的Outer类型的实例”

这个更清楚,可以链接到这样一个事实:在实例化外部类之前,你无法实例化非静态内部类。

答案 1 :(得分:1)

请参阅此处描述的示例。

15.11.2 Accessing Superclass Members using super

来自java tut

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");
                }
            }
}

例如,如果要在FirstInner中声明您的SecondInner,则必须使用FirstInner.this.super()

来访问它。