[英]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的封闭实例”
这个更清晰,可以与以下事实联系在一起:在实例化外部类之前,您不能实例化非静态内部类。
请参阅此处描述的示例。
来自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.