权限修饰符(Y表示可以访问,N表示不可以访问)
成员修饰符 | 类自己 | 相同包 | 不同包的子类 | 任意类 |
---|---|---|---|---|
public(公有的) | Y | Y | Y | Y |
protected(保护) | Y | Y | Y | N |
包(默认) | Y | Y | N | N |
private(私有的) | Y | N | N | N |
一个例子(权限问题)
父类P | 权限 |
---|---|
A | public(公有的) |
B | protected(保护) |
C | 包(默认) |
D | private(私有的) |
子类C | 权限 |
---|---|
E | public(公有的) |
F | protected(保护) |
G | 包(默认) |
H | private(私有的) |
//定义一个主类
class Other{
C c = new C();//定义子类对象c
//通过子类对象调用父类变量
c.A;//可以访问
c.B;//Other和p是否同包
c.C;//Other和p是否同包
c.D;//不可以访问
//通过子类对象调用子类的变量
c.E;//可以访问
c.F;//Other和c是否同包
c.G;//Other和c是否同包
c.H;//不可以访问
}
子类和父类在同一包中的继承性
当子类和父类在同一个包中时,父类中的private访问权限的成员变量不会被子类继承,也就是说,子类继承父类中的除private访问权限以外的其他成员变量作为子类的成员变量;同样,子类继承父类中的除private访问权限以外的其他方法作为子类的方法。
注意:子类不能调用父类private修饰的属性,但还是要为这个属性开辟空间
package ShangKe.di3;//同一个包
class P{
public int A = 1;//公用的
protected int B = 2;//保护的
int C = 3;//默认的
private int D = 4;//私有的
}
class C extends P{
public int E = 5;//公用的
protected int F = 6;//保护的
int G = 7;//默认的
private int H = 8;//私有的
}
public class Demo2 {
public static void main(String[] args) {
C c = new C();
System.out.println(c.A);//1
System.out.println(c.B);//2
System.out.println(c.C);//3
System.out.println(c.D);//错误,'D' 在 'ShangKe.di3.P' 中具有 private 访问权限
System.out.println(c.E);//5
System.out.println(c.F);//6
System.out.println(c.G);//7
System.out.println(c.H);//错误,'H' 在 'ShangKe.di3.C' 中具有 private 访问权限
}
}
子类和父类不在同一包中的继承性
当子类和父类不在同一个包中时,父类中的private权限的成员变量不会被子类继承,也就是说,子类只继承父类中的protected和public访问权限的成员变量作为子类的成员变量;同样,子类只继承父类中的protected和public访问权限的方法作为子类的方法。
注意:子类不能调用父类private,protected修饰的属性,但还是要为这个属性开辟空间
package ShangKe.di2;//包
class P{
public int A = 1;//公用的
protected int B = 2;//保护的
int C = 3;//默认的
private int D = 4;//私有的
}
public class C extends P{
public int E = 5;
protected int F = 6;
int G = 7;
private int H = 8;
}
package ShangKe.di3;
import ShangKe.di2.C;//引入包
public class Demo2 {
public static void main(String[] args) {
C c = new C();
System.out.println(c.A);//1
System.out.println(c.B);//错误,'B' 在 'ShangKe.di2.P' 中具有 protected 访问权限
System.out.println(c.C);//错误,'ShangKe.di2.P' 在 'ShangKe.di2' 中不为 public。无法从外部包访问
//System.out.println(c.D);//错误,'D' 在 'ShangKe.di3.P' 中具有 private 访问权限
System.out.println(c.E);//5
System.out.println(c.F);//错误,'F' 在 'ShangKe.di2.C' 中具有 protected 访问权限
System.out.println(c.G);//错误,'G' 在 'ShangKe.di2.C' 中不为 public。无法从外部包访问
//System.out.println(c.H);//错误,'H' 在 'ShangKe.di3.C' 中具有 private 访问权限
}
}