private、protected、public是Java中的访问权限修饰符,可以用于修饰变量、方法和类。
(更正:类只有default和public两种修饰符,内部类相当于成员,可以使用private、protected和public修饰)
private表示只能在本类才能访问;
protected表示在同一个包的类中或者子类中可以访问;
public表示在任何类中都可以访问;
当不用这三个修饰符修饰时就是默认的访问权限,即在同一个包的类中可以访问。
Java的访问权限是基于类的,而不是基于对象的:
class Parent { private String name; protected String sex; public int age; public Parent() { name = "parent"; } public void method1() { name = "Jack"; Parent wife = new Parent(); wife.name = "Lily"; // 可以访问wife的private属性name } } public class Child extends Parent { } public class Test //Test类和Parent类、Child类不在一个包中 { public static void main(String[] args) { Child child = new Child(); child.sex = "boy"; //不能访问child的属性sex,因为在Test类中,而Test类不是Parent类的子类(这句注释不准确) child.age = 3; //可以在任何类中访问age属性 } }
上面的例子中有个错误,即使Test类继承自Parent类,child对象也无法访问sex属性。原因是,与父类不在同一个包中的子类只能访问自身从父类中继承来的protected属性,而不能访问父类实例以及父类的其他子类的实例的protected属性。
与此类似的问题是,在其他类中不能访问Object类的protected的clone方法,尽管Object类是所有类的超类。
关于protected的这个问题参考自以下博文:http://blog.csdn.net/ciawow/article/details/8262609
参考资料 《Java核心技术》