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

Sri*_*uku 4 c# java oop

我发现了几个类似于此的帖子,但是找不到一个能够解释这个问题的答案.我已经执行了一个类的嵌套,即类'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,因为它没有任何意义.