Java中的四种访问修饰符:public、protected、default(无修饰符,默认)、private。
- 四种修饰符可修饰的成分(类、方法、成员变量)
public | protected | default | private | |
类 |
√ |
× |
√ |
×(内部类可以用private修饰) |
方法 |
√ |
√ |
√ |
√ |
成员变量 |
√ |
√ |
√ |
√ |
- 四种修饰符的访问权限
public:对所有类可见
protected:对同一包中的类可见、对同一包及不同包中的子类可见
default:对同一包中的类可见、对同一包中的子类可见
private:仅对类本身可见
可见是可访问的意思,即由这些修饰符修饰的成分(类、方法、成员变量)可以被其它类访问。对子类可见即子类可以继承。
这里需要注意的是protected与default,二者的区别在于不同包中的子类是否可以继承。
访问权限 | 类 | 同一包 | 同一包中的子类 | 不同包中的子类 | 不同包 |
public |
√ |
√ |
√ |
√ |
√ |
protected |
√ |
√ |
√ |
√ |
× |
default |
√ |
√ |
√ |
× | × |
private |
√ |
× | × | × | × |
- 例如
package1:ParentClass、ChildClassOne、TestOne
package2:ChildClassTwo、TestTwo
package3:TestThree
其中ParentClass为
public class ParentClass { public int a=2;
protected int b = 3;
int c = 4;
private int d = 5; }
1.对于TestOne来说,ParentClass类、a、b、c均可见,d不可见。即在TestOne中可以new一个ParentClass对象,且该对象中的a,b,c变量可操作。如下:
public class TestOne { public static void main(String args[]) { ParentClass obj = new ParentClass(); System.out.println(obj.a);
System.out.println(obj.b);
System.out.println(obj.c);
// System.out.println(obj.d); //d 不可见
}
}
2. ChildClassOne继承ParentClass且与其在同一个包中,则a、b、c均可见,d不可见。
public class ChildClassOne extends ParentClass{ public static void main(String args[]) { ChildClassOne obj = new ChildClassOne(); System.out.println(obj.a);
System.out.println(obj.b);
System.out.println(obj.c);
// System.out.println(obj.d); // d不可见
}
}
3. ChildClassTwo继承ParentClass,则a、b均可见,d不可见,由于子类与ParentClass不在同一包中,故c(default类型)不可见。
public class ChildClassTwo extends ParentClass{ public static void main(String args[]) {
ChildClassTwo obj = new ChildClassTwo(); System.out.println(obj.a);
System.out.println(obj.b);
// System.out.println(obj.c); // c不可见
// System.out.println(obj.d); // d不可见
}
}
4.对于TestTwo来说,ParentClass类、a均可见,b、c、d不可见。由于TestTwo与ParentClass不在同一个包中,故只有public修饰的成分可见。
public class TestTwo { public static void main(String args[]) { ParentClass obj = new ParentClass();
System.out.println(obj.a);
// System.out.println(obj.b); // b 不可见
// System.out.println(obj.c); // c 不可见
// System.out.println(obj.d); // d 不可见
}
}
- 另外值得注意的是继承父类的子类与其他类之间的可见性,取决于其他类与父类之间的可见性。
对于TestOne来说,ChildClassOne中a,b,c都可见,d不可见,这是由于TestOne与ParentClass在同一个包中。
而对于TestThree来说,ChildClassOne中只有a可见,这是由于TestThree与ParentClass在不同的包中。
需要注意:
虽然a、b对ChildClassTwo可见,TestTwo与ChildClassTwo在同一包中,
但对于TestTwo来说,ChildClassTwo中只有a可见,这是由于TestTwo与ParentClass在不同的包中,只有public修饰的可见。