Java中的访问权限修饰符(Java关键字)
今天很皮的发现,自己现在竟然不会玩儿Java基础了,就翻看了一下自己的笔记,写一篇文章复习一下!
测试环境:Java运行环境,myEclipse。
测试前准备:实体类包(Student类,Teacher类),测试类包(TestPublic类,TestProtected类,TestPrivate类)。
首先让我们想想这四种修饰符:public,protected,default(也有叫frendly的,不过两个都通不过编译,不写就是这个修饰符了),private。
测试开始:
修饰类时:当访问权限修饰符修饰类的时候,只能使用默认的修饰符和public修饰符,在不适用public的时候在不同的包中不可以访问到这个类,在Java这种面向对象编程的语言来说,应该将类设置成public的类,使用了public修饰的类可以导入到任何的类中,而不修饰的类只能在本包中使用。
没有修饰的类Teacher类:
![](https://i-blog.csdnimg.cn/blog_migrate/dab748f37cbb0e2bf24d971e83f44b28.png)
相同的包下,可以任意使用:
![](https://i-blog.csdnimg.cn/blog_migrate/1a61ee4a29ac9acc0bd079fb2cde8597.png)
不同的包,访问不到:
![](https://i-blog.csdnimg.cn/blog_migrate/8b2e97e627789e3f13749b6d67d66978.png)
修饰其它时:当访问权限修饰符修饰成员方法和成员变量的时候,这四种修饰符代表了四种访问权限,我们可以开始测试。
1:首先建立实体包和一个测试包,我们在这个entity包中写一个Student类,其中写入八个元素,为了测试的方便,我们可以都将其用static进行修饰,四个变量和四个方法分别用不同的修饰符修饰。
![](https://i-blog.csdnimg.cn/blog_migrate/4374b72a8b92f892d463d714cda8d5aa.png)
2:在测试包中写TestPublic测试类,可以看到通过类名调用的成员变量和成员方法只有public修饰符修饰的通过了编译。
3:在测试包中写TestProtected测试类并继承自Student类,可以看到通过类名调用的成员变量和成员方法使用public和protected修饰符修饰的通过了编译。
![](https://i-blog.csdnimg.cn/blog_migrate/1b82d5a1b2508ed01c33a6d758bea194.png)
4:在实体包中写TestDefault测试类并继承自Student类,可以看到通过类名调用的成员变量和成员方法只有private修饰符修饰的没有通过编译。
![](https://i-blog.csdnimg.cn/blog_migrate/51edb871630164fa681cf19f9d19f3d5.png)
5:回到Student实体类中,会发现使用private修饰的成员方法和成员变量被黄线抬起来了,鼠标悬浮上去,成员变量提示要么删除这个变量,要么提供getter和setter方法,要么加上注解表示这个成员变量不使用。而成员方法是不可能有getter和setter方法的,这些说明了什么,说明了private的访问范围。
![](https://i-blog.csdnimg.cn/blog_migrate/7f589f07b6d633cc1d9f7b5658ace156.png)
总结如下:
1:public修饰的变量或者方法在不同包中,相同包中,子类中,当前类中都是可以直接访问的。
2:protected修饰的变量或者方法在相同包中,子类中,当前类中都是可以直接访问的,在不同包中的类则不能访问。
3:default(也就是默认的)
的变量或者方法在相同包中,当前类中都是可以直接访问的,在不同包中,即便是子类中也不能访问。
4:private
修饰的变量或者方法只能在当前类中都是直接访问,在不同类中就不能访问,只能提供向外的公开的方法去调用,也就是面向对象的封装(这里暂时不提面向对象)。
关系图如下:
作用域
|
当前类
|
同一包
|
子孙类
|
其它包
|
public
|
√
|
√
|
√
|
√
|
protected
|
√
|
√
|
√
|
|
default(friendly) |
√
|
√
|
|
|
private
|
√
|
|
|
|