假设以下Java代码
public class ParentClass{
private parentClass(){}
public class ChildClass {
public ChildClass(){}
}
}
我无法像这样实例化ChildClass
:
new ParentClass.ChildClass();
这只能通过在Java中创建ChildClass
static
来实现,而它可以在C#中完成而不会使其成为静态。
我的问题是,如果嵌套类是静态的,那么为什么它可以在Java中实例化,以及为什么在C#中不可能这样做。两种语言的静态定义是否不同?
我见过this stack post,但它没有回答我的问题。
答案 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#中,总是不允许实例化静态类,无论是否嵌套,都可以消除上述歧义。
然而,在我收到其他人的反馈意见以确定我是对的之前,我不会接受这个答案。