为什么java中的嵌套类与C#中的嵌套类在以下方面不同?

我发现了几个类似这样的post,但是找不到一个能够解释这个问题的答案。我已经执行了一个类的嵌套,即类’inside’出现在类’outside’中并试图实例化内部类,这是我遇到的情景

在C#的情况下:

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

输出:

我在里面所以,上面的工作正常。但是,
在Java的情况下:

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

输出:

Demo.java:16:错误:需要包含outside.inside的封闭实例…

这是Java的情况..这个错误是什么?

这是否意味着外部类’outside’不能使用点运算符访问内部类’inside’,因为它不是静态的? 如果是这样,为什么同样不会在c#中生成编译错误?

问题在于您在Java中声明类的方式,内部类具有对外部类的实例的隐式引用。 因此错误消息:“错误:需要包含outside.inside的封闭实例”。 这意味着你需要:

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

通常,这种模式在Java中使用,在这种情况下,如果没有外部类的实例,内部类的实例就没有意义; 并注意内部类实例可以访问所有外部类实例的变量,甚至是私有变量。 但总的来说,这类课程通常是private

为了使它消失,你必须使内部类static 。 然后你就可以做到:

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

编辑:完全了解Java中的static含义:Java中的static whatevers(变量,类,方法)可以在类实例级别访问。 例如,您可以从非静态方法访问静态变量(这也意味着您可以从类的实例调用静态方法!); 但静态方法不能访问非静态变量,也不能调用“仅实例”方法等。

而且,“顶级”类不能是static ,因为它没有任何意义。

Java中嵌套类的语法与C#略有不同。 这是两者的更好比较。 通过查看以下两段Java代码的C#转换,您可以更好地了解Java在幕后所做的工作。 有关其他参考, 请参阅此链接 。

Java中的静态嵌套类就像C#中的嵌套类一样。

Java的:

 class Outside { public static class Inside { public void print() { System.out.println("I am inside"); } } } class Demo { public static void main(String[] 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(string[] args) { Outside.Inside obj = new Outside.Inside(); obj.Print(); } } 

Java中的内部类 (非静态嵌套类)在C#中没有直接的语法转换,但我们可以编写显式的等价物。

Java的:

 class Outside { public class Inside { public void print() { System.out.println("I am inside"); } } } class Demo { public static void main(String[] 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(string[] args) { Outside outside = new Outside(); Outside.Inside obj = new Outside.Inside(outside); obj.Print(); } } 

在java中,

要实例化内部类,必须首先实例化外部类。 然后,使用以下语法在外部对象中创建内部对象:

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

为什么在C#中有所不同? 因为它是另一种语言。