Java基础:访问限制修饰符
访问限制修饰符有private,public,protected,他们都是Java的关键字,用来修饰成员变量和方法。
注意,在编写类的时候,类中的实例方法总是可以操作该类中的实例变量和类变量。类方法总是可以操作该类中的类变量,与访问限制符没有关系。
公有变量和公有方法
使用public修饰。权限最高,可以在不同包中不同类中被访问。
友好变量和友好方法
不用public、protected、private修饰符等修饰的成员变量和方法。权限从上至下排在第二。只能在该包中使用,包括不能被别的包的子类继承。
受保护的变量和受保护的方法
使用protected修饰。可以被继承。除了子类以外,在别的类中无法引用protected修饰的变量和方法。
私有变量和私有方法
用关键字private修饰。只能被当前类使用,不能被其他类拿出来使用。是定义某个权限最低的变量和方法的关键字。也无法被继承。
两种类
分别为public修饰的和友好类(即不加任何修饰符),除此之外,使用protected和private修饰的都是错误的,不存在的。
友好类的访问权限限制于当前包。
protected和默认修饰符的区别
到目前为止,两者似乎没有什么区别。但是两者的确是有区别的,在子类继承的时候。分为两种情况:
当子类和父类在同一个包下:
子类可以继承父类中不是private的变量和方法。
当子类和父类在不同包下:
子类只能继承protected和public的成员变量。
protected的进一步说明:
假设s包下有两个类,分别是temp5和test_temp5。t包下有一个类是temp2。现在temp5继承了temp2。我们来看在temp5和test_temp5中关于父类的操作权限。
temp2.java
package t;
public class temp2{
private int a;
private int getA(){
return a;
}
protected int b;
protected int getB(){
return b;
}
int c;
int getC(){
return c;
}
public int d = 0;
int getD(){
return d;
}
}
temp5.java
package s;
import t.temp2;
public class temp5 extends temp2{
//在构造方法中查看可以使用的哪些继承来的变量
public temp5(){
this.a = 1; //a是private的,显然报错
this.b = 1; //b是protected的
this.c = 1; //c是默认的,也会报错
this.d = 1; //d是public的
}
}
test_temp5.java
package s;
public class test_temp5 {
public test_temp5(){
temp5 tem5 = new temp5();
tem5.a = 1; //报错,tem5对象的该变量继承自另外一个包,因此无法访问。
tem5.b = 1; //报错
tem5.c = 1; //报错
tem5.d = 1;
}
}
分析上述代码:
- 对于子类temp5从temp2继承的protected成员变量和方法,需要追溯到protected成员变量和方法所在的“祖先类”,只要test_temp5类和temp5的祖先类在一个包中,那么用temp5创建的对象就可以被test_temp5访问它继承的protected变量和方法。
- 在不同包中,子类永远可以访问继承的protected和public变量和方法。
一个示例
(默认包)
Main.java
import s.temp5;
import t.temp2;
import t.temp3;
public class Main{
public static void main(){
Abc abc = new Abc();
Abcd abcd = new Abcd();
temp tem = new temp(); //同一个包下继承了Abc的类
temp2 tem2 = new temp2(); //在不同包下,无法继承Main类的Abc类,因为Abc是友好类,无法被别的包下的类继承。
temp3 tem3 = new temp3(); //与temp2在同一个包下,继承了temp2
abc.a = 1; //使用abc对象的a变量,为private,报错
abc.b = 1; //使用abc对象的b变量,为protected
abc.c = 3; //default
abcd.b = 2; //protected
abcd.c = 3; //default
tem.b = 1; //protected
tem.c = 2; //default
tem2.b = 1; //protected,报错,无法访问其protected变量
tem2.c = 1; //报错,无法访问其友好变量
tem2.d = 1; //public的可以访问
tem3.d = 1; //temp3继承了temp2,同上
}
}
class Abc{
private int a;
private int getA(){
return a;
}
protected int b;
protected int getB(){
return b;
}
int c;
int getC(){
return c;
}
}
class Abcd extends Abc{
}
temp.java
public class temp extends Abc{
}
t包
temp2.java
package t;
public class temp2{
private int a;
private int getA(){
return a;
}
protected int b;
protected int getB(){
return b;
}
int c;
int getC(){
return c;
}
public int d = 0;
int getD(){
return d;
}
}
temp3.java
package t;
public class temp3 extends temp2{
}