Следующая 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);
. Почему?