在java中,类的field和method访问权限有四种,共有三种关键字来描述这四种权限,分别是:public、protected和private,还有一种权限没有关键字,属于默认访问权限,为方便描述我们称之为default访问权限。类只有两种访问权限:default和public。
public权限是在任何地方都可以访问也就是一个public类在任何其他类都可以访问。
protected权限属于继承权限,也就是说类A有一个protected的方法,那么B类继承了A,那么B可以访问这个方法,与A不同包的其他类不能访问这个方法,与A同包的类就可以访问这个方法。
default访问权限是属于包的权限,也就是方法前面或类前面不加任何关键字,这时候只有同一个包里面的类才能访问。
private权限是最受约束的,只能够在本类里面使用。
举个例子:
//Dessert.java
package com.baidu;
public class Dessert{
public Dessert(){
System.out.println("we have Dessert");
}
protected void foo(){
}
}
//Dinner.java
import com.baidu.*;
class Dinner{
public static void main(String [] s){
Dessert d = new Dessert();
d.foo();
}
}
上面的程序不能正确编译,原因是在class Dinner里面,d.foo()不能访问Dessert里面受保护的方法,但是如果Dinner继承了Dessert的话,就可以访问了。现在按照上面的程序假设:
如果去掉class Dessert前面的public,那么编译class Dinner会怎么样?Dessert d = new Dessert();这一句会出问题,因为Dinner和Dessert不在同一个包,而且Dessert只有包访问权限,因此在Dinner类里面不能访问Dessert,更不用说Dessert里面的方法和变量,因此若要从一个类A访问类B,首先要保证类的权限可以通过,再保证方法和变量的权限。
类的开发者想写一个类A,这个类有一个私有变量aa和一个私有方法a,一个公有方法b用于获取变量aa的值,一个c方法,这个c方法想让子类可以访问,但不想让包外的其他类访问,最后一个包内访问的d方法,那么这个类可以这样写:
public class A{
private int aa;
private void a(){}
void d(){}
protected void c(){}
public int b(){};
}