![深入浅出Java编程](https://wfqqreader-1252317822.image.myqcloud.com/cover/969/44509969/b_44509969.jpg)
6.3 访问修饰符
权限修饰符号从小到大分别为private、默认、protected和public。本节会涉及一些方法的调用,但不会太过复杂,所以不必担心。private声明的方法或是成员变量,只能当前类自己访问。public声明的成员变量或者方法,所有其他类都可以访问。这四个修饰符的功能如表6-1所示。
表6-1 四个修饰符的功能
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-T67_5809.jpg?sign=1739071107-v04hIqK6r7EriWqK9s8LMFwKiEYjqaII-0-f5c4087113177538f43f9cb932001d29)
包的功能:
(1)通过将相同名的类放到不同的包中加以区分。
(2)进行基本的权限控制。
(3)描述功能及模块。
需要注意的是,public和默认修饰符可以用于修饰顶层类(直接声明到文件中的类)。内部类(声明到其他类内部的类)可以被所有权限符号修饰。如下声明是错误的,因为使用private权限修饰符修饰了一个顶层类:
1. private class Hello{ 2. }
现在让我们通过代码来展示这些权限修饰符的可访问性。下面先从private开始。
6.3.1 private修饰符
private关键字表示私有的,可以修饰成员变量和成员方法,不能修饰局部变量。被private修饰的成员变量或成员方法只有当前类可以访问,其他类都不能访问另一个类的私有信息。以下代码访问的都是自己的私有成员信息。
【文件6.12】PrivateDemo.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P68_5940.jpg?sign=1739071107-jWPB4Tbbbg27EngyAt3M5IrjRO4GRlKO-0-ee3806b638bb1f68c027da6d372dc0c4)
在上面的代码中,第3行声明了一个实例成员变量,第4行声明了一个实例成员方法。这两个方法都不是静态的。在Java中,如果要从静态的方法中调用非静态的方法,就必须先实例化当前类,所以在第8行必须先声明PrivateDemo类的实例对象,即使用new关键字声明PrivateDemo类的实例。最重要的是,无论是public、protected、默认还是private,当前类都是可以调用的。
用private声明的成员方法或是成员变量,其他类不能调用,如以下代码所示。
【文件6.13】PrivteDemo2.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P68_5941.jpg?sign=1739071107-uUCutIzxBt16C4jDT1RfeYMNxtja2Jzf-0-0399d843f36d0c55b9dfbffff759fbc3)
【文件6.14】InvokeDemo.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P69_6090.jpg?sign=1739071107-mkOyD88wzCP3faIsLESxa8FElyPEyeP4-0-f8218eefffc427380420d4f6e16a89b0)
在上面的代码中,第4行首先实例化了PrivateDemo类对象。然后在第5、6行访问私有的成员变量和成员方法。PrivateDemo中只有私有的成员变量和方法,第5、6行编译会出错,因为在InvokeDemo类中不能访问其他类的私有成员变量和成员方法。
6.3.2 默认修饰符
默认修饰符也可以叫作friendly(友好的),但是friendly并不是关键字。当一个方法或者成员变量没有使用任何权限修饰符时,默认的权限修饰符将会起作用。默认修饰符可以修饰类、成员方法和成员变量,表示同包中的类可以访问,同包中的子类也可以继承父类被默认修饰符修饰的成员或者方法。
下面展示在相同包下和在不同包下默认修饰符的访问能力。
第一个类:
【文件6.15】DefaultDemo.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P69_6091.jpg?sign=1739071107-GiEY3EGDBy3W9ndwxLnp2whRSYa7psk5-0-b867f2aa9f30698d34f25f0b215b2eea)
第二个类与DefaultDemo类在相同的包中:
【文件6.16】Demo01.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P69_6092.jpg?sign=1739071107-V0zg0LyPieUVgb3VOiM12d2d1yxOXU1v-0-d089ddae80b6b8280a3d0b14cf0a273a)
在上面的代码中,由于class Demo01与DefaultDemo在相同的包中,因此在Demo01中可以访问DefaultDemo中的成员变量和成员方法,即第5、6行编译通过。
第三个类与DefaultDemo类在不同的包中:
【文件6.17】Demo02.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P70_6228.jpg?sign=1739071107-yxBiUSge9xr0EFzUaFp3fAFH50Z47G0b-0-2d8e4159e0faebfbcb0c09b404e4e89f)
在上面的代码中,由于Demo02与DefaultDemo不在同一个包中,所以第5、6行编译出错。因为在不同的包中不能访问另一个包的默认修饰符的成员信息。
第四个类与DefaultDemo类在相同的包下,通过继承访问DefaultDemo中的成员信息,并且继承将会在后面的章节中具体讲到。继承关键字为extends,通过extends可以让当前类变成另一个类的子类。
【文件6.18】Demo03.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P70_6229.jpg?sign=1739071107-ZV5safiXgis4TldiqReLXmeC1xbqOvZb-0-b02f42dfeed92c14a2df228254e182b2)
在同一个包中,一个类可以通过extends关键字继承另一个类默认的、protected和public的成员方法和成员变量。所以,第8行和第9行的编译和运行都能通过。
6.3.3 protected修饰符
protected修饰符用于修饰成员方法和成员变量,主要用于描述被修饰的对象可以被同包中的类访问和子类继承。protected也用于描述继承关系,所以如果大家在Java API中发出一些方法被protected修饰,语义上这个方法主要是用于让子类继承或者重写(后面会讲到重写的概念)的。
以下代码展示在不同的包中,通过继承访问另一个类受保护的成员信息。
【文件6.19】ProtectedDemo.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P70_6225.jpg?sign=1739071107-ZIi40m5xTCN45DfWa84B8Oi5Jzk5vS64-0-86238173f9339205df19f5f7a00fab52)
以下声明一个不同包中的类,然后通过继承获取受保护的成员变量和成员方法的访问能力。
【文件6.20】Demo01.java
![](https://epubservercos.yuewen.com/A51239/23721640201031406/epubprivate/OEBPS/Images/Figure-P71_35825.jpg?sign=1739071107-bFfjvQ4lwCdsY7zgBRUk8l6nbVy7p81f-0-301204cbb9d7982a9cd5e052c3ce7b62)
上例的代码通过extends继承了ProtectedDemo。所以,在子类中可以直接访问父类中被保护的成员信息,即第4、5行的代码。
6.3.4 public修饰符
public修饰符表示公开、公有的。public修饰符可以修饰类、成员方法、成员变量,被public修饰的类叫公共类,可以被其他任意类声明。被public修饰的成员方法和成员变量,其他类都可以调用。
关于public的使用,在此不再赘述。
6.3.5 权限修饰符小结
权限修饰符用于修饰方法、成员是否可以被访问。值得说明的是,权限修饰不能修饰局部变量。
用private修饰的方法或者成员变量只能被当前类访问。一般在企业的开发中不会直接暴露成员变量,所以成员变量一般都是用private修饰的。成员方法是为了让其他对象调用的,所以一般成员方法都用public修饰的。
protected修饰符主要用于修饰成员变量和成员方法,语义上表示让子类继承。
public修饰符修饰的方法或成员是为了让所有其他对象访问。
在使用某一个修饰符时,要了解如何使用成员方法或者成员变量,然后添加不同的修饰符。