【发布时间】:2022-01-09 12:44:29
【问题描述】:
在 Java 中,如果嵌套类未声明为静态,则无法在静态上下文中访问它。这意味着内部类的实例只能通过外部类的实例来创建。例如:
class Prac{
class Inner{}
public static void main(){
Inner myObj = new Prac().new Inner();
}
}
对于我的 Java 调整大脑来说,这是有道理的。如果内部类不是静态的,则需要实例化外部类的实例。然而,在 c# 中,我可以将 Inner 非静态声明为嵌套类,并直接从 Main 方法中的静态上下文实例化它。
我读到 c# 嵌套类类似于 c++ 而不是 java,但我不熟悉内部类如何以任何其他方式工作。 c# 中嵌套类的底层机制是什么?
【问题讨论】:
-
你见过this吗?
-
理解嵌套 C# 类的一种方式是在命名空间内声明类的另一种(更复杂)方式。从使用(嵌套)类的代码的角度来看,
namespace Prac { public class Inner {} }和public class Prac { public class Inner {} }之间没有明显区别,因为这两次你都会使用new Prac.Inner()。因此,嵌套 C# 类唯一真正的特点是它们可以访问父类的类成员。 -
还有可见性:嵌套类可以声明为
private或protected或其他,这意味着只有包含类/派生类或程序集等可以访问它。我认为 C# 和 Java 都是如此。而在泛型方面,C# 嵌套类继承了外部的泛型类型 -
@GoodNightNerdPride 感谢您的参考。我检查了它,虽然有点困惑,但我知道它是如何工作的。在Java 中,将嵌套类指定为静态仅仅意味着这个内部类的实例可以从静态上下文中创建,即简单地通过其父类的类名。在 C# 中,将类设置为静态意味着它不能有任何对象实例。它只是保存静态数据。但是当它不是静态的时,这个嵌套类只是用来定义一些类的层次结构,但总是可以从包含的类内部静态实例化。如果我错了,请纠正我