所谓访问权限,指的是本类的成员变量、成员方法和内部类对其他类的可见性。
四种访问权限
Java一共有四种访问权限,按照权限由大到小分别为public、protected、default和private,如果省略了访问修饰符,那访问权限就是defualt。四种访问权限的含义和权限控制见下面表格:
访问权限 | 含义 | 本类 | 本包的类 | 非本包子类 | 非本包非子类 |
public | 公共的 | 是 | 是 | 是 | 是 |
protected | 保护访问权限 | 是 | 是 | 是 | 否 |
default | 包访问权限 | 是 | 是 | 否 | 否 |
private | 私有的 | 是 | 否 | 否 | 否 |
注意:所谓的访问,有两种方式,直接访问和通过对象访问。
举例说明
基类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一起使用。
重写或者实现方法时,访问权限必须比父类大。