为什么嵌套的静态类可以在Java中实例化,而不是在C#中实例化。静态的定义是否不同?

时间:2016-09-26 11:30:32

标签: java c#

假设以下Java代码

public class ParentClass{
    private parentClass(){}
    public class ChildClass {
        public ChildClass(){}
    }
}

我无法像这样实例化ChildClass

new ParentClass.ChildClass();

这只能通过在Java中创建ChildClass static来实现,而它可以在C#中完成而不会使其成为静态。

我的问题是,如果嵌套类是静态的,那么为什么它可以在Java中实例化,以及为什么在C#中不可能这样做。两种语言的静态定义是否不同?

我见过this stack post,但它没有回答我的问题。

2 个答案:

答案 0 :(得分:1)

听起来像是一个简单的句法差异。

Java方法非常明确:您使用ParentClass访问ParentClass.ChildClass的静态内容,然后使用new - new ParentClass.ChildClass();对其进行实例化。这意味着内部类必须被定义为静态,尽管它的构造函数具有常规访问权。

到目前为止,我还不知道您描述的C#差异。我不太使用C#,因此,不能真正提倡这种方法。

答案 1 :(得分:0)

我终于发现问题是语法差异,正如@Jon Skeet评论的那样。

不同之处在于嵌套类的var result = from c in dbo.Colors join uc in dbo.UserColor on (uc.ColorID = c.ColorID and uc.UserID = 1) into UserColor from q in UserColor.DefaultIfEmpty() join u in dbo.Users on q.UserID equals u.UserID into Users from l in Users.DefaultIfEmpty() select new { ColorID = c.ColorID, ColorName = c.ColorName, IsSelected = uc.ColorID == null ? 0 : 1 }; 修饰符(上例中的static)表示Java中的静态成员,并且与一般静态类的含义不同,后者不能实例化。

因此,Java中的static修饰符不一定会阻止实例化它修改的类:对于嵌套的静态类,它允许实例化,否则不允许。 但是,在c#中,总是不允许实例化静态类,无论是否嵌套,都可以消除上述歧义。

然而,在我收到其他人的反馈意见以确定我是对的之前,我不会接受这个答案。