以下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);
。为什么呢?
答案 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()
来访问它。