java中public, default, protected, and private的区别?

来源:互联网 发布:java 打包tar.gz 编辑:程序博客网 时间:2024/06/13 04:49

java中public, default, protected, and private的区别?

今天开始写第一篇博客,希望将博客作为一个学习的记录。自己能够天天进步。也希望大家看到博客之后能够为大家提供一定的帮助。博客中可能会用到很多英文,因为本人比较喜欢上国外的Quora和stackOverflow 两个网站。都会尽量对用到的英文做出翻译。

1说明: 

1)访问控制权限,官方参考:Controlling Access to Members of a Class


        2)stackoverflow 参考:In Java, what's the difference between public, default, protected, and private?

       3)JAVA有四种访问控制权限的修饰词:public、protected、friendly(default)、private.

上图的含义,class:当前类;package:统一包中;subclass:子孙类;world:全部类;no modifier:没有访问权限控制符,也就是friendly和default;y:accessible y代表可以访问;n:not accessible n代表不可访问。


上面四列数据分别代表:(摘自官方文档)

The first data column indicates whether the class itself has access to the member defined by the access level. (数据的第一列说明当前类是否对它的成员有访问权限)

As you can see, a class always has access to its own members. (你会发现,当前类对它的所有成员都有访问权限)

The second column indicates whether classes in the same package as the class (regardless of their parentage) have access to the member. (数据的第二列说明了在同一个包中的类(忽略父子关系)对几类成员是否有访问权限)

The third column indicates whether subclasses of the class declared outside this package have access to the member. (第三列说明了在包外面的子类对对几类成员的访问权限)

The fourth column indicates whether all classes have access to the member.(第四列说明了是否所有类对几类成员有访问权限)

2注意: 

            1)类既不可以是private的(这样会使得除该类之外,其他任何类都不可以访问它),也不可以是protected的。

     2)protected 也提供包访问权限,也就是说,相同包中的其他类可以访问protected元素。也可以并只可以被不同包中的子类覆写或直接调用而非实例化访问访问。

             3)针对于默认的访问权限,如果一个子类与其父类位于不同的包中,子类也不能访问父类中的默认访问控制成员。(所以它是针对同一包,不针对子孙类)。

3 举例: 

       1)比如在包1定义了public父类,子类。那么该子类可以访问和覆写的该父类的public/protected/friendly修饰的成员(方法、变量、类)。而在包2内的类中实例化一个包1的子类,也不可以访问它的或它父类的friendly即protected修饰的成员,但可以继承它而访问或覆写protetcted修饰的成员.在子孙类中并不是指new出来访问而是指直接访问。

  2)java中4种修饰符访问权限的区别及详解全过程  (来自百度经验,这篇文章讲得比较好)

4总结: 

控制对成员的访问权限有两个原因:第一是为了是用户不要触碰那些他们不该触碰的部分。第二个原因也是最重要的原因,是为了让类库设计者可以更改类的内部工作方式,而不必担心这样会对客户端程序员(类库的外部使用者)产生重大的影响。(摘自《java编程思想》(《thinking in java》)-第六章访问权限控制-6.5 总结)


0 0
原创粉丝点击