2011-11-15 5 views
1

Le programme Java suivant calcule simplement l'aire d'un cercle. Il utilise le concept de classes internes disponibles en Java. L'une des classes internes (FirstInner) INHERITS il est nommé classe de fermeture externe et la SecondInner classe tire le FirstInner à son tour. Le programme fonctionne très bien. Il n'y a pas de problème du tout. Regardons le.Classes internes héritées de la classe englobante dans Java

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

maintenant dans le SecondInner classe, je suis qualifier c'est super classe qui est la classe FirstInner d'abord avec ce et encore avec extérieur comme Outer.this.super(r); qui ressemble simplement à tout super(r);.


L'utilisation de seulement super(r) plutôt que Outer.this.super(r); provoque une erreur de temps de compilation indiquant que « ne peut pas faire référence à ce constructeur avant supertype a été appelé ». Pourquoi est-ce vrai? Je veux dire pourquoi je dois utiliser Outer.this.super(r); plutôt que seulement super(r)?


Un point de plus quand je fais la FirstInner classe statique, les questions de programme pas d'erreur de compilation et permet d'utiliser simplement super(r) à la place de Outer.this.super(r);. Pourquoi?

+0

http://stackoverflow.com/questions/3383460/odd-situation-for-cannot-reference-this-before-supertype-constructor-has-been-c – Stefan

+0

L'appel à super (r) devrait fonctionner très bien . Cela appellera le constructeur de FirstInner. Pouvez-vous publier le code de non-fonctionnement? –

+0

Le code non-travail est seulement celui où l'instruction Outer.this.super (r); est remplacé juste par super (r) dans la classe SecondInner et cela ne fonctionne pas, provoquant une erreur de compilation comme indiqué ci-dessus dans la question elle-même. – Lion

Répondre

1

Veuillez voir l'exemple décrit ici.

15.11.2 Accessing Superclass Members using super

De l'Tut java

http://download.oracle.com/javase/tutorial/java/javaOO/nested.html

Une instance de classe interne ne peut exister que dans une instance de OuterClass et a un accès direct à des méthodes et des champs de son enfermant exemple.

En suivant cette affirmation, l'approche suivante est logique. Vous accédez à l'instance en utilisant "this" en résolvant à l'aide du nom de la classe, qui est défini ici dans les expressions primaires.

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

Par exemple, si votre SecondInner devait être déclarée dans les FirstInner il doit être accessible à l'aide FirstInner.this.super()

2

je reçois une autre erreur de mon environnement Eclipse:

« Aucune instance englobante de type externe est disponible en raison d'un constructeur intermédiaire »

Celui-ci est plus claire et peut être liée à la fait que vous ne pouvez pas instancier une classe interne non statique avant que la classe externe ait été instanciée.

Questions connexes