2017-08-17 3 views
0

J'aimerais comprendre pourquoi l'instanciation suivant ne compilera pas:Java objet instanciation de la classe imbriquée - Quel est le problème avec ceci:

Superclass.Subclass myObject = new Superclass.Subclass(); 

Le message d'erreur lit:

No enclosing instance of type Superclass is accessible. Must qualify the allocation with an enclosing instance of type Superclass (e.g. x.new A() where x is an instance of Superclass). 

Qu'est-ce que l'on entend en entourant l'instance? Pourquoi est-ce nécessaire?

Il semble que ce message indiquant que la syntaxe doit être:

Superclass mySuperObj = new Superclass(); 
Superclass.Subclass mySubObj = mySuperObj.new Subclass(); 

MAIS il ne parvient pas à expliquer ce qui ne va pas avec ma méthode ou pourquoi cette syntaxe alternative doit être utilisée.

+0

Où est le code qui déclare Superclass et Sous-classe? Vous devriez poster un [mcve] - dans votre cas, vous devriez vous concentrer sur le C de ** Complete **. –

Répondre

2

L'idiome new [enclosing class].[enclosed class](...) est utilisé pour initialiser des classes imbriquées statiques, c'est-à-dire des classes imbriquées déclarées en tant que membre static de leur classe englobante.

L'idiome [enclosing class instance].new [enclosed class](...) est utilisé pour initialiser les classes internes, c'est-à-dire les classes imbriquées déclarées comme instance membre de leur classe englobante.

Exemples

avec ...

class A { 
    static class B {} 
    class C {} 
} 

Vous utiliserez:

  • new A.B()
  • new A().new C(), ou avec une instance donnée de A appelé a,
  • a.new C()

Remarque

+0

Merci Mena. Votre exemple illustre que des idiomes différents doivent être utilisés pour chaque scénario. Mais pourquoi DOIT-il y avoir deux idiomes différents? Pourquoi ne pouvons-nous pas utiliser le premier idiome pour les deux situations? Ce n'est pas clair pour moi. – IqbalHamid

+0

@IqbalHamid vous êtes les bienvenus. La syntaxe est une construction arbitraire. Bien que dans ce cas, il soit cohérent avec d'autres idiomes différenciant un membre statique d'un membre d'instance. Ce qui à son tour, vous avez besoin de Java, car ce sont des contextes très différents. – Mena

0

La syntaxe pour créer un objet de classe interne est

InnerClass innerObj = new OuterClass().new InnerClass(); 

NOT la

Superclass.Subclass myObject = new Superclass.Subclass(); 

Parce que: Une instance de InnerClass ne peut exister que dans une instance de OuterClass.

Pour instancier une classe interne, vous devez d'abord instancier la classe externe.Ensuite, créez l'objet interne dans l'objet externe avec cette syntaxe:

InnerClass innerObj = new OuterClass().new InnerClass(); 

Read Java Docs for more details

0

dans ce cas, vous ne parlez de sous classe mais classe interne à la place ....

donc, dans ce cas, pour créer une instance d'une classe interne, vous avez besoin d'une instance de la classe externe, vous pouvez donc:

public class Foo { 

    public static void main(String[] args) { 
     Foo myFooObject = new Foo(); 
     Foo.InnerClass myFooInnerClass = myFooObject.new InnerClass(); 
     System.out.println(myFooObject); 
     System.out.println(myFooInnerClass); 
    } 

    class InnerClass { 
     @Override 
     public String toString() { 
      return "Am inner class"; 
     } 
    } 
}