所谓访问权限,指的是本类的成员变量、成员方法和内部类对其他类的可见性。
四种访问权限
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一起使用。
重写或者实现方法时,访问权限必须比父类大。