我找到了一些类似的帖子,但找不到能清楚解释这一点的答案。 我已经执行了一个类的嵌套,即“内部”类存在于“外部”类中,并尝试实例化内部类,这就是我遇到的情况
对于 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: error: an enclosing instance that contains outside.inside is required...
这是 Java 的情况。这个错误是什么?
这是否意味着外部类“outside”不能使用点运算符访问内部类“inside”,因为它不是静态的?如果是这样,那么为什么同样不会在 C# 中生成编译错误?
最佳答案
问题在于您在 Java 中声明类的方式,内部类隐式引用了外部类的实例。因此出现错误消息:“错误:需要包含 outside.inside 的封闭实例”。这意味着您需要:
Outside out = new Outside();
Outside.Inside in = out.new Inside();
通常,这种模式在 Java 中用于没有外部类实例而存在内部类实例毫无意义的情况;并注意内部类实例将有权访问所有外部类实例的变量,甚至是私有(private)变量。但一般来说,这样的类一般都是private
。
为了让它消失,您必须使内部类static
。然后您将能够:
Outside.Inside in = new Outside.Inside();
编辑:完成 static
在 Java 中的含义: static
Java 中的任何内容(变量、类、方法)都可以在 和 实例级别。例如,您可以从非静态方法访问静态变量(这也意味着您可以从类的实例调用静态方法!);但是静态方法不能访问非静态变量,也不能调用“仅实例”方法等。
此外,“顶级”类不能是static
,因为它没有意义。
关于c# - 为什么java中的嵌套类与C#中的嵌套类在以下方面有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16986603/