我发现了几个类似于此的帖子,但是找不到一个能够解释这个问题的答案.我已经执行了一个类的嵌套,即类'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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
我在里面所以,上面的工作正常.但是,
在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();
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
Demo.java:16:错误:需要包含outside.inside的封闭实例...
这是Java的情况..这个错误是什么?
这是否意味着外部类'outside'不能使用点运算符访问内部类'inside',因为它不是静态的?如果是这样,为什么同样不会在c#中生成编译错误?
fge*_*fge 10
问题是你在Java中声明类的方式,内部类有一个对外部类的实例的隐式引用.因此错误消息:"错误:需要包含outside.inside的封闭实例".这意味着你需要:
Outside out = new Outside();
Outside.Inside in = out.new Inside();
Run Code Online (Sandbox Code Playgroud)
一般来说,这种模式在Java中使用,在这种情况下,如果没有外部类的实例,内部类的实例就没有意义; 并注意内部类实例可以访问所有外部类实例的变量,甚至是私有变量.但总的来说,这类通常是private.
为了使它消失,你必须创建内部类static.然后你就可以做到:
Outside.Inside in = new Outside.Inside();
Run Code Online (Sandbox Code Playgroud)
编辑:完全static用Java表示:Java中的staticwhatevers(变量,类,方法)可以在类和实例级别访问.例如,您可以从非静态方法访问静态变量(这也意味着您可以从类的实例调用静态方法!); 但静态方法不能访问非静态变量,也不能调用"仅实例"方法等.
此外,"顶级"课程不可能static,因为它没有任何意义.