所謂訪問權限,指的是本類的成員變量、成員方法和內部類對其他類的可見性。
四種訪問權限
Java一共有四種訪問權限,按照權限由大到小分別為public、protected、default和private,如果省略了訪問修飾符,那訪問權限就是defualt。四種訪問權限的含義和權限控制見下面表格:
訪問權限 | 含義 | 本類 | 本包的類 | 非本包子類 | 非本包非子類 |
public | 公共的 | 是 | 是 | 是 | 是 |
protected | 保護訪問權限 | 是 | 是 | 是 | 否 |
default | 包訪問權限 | 是 | 是 | 否 | 否 |
private | 私有的 | 是 | 否 | 否 | 否 |
注意:所謂的訪問,有兩種方式,直接訪問和通過對象訪問。
實際情況跟表格有些出入,需要注意的點:在非本包子類,通過父類的對象實例只能訪問父類的public成員,不能訪問protected成員。
舉例說明
基類SupClass
package com.cc.accessright;
/*** * @描述: 父類* @版權: Copyright (c) 2019 * @作者: cc* @版本: 1.0 * @創建日期: 2019年5月28日 * @創建時間: 上午11:02:06*/
public class SupClass
{public void publicMethod(){System.out.println("=============publicMethod=============");}protected void protectedMethod(){System.out.println("=========protectedMthod===========");}void defaultMethod(){System.out.println("=========defaultMethod========");}private void privateMethod(){System.out.println("=========privateMethod========");}
}
子類SubClass
package com.cc.accessright.demo;import com.cc.accessright.SupClass;
/*** * @描述: 與父類不同包的子類* @版權: Copyright (c) 2019 * @作者: cc* @版本: 1.0 * @創建日期: 2019年5月28日 * @創建時間: 上午11:01:28*/
public class SubClass extends SupClass
{public static void main(String[] args){SupClass supClass = new SupClass();supClass.publicMethod();//子類通過父類對象能訪問父類的public成員,其他訪問級別的成員不能訪問}public void subClassMethod1(){//子類可以直接訪問父類的public、protected,其他訪問級別的成員不能訪問publicMethod();protectedMethod();}
}
同包的類PackageClass
package com.cc.accessright;
/*** * @描述: 同包的類* @版權: Copyright (c) 2019 * @作者: cc* @版本: 1.0 * @創建日期: 2019年5月28日 * @創建時間: 上午11:04:14*/
public class PackageClass
{public static void main(String[] args){//通過對象訪問public、protected和default方法,不能訪問private級別的成員SupClass supClass = new SupClass();supClass.publicMethod();supClass.protectedMethod();supClass.defaultMethod();}}
其他
外部類訪問權限只能是public或者default,但一個Java文件最多只能有一個public修飾的類,且文件名必須跟public修飾的類類名相同。當Java文件不存在public修飾的類時,文件名可以隨意取。
接口的成員變量只能是public static final修飾的(可以省略),成員方法不同的JDK版本有差異:JDK1.6實測:成員方法只能是public abstract修飾的(可以省略);JDK1.8實測:?成員方法只能是public修飾的(可以省略),另外還可以使用abstract, default, static和strictfp來修飾,其中abstract,default,static互斥,使用default或者static時必須提供方法的實現,strictfp不能單獨使用,要配合default或者static一起使用。
重寫或者實現方法時,訪問權限必須比父類大。