繁体   English   中英

从Java的封闭类继承的内部类

[英]Inner classes inherited from the enclosing class in Java

下面的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); 为什么?

我从Eclipse环境中得到了另一个错误:

“由于某些中间构造函数,无法使用类型为Outer的封闭实例”

这个更清晰,可以与以下事实联系在一起:在实例化外部类之前,您不能实例化非静态内部类。

请参阅此处描述的示例。

15.11.2使用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()访问它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM