Pourquoi les classes nestedes en Java diffèrent-elles des classes nestedes en C # dans l’aspect suivant?

J’ai trouvé quelques articles qui ressemblent à ceci, mais je n’ai pas trouvé de réponse qui l’explique de façon inconcevable. classe, et c’est le scénario que je suis tombé sur

En cas de C #:

class outside { public class inside { public void print() { System.Console.WriteLine("I am inside"); } } } class Program { public static void Main(ssortingng[] args) { /* here i am trying to instantiate the inner class 'inside' */ outside.inside obj = new outside.inside(); obj.print(); Console.ReadKey(); } } 

Sortie:

Je suis à l’intérieur Donc, ce qui précède fonctionne bien..Mais,
En cas de Java:

 class outside { public class inside { public void print() { System.out.println("I am inside"); } } } class Demo { public static void main(Ssortingng[] args) { /* here i am trying to instantiate the class 'inside' */ outside.inside obj=new outside.inside(); obj.print(); } } 

Sortie:

Demo.java:16: error: une instance englobante qui contient outside.inside est requirejse …

C’est la situation dans le cas de Java .. Quelle est cette erreur?

Cela signifie-t-il que la classe externe ‘outside’ ne peut pas accéder à la classe interne ‘inside’ à l’aide de l’opérateur point, car elle n’est pas statique? Si tel est le cas, pourquoi ne génère-t-il pas une erreur de compilation en c #?

Le problème est que, de la manière dont vous avez déclaré les classes en Java, la classe interne possède une référence implicite à une instance de la classe externe. D’où le message d’erreur suivant: “erreur: une instance englobante contenant outside.inside est requirejse”. Cela signifie que vous devez:

 Outside out = new Outside(); Outside.Inside in = out.new Inside(); 

En général, ce modèle est utilisé en Java dans des situations où il n’a aucun sens pour une instance de la classe interne d’exister sans une instance de la classe externe; et notez que l’instance de classe interne aura access à toutes les variables de l’instance de classe externe, même les variables privées. Mais en général, ces classes sont généralement private .

Pour que cela disparaisse, vous devez rendre la classe interne static . Et ensuite tu pourras faire:

 Outside.Inside in = new Outside.Inside(); 

Edit: complet sur ce que signifie static en Java: static variables static (variables, classes, méthodes) en Java sont accessibles au niveau classe et instance. Vous pouvez accéder à une variable statique à partir d’une méthode non statique par exemple (cela signifie également que vous pouvez appeler des méthodes statiques à partir d’une instance de classe!); mais une méthode statique NE PEUT PAS accéder à une variable non statique, ni invoquer une méthode “instance only”, etc.

En outre, une classe “de niveau supérieur” ne peut pas être static , car cela n’a aucun sens.

La syntaxe des classes nestedes en Java est légèrement différente de celle de C #. Voici une meilleure comparaison des deux. En consultant les traductions en C # des deux passages suivants du code Java, vous pouvez avoir une meilleure idée de ce que Java fait en coulisse. Pour une référence supplémentaire, voir ce lien .

Une classe nestede statique en Java fonctionne comme une classe nestede en C #.

Java:

 class Outside { public static class Inside { public void print() { System.out.println("I am inside"); } } } class Demo { public static void main(Ssortingng[] args) { Outside.Inside obj = new Outside.Inside(); obj.print(); } } 

C #:

 class Outside { public class Inside { public void Print() { System.Console.WriteLine("I am inside"); } } } class Program { public static void Main(ssortingng[] args) { Outside.Inside obj = new Outside.Inside(); obj.Print(); } } 

Une classe interne ( classe nestede non statique) en Java n’a pas de traduction syntaxique directe en C #, mais nous pouvons écrire l’équivalent explicite.

Java:

 class Outside { public class Inside { public void print() { System.out.println("I am inside"); } } } class Demo { public static void main(Ssortingng[] args) { Outside out = new Outside(); Outside.Inside obj = out.new Inside(); obj.print(); } } 

C #:

 class Outside { public class Inside { private Outside _outer; public Inside(Outside outer) { if (outer == null) throw new ArgumentNullException("outer"); _outer = outer; } public void Print() { System.Console.WriteLine("I am inside"); } } } class Program { public static void Main(ssortingng[] args) { Outside outside = new Outside(); Outside.Inside obj = new Outside.Inside(outside); obj.Print(); } } 

En java,

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

 OuterClass outerObject = new OuterClass(); OuterClass.InnerClass innerObject = outerObject.new InnerClass(); 

Pourquoi est-ce différent en C #? Parce que c’est une autre langue.