了解public,protected,default以及private看完这一篇就足够!!!
前言
小鱼查阅了很多博客,很少有能将public,protected,default(默认不写)以及private讲解的很细节的,我指的细节是从访问权限到为什么我们的类只能被public修饰和default(默认不写)修饰。
访问级别修饰符确定其他类是否可以使用特定字段或调用特定方法,有两个级别的访问控制
我们知道,在Java中,访问修饰符可以修饰 类、方法、变量和构造方法。
在顶级
在顶级有两个修饰限定符,public和default(默认不写,编译器提供的)
当我的类用public修饰时,我的类对所有类都可见,如果一个类没有写修饰限定符,那么就是系统默认的defaule,仅对自己的包中的类公开。
public
JAVA类声明中关键字public起到什么作用呢?如下Hello类的声明,按着字面的意思理解是:Hello类是公共的,要求Hello类与类文件名必须保持一致,并且一个java文件中只能有一个public关键字声明的类。
当我们的被public修饰的类型名和文件名一样时,是不会报错的,并且编译的时候会生成与文件名相同的class文件
如果文件名和类名不相同时,编译会出错,并且爆出java: 类HelloWOrd是公共的, 应在名为 HelloWOrd.java 的文件中声明
当pubilc修饰的类在其他包的文件中访问时
也是可以通过编译的,蓝色框框是他们所属的包
总结:
- 一个java文件中只能有一个时public修饰的类
- 被public修饰的类名要与文件名一致
- 编译后会产生一个与java文件名相应的.class文件
- 所有类都可以访问
default(没有显示修饰符即默认访问权限)
我们的外部类也可以用default来修饰,当我们的文件名和我们的类名不一致时,
Hello.java文件
class HelloWord {
public static void main(String[] args) {
System.out.println("Hello word!!!");
}
}
我们编译一下,没有报错,最后生成了一个HelloWord.class的文件
如果Hello.java中有多个非public关键字声明的类,就会产生多个与之相应的.class文件
当default(默认访问权限)修饰的类在其他包的文件中访问时
defaule只能在自己的包中访问,如果从别的包访问就会产生编译错误。
总结:
一个java文件中可以同时有多个不使用public关键字声明的类,但是编译后会产生多个与之对应的.class文件,并且要执行的文件是对应的多个.class的前缀名
default的权限仅限于自己包内(包访问权限)
只能用public和default修饰类嘛?
-
是的,我们使用访问修饰符去修饰类,就是为了让类之间根据各种权限来访问。
-
假如外部类使用private修饰,则不能被其它类所访问,这个类也就失去了意义。
-
假如外部类使用protected修饰,看起来与default相比,在包内可访问的基础上,包外的子类也可访问。但包外想成为子类需要先继承父类,然而无法找到该父类实际上无法继承(先有鸡还是先有蛋的问题),效果与default一致,也就没必要存在了。
在成员级别
在成员级别中,可以使用public和default(默认访问权限),当然还新增了两个访问修饰符,private和 protected.
private修饰的成员只可以在自己的类中访问,
protected修饰的成员可以在自己的包中访问,也可以被其他包中的该类的子类访问
如何选择访问级别
如果其他程序员在使用你的类,你想要确保不会发生滥用错误,访问级别可以这么选择
- 我们希望类要尽量做到 “封装”, 即隐藏内部实现细节, 只暴露出 必要 的信息给类的调用者.
- 因此我们在使用的时候应该尽可能的使用 比较严格 的访问权限. 例如如果一个方法能用 private, 就尽量不要用 public.
- 另外, 还有一种 简单粗暴 的做法: 将所有的字段设为 private, 将所有的方法设为 public. 不过这种方式属于是对访问权限的滥用。
- 认真思考这个类是给自己使用还是给外部使用来决定它的访问权限。
实际演示
我们采取四个对比的方式
我们被private修饰的成员变量在其它类中无法访问
在不同包中的子类和非子类里访问
相关文章
- Awesome Mac:收集的非常全面好用的Mac应用程序、软件以及工具
- Office三件套批量转PDF以及PDF书签读写与加水印
- 第九节:深究并行编程Parallel类中的三大方法 (For、ForEach、Invoke)和几大编程模型(SPM、APM、EAP、TAP) 第八节:Task的各类Task<TResult>返回值以及通用线程的异常处理方案。 第七节:利用CancellationTokenSource实现任务取消和利用CancellationToken类检测取消异常。 第六节:深入研究Task实例方法Cont
- XML - 十分钟了解XML结构以及DOM和SAX解析方式
- Flutter TextField 边框样式以及提示文本 、Flutter输入文本TextField
- 推荐一个快速了解移植uboot以及linux到新板子上的ppt教程
- 聊聊模板方法模式,装饰器模式以及AOP
- Struts2的使用以及Spring整合Struts2
- linux中加载驱动程序的命令以及加载方式过程分析
- SVN svnserve.conf: Option expected 的解决方法 以及 Authorization failed 的解决方法
- nodejs中http服务器,如何使用GET,POST请求发送数据、npm、以及一些插件的介绍
- fileReader对象读取txt文件乱码问题 以及如何获取文件的url路径(绝对路径)
- 浅析Tree-Shaking实现原理、了解DCE与tree-shaking各自着重点、摇树实现的基本条件以及代码编程中的最佳实践
- 【Unity3D小技巧】Unity3D中判断Animation以及Animator动画播放结束,以及动画播放结束之后执行函数
- 【Unity3D日常开发】Unity中实现“使用次数限制以及时间限制功能”
- TestNG环境搭建以及框架初识
- CentOS 在线yum安装MySQL8.0版本或者其他版本,以及修改mysql的root密码
- 资深工程师必须了解的网络端口全解,包含千种端口默认使用的协议和作用以及分配的规范
- java中json包的使用以及字符串,map,list,自定义对象之间的相互转换
- 多线程同步锁和死锁以及synchronized与static synchronized 的区别