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