`
sangei
  • 浏览: 337313 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

(转)Java和C#默认访问修饰符

阅读更多
 

这个要看类的位置,

如果类,结构,代理,枚举是外置的,那修饰符只有:public 和 internal,默认是internal。
至于private和protected是用来修饰类的成员。
在外置class前面加private,protected根本不会通过编译,不信你试试?

如果是内置的,就是作为另一个类型的成员,也称内部类型(inner type),这样的话,修饰符可以是全部可用修饰符,默认是private。

举例:
class a {} 类a是internal

class b
{
class a {} 类a是private
}

C#中:
针对下面几种类型内部成员的访问修饰符:
enum的默认访问修饰符:public。
class的默认为private。
interface默认为public。
struct默认为private。
其中:
public可以被任意存取;
protected只可以被本类和其继承子类存取;
internal只可以被本组合体(Assembly)内所有的类存取,组合体是C#语言中类被组合后的逻辑单位和物理单位,其编译后的文件扩展名往往是 “.DLL”或“.EXE”。
protected internal唯一的一种组合限制修饰符,它只可以被本组合体内所有的类和这些类的继承子类所存取。
private只可以被本类所存取。
看:
c# 的访问修饰符是private 还是 internal?
准确的说,不能一概而论。
[MSDN]
Classes and structs that are not nested within other classes or structs can be either public or internal. A type deleted as public is accessible by any other type. A type deleted as internal is only accessible by types within the same assembly. Classes and structs are deleted as internal by default unless the keyword public is added to the class definition, as in the previous example. Class or struct definitions can add the internal keyword to make their access level explicit. Access modifiers do not affect the class or struct itself — it always has access to itself and all of its own members.
类(class)或结构(struct)如果不是在其它类或结构中的话,它的访问类型要不就是internal, 要不就是public;
换句话说,如果它在其它类或结构中的话,则可以为private 或protected等。下面我说的类和结构,如无特殊说明,均指非"类中类"
类或结构的默认访问类型是internal.
类中所有的成员,默认均为private。
[MSDN]
Interfaces, like classes, can be deleted as public or internal types. Unlike classes, interfaces default to internal access. Interface members are always public, and no access modifiers can be applied.
Namespaces and enumeration members are always public, and no access modifiers can be applied.
Delegates have internal access by default.
Any types deleted within a namespace or at the top level of a compilation unit (for example, not within a namespace, class, or struct) are internal by default, but can be made public.
接口默认访问符是internal
接口的成员默认访问修饰符是public,也不可能是其他访问修饰符
命名空间,枚举类型成员默认public,也不可能是其他访问修饰符
委托,默认internal
在命名空间内部或编译单元顶部的所有类型,默认是internal,可以人为改为public。


java

1、Class类的访问权限:

默认:默认可以称为friendly但是,java语言中是没有friendly这 个修饰符的,这样称呼应该是来源于c++。默认的访问权限是包级访问权限。
即如果写了一个类没有写访问权限修饰符,那么就是默认的访问权限,同一个包下的类都可以访问到,即使可以实例化该类 (当然如果这个类不具有实例化的能力除外,比如该类没有提供public的构造函数)。

public:可以供所有的类访问。
说明:
1)、每个编译单元(类文件)都仅能有一个public class 。
2)、public class的名称(包含大小写)必须和其类文件同名。
3)、一个类文件(*.java)中可以不存在public class。
这种形式的存在的场景:如果我们在某个包内撰写一个class,仅仅是为了配合同包内的其他类工作。
4)、class不可以是private和protected。
5)、如果不希望那个任何产生某个class的对象,可以将该类得所有构造函数设置成private。但是即使这样也可以生成该类的对象,就是class的 static的成员(属性和方法)可以办到。

2、类成员变量的访问权限:
public:紧接public的属性任何类都可以访问到。但是从类的封装性上来考 虑将一个类的属性定义成public一般很少使用, 在定义静态常量的时候通畅会这样定义。如:public static final int PAGE_SIZE=10;
private:只有类本身内部的方法可以访问类的private属性,当然内部类也可以访问其外部类的private成员的。(属性和方法)
默认(friendly):包级可见,同一个包内的类可以访问到这个属性但 是从类的封装性特性来说很少这样使用类的属性的。
protected:关键字所处理的是所谓“继承”的观念。对于同一包的其他类,protected=默认,对于不同包的类,如果存在继承关系, 而baseClass存在protected属性,则可以被其自继承,而不同包的其他类
则不能访问类的protected属性。

3、类的成员方法的访问权限:
其从语法角度来讲,这些访问权限控制符作用于类的方法和作用于类的属性上的效果是一样的。
public:所有类可见。
pirvate:只有同一类内部的方法可见,在有就是内部类也可以访问到。
默认(friendly):包内可见。
protected:继承可见。

访问权限存在的理由
1)、“让使用者无法碰触到他们不该碰触的东西。”这些东西仅供类的内部机制使用。将某些成员声明成private,对于使用者来说可以说是一种服 务,
因为这样使用者可以知道哪些是他关注的哪些是不重要的,不需要关注,如此历来对于使用来说降低了对使用对象认识的难度。
2)、(最重要的理由)让程序设计者可以更动class内部运作方式,而无须担心波及到客户端程序。
3)、java的“访问权限修饰符”赋予classes开发者极具有价值的控制能力。 身为classes开发者,如果你的任何改变可以完全不干扰你的使用者,
你便可以安心改变你的底层实现,因为客户端程序员无法访问class的这一部分。
通过今天学习访问权限的问题了解到,接口或者抽象等等策略所谓的“实现隐藏”其根本原因并不是说为了隐藏实现的代码和思路,而是降低使用者的使用 难度,以及从维护角度来说可见范围的控制给程序维护带来了极大的安全性。

分享到:
评论

相关推荐

    c#和java中的访问修饰符

    知道c#中类和接口等默认修饰符吗?知道其成员的吗?知道各修饰符的作用吗?看看绝对帮到你。。

    Java和C#的比较

    Java默认的多态,C#要求加上virtual(被继承的方法)和override(继承的方法),而且C#要求不能改变原来的访问修饰符,不像Java那样,可以指定更加宽松的访问方式。 new关键字 C#中new关键字可以用来指定子类的...

    JAVA与C#的区别

    本文将从命名空间、数据类型、变量命名、注释、输出、控制流语句、数组、方法传递参数、访问修饰符、继承、多态、接口、枚举器、结构等方面对JAVA与C#进行比较。 命名空间:C#中的命名空间是namespace,类似于Java...

    类的封装(访问修饰符)

    在Java、C#等面向对象的语言中,访问修饰符是实现封装的关键工具。 访问修饰符是用来控制类的成员(如变量、方法)的可见性和访问权限的关键词。常见的访问修饰符有:public、private、protected以及默认(无修饰符...

    java and c# java and c#

    - **默认访问修饰符**:在C#中,未指定访问修饰符的成员默认为`private`,而在Java中,默认为`package-private`(即包内可见)。 - **文件命名规则**:Java要求文件名必须与其包含的公共类名完全相同,C#则没有此...

    java C# 面向对象方面的比较.doc

    - C#提供了public、internal、protected和private四种访问修饰符,而Java只有public、protected、package-private(无修饰符)和private。C#的internal类似于Java的package-private,限制在同一编译单元内的访问。...

    java与C#的区别.pdf

    - C#的默认访问修饰符是`protect`,意味着默认不公开,而在Java中是`public`。 6. **源文件与公共类的关系**: - Java规定每个源文件只能有一个公共类且类名与文件名相同,C#没有此限制。 7. **主方法(Main)**...

    Java,C#OOP思想word文档总结

    8. **访问修饰符和成员访问**: - 在C#中,静态成员可通过类名直接访问,实例成员则需要通过对象实例。Java的访问规则类似,但静态成员也可通过类名访问,实例成员同样需要通过对象实例访问。 以上只是Java和C#...

    java与C#的区别 (2).pdf

    3. 访问修饰符:C#中默认的访问修饰符是`protect`,不同于Java的默认公开(public)。 4. 源文件结构:Java规定每个源文件只有一个public类且与文件名相同,而C#没有这样的限制。 5. 主程序入口:C#的主方法是Main,...

    C#与Java的区别

    C#的默认访问修饰符是`protect`,意味着类成员只能在类内和继承链中访问,而在Java中,成员默认为`private`,仅限类内部访问。 4. **源文件与公共类的关系**: Java规定每个源文件只能有一个public类,且类名与...

    C#和JAVA的区别总结

    【描述】:"本文将详细对比C#与Java这两门编程语言在源文件、数据类型、运算符、分支语句、访问修饰符、方法、属性、继承、事件、运算符重载、异常处理、索引器以及元数据等方面的不同之处。" 【标签】:"C#与Java的...

    c#与java的区别.pdf

    - C#的访问修饰符比Java多一个`internal`,提供了更细粒度的访问控制。 16. **密封类(sealed)**: - C#中用`sealed`防止类被继承,Java无直接对应的关键字。 17. **接口定义**: - C#接口不能包含字段,所有...

    C#和JAVA的区别介绍.pdf

    - C#的默认访问修饰符是`protect`,限制了类外访问,而Java的默认是包访问权限。 4. **源文件与公共类的关系**: - Java规定每个源文件只能有一个公共类,且类名需与文件名相同,C#则没有这样的限制。 5. **程序...

    java与C#的区别.docx

    8. **受保护的访问修饰符**:在 C# 中,`protected` 访问修饰符使得成员仅能被派生类访问,与 Java 类似,但 C# 中没有 Java 的 `package-private` 访问级别。 9. **final 与 sealed**:Java 中的 `final` 关键词...

    CSharp和Java的区别.doc

    在C#和Java中,访问修饰符用于控制类、方法和变量的可访问性。在C#中,有三个访问修饰符:public、private和internal。在Java中,也有三个访问修饰符:public、private和default。如果不指定访问修饰符,默认的访问...

    c#和java基础的资料试题一览

    C#中的类和方法可以显式指定访问修饰符,如public、private等,以控制代码的访问范围。 3. **.NET程序集**:C#编译后的结果是.NET程序集(.dll或.exe),这是.NET框架中的可执行单元,包含了元数据和IL(中间语言)...

    java与C#区别详细介绍1 (2).docx

    - **访问修饰符**:Java 有 `public`、`package`、`protected` 和 `private`,C# 有 `public`、`internal`、`protected`、`private` 和 `protected internal`。 - **线程安全**:两者都支持线程安全,但 C# 的 `...

    java与C#的区别 (2).docx

    8. **访问修饰符**: `protected` 在 C# 中表示成员只能从派生类访问,这与 Java 类似。但 C# 没有 Java 中的 `final` 关键字,如果要阻止类被继承,可以使用 `sealed` 关键字。 9. **异常处理**: 在 C# 中,...

Global site tag (gtag.js) - Google Analytics