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

标签 c# java oop

我找到了一些类似的帖子,但找不到能清楚解释这一点的答案。 我已经执行了一个类的嵌套,即“内部”类存在于“外部”类中,并尝试实例化内部类,这就是我遇到的情况

对于 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/

相关文章:

c# - 网络服务中的其他方法未显示

c# - 在类型“ResourceDictionary”中找不到可连接属性“MergedDictionaries”

java - 是否有任何不是特定于 IDE 的 Java swing GUI 应用程序构建工具?

java - java中如何找到真正保存该元素的类

c++ - 在 C++ 中调度异常

c# - 仅显示日期部分

c# - 将 Javascript 用于 WPF 中的 Google map API

java - 是否可以使用 Java PreparedStatement 和 MySQL 存储例程进行 SQL 注入(inject)

java - 查找 Apache Storm 中运行的拓扑 jar 版本

c++ - 我如何能够访问类的私有(private)数据成员?