关于Java和C#中访问说明符的困惑

时间:2012-09-13 06:59:34

标签: c# java keyword access-specifier

我正在比较Java和C#中的访问修饰符。我想在Java中找到C#的protected internal的替代品。但我注意到protected修饰符在两种语言中都有所不同(C#Java)。 Java中的protected相当于C#的protected internal,因为该成员也可以在同一个包中访问。

我有两个问题

  • 为什么他们在Java和C#中为同一个修饰符创建了不同的含义?
  • 如何在Java中使用{{1>} C#( Access仅限于包含类或从包含类派生的类型。)?

2 个答案:

答案 0 :(得分:2)

  

为什么他们在Java和Java中为同一个修饰符创建了不同的含义   C#?

必须在简单性和精确指定不同访问权限的能力之间做出选择。 Java的创建者和(后来)C#的创建者做出了不同的选择。

  

如何保护C#(访问仅限于包含   在Java中使用派生类派生的类或类型吗?

你做不到。 Java在这一点上更受限制。

但你应该限制使用protected关键字,因为两者都使用它意味着打破了一般的封装原则。这种用法有时是有用的,因为过于严格的语言可能意味着太多无用的代码,但要注意不要制作太过束缚且难以改变和维护的东西。访问内部字段或方法以覆盖类通常意味着您有一个繁重的层次结构,实现耦合太多(为了可维护性,更喜欢组合层次结构)。

请注意,在没有任何访问控制修饰符的情况下声明的变量或方法可用于同一包中的任何其他类。在我看来,这比允许任何包的子类访问更加精明。

Here's the complete grid

enter image description here

答案 1 :(得分:0)

在Java API文档中,Sun.com不提供关键字访问说明符。试试这个例子

D:\>javac Demo.java
Demo.java:1: error: **modifier** private not allowed here
private class Test
        ^
1 error