public成员可被任何类访问,protected仅限同类、同包或子类继承访问,跨包非子类不可访问。

public 和 protected 是 Java 中的两个访问修饰符,它们控制类成员(字段、方法、构造器等)的可见范围。主要区别在于访问权限的宽窄和适用场景。
public 的访问权限
被 public 修饰的成员可以在任何地方被访问:- 同一个类中可以访问
- 同一个包中的其他类可以访问
- 不同包中的子类可以访问
- 不同包中的非子类也可以访问
protected 的访问权限
被 protected 修饰的成员具有较严格的访问控制:- 同一个类中可以访问
- 同一个包中的其他类可以访问(无论是否继承)
- 不同包中的子类可以访问(必须通过继承关系)
- 不同包中的非子类不能访问
实际例子说明
假设有一个父类在com.example.Parent:
package com.example;
public class Parent {
public void doPublic() { }
protected void doProtected() { }
}
在另一个包 com.test 中有一个子类:
package com.test;
import com.example.Parent;
public class Child extends Parent {
public void test() {
doPublic(); // 可以访问,public 允许
doProtected(); // 可以访问,因为是子类
}
}
但在 com.test 中一个不相关的类:
package com.test;
public class Unrelated {
public void test() {
Child child = new Child();
child.doPublic(); // 可以访问
child.doProtected(); // 编译错误!即使在同一包也不行(Child 继承了但外部调用受限)
}
}
注意:虽然 Unrelated 和 Child 在同一包,但 doProtected() 是从父类继承来的,且不在同一个包中定义,所以不能直接通过对象调用。
总结关键区别
- public: anywhere, no restrictions
- protected: same class, same package, or subclass (even across packages),但子类访问必须通过继承机制,不能通过实例随意调用










