在Java的面向对象编程体系里,访问修饰符是控制类成员可见性的重要手段,protected作为其中一种特殊的修饰符,在跨包继承的场景下能够很好地平衡属性的复用需求和保护需求,让父类的核心成员属性既可以被子类访问,又不会被无关的类随意操作。

protected 访问修饰符的基础规则
Java中的访问修饰符主要有private、default(默认,不写修饰符)、protected、public四种,它们的可见范围各不相同。protected的可见范围可以总结为两点:
- 被protected修饰的成员,在同一个包内的所有类中都可以被访问
- 被protected修饰的成员,在不同包的子类中可以被访问,但不同包的非子类无法访问
这个特性刚好适配跨包继承时保护父类核心成员的需求,既允许子类复用父类的属性,又阻止了无关类的访问。
跨包继承场景下的属性保护实现
我们可以通过一个实际的例子来演示如何使用protected保护父类的核心成员属性。首先我们定义一个位于com.parent包下的父类,其中包含核心的成员属性。
父类定义
package com.parent;
public class ParentClass {
// 核心成员属性,使用protected修饰
protected String coreData;
// 父类的构造方法
public ParentClass(String coreData) {
this.coreData = coreData;
}
// 父类的普通方法
public void printParentInfo() {
System.out.println("父类核心数据:" + coreData);
}
}
不同包的子类实现
接下来我们定义一个位于com.child包下的子类,继承ParentClass,测试是否可以访问父类的protected属性。
package com.child;
import com.parent.ParentClass;
public class ChildClass extends ParentClass {
public ChildClass(String coreData) {
super(coreData);
}
// 子类的方法,可以访问父类的protected属性
public void updateCoreData(String newData) {
// 跨包子类可以直接访问父类的protected属性
this.coreData = newData;
System.out.println("子类更新后的核心数据:" + coreData);
}
public void showCoreData() {
System.out.println("子类获取到的父类核心数据:" + coreData);
}
}
不同包的非子类测试
我们再定义一个同样位于com.child包下的普通类,测试非子类是否可以访问ParentClass的protected属性。
package com.child;
import com.parent.ParentClass;
public class UnrelatedClass {
public void testAccess() {
ParentClass parent = new ParentClass("测试数据");
// 下面这行代码会编译报错,不同包的非子类无法访问protected属性
// System.out.println(parent.coreData);
}
}
protected 修饰属性的注意事项
在使用protected修饰父类核心成员属性时,需要注意几个常见的问题:
- 如果父类的方法返回了protected属性的引用,那么不同包的子类可以通过这个方法获取到属性,但依然不能直接通过父类实例访问属性
- protected修饰的属性可以被同包的任意类访问,所以如果同包内有无关类,依然需要注意属性的安全性,必要时可以结合方法封装
- 如果子类重写了父类的方法,依然可以正常访问父类的protected属性,不会受到重写的影响
与其他修饰符的对比
为了更清楚protected的适用场景,我们可以把它和常用的修饰符做简单对比:
| 修饰符 | 同类 | 同包 | 不同包子类 | 不同包非子类 | 跨包继承保护属性适用性 |
|---|---|---|---|---|---|
| private | 可访问 | 不可访问 | 不可访问 | 不可访问 | 不适用,子类无法访问 |
| default | 可访问 | 可访问 | 不可访问 | 不可访问 | 不适用,跨包子类无法访问 |
| protected | 可访问 | 可访问 | 可访问 | 不可访问 | 适用,刚好满足需求 |
| public | 可访问 | 可访问 | 可访问 | 可访问 | 不适用,所有类都可以访问,无保护效果 |
总结
在Java跨包继承的场景中,使用protected修饰父类的核心成员属性,能够很好地实现属性的保护目标。它既允许不同包的子类正常访问和复用这些属性,又阻止了不同包的非子类随意操作属性,兼顾了封装性和继承的复用性。开发者在实际使用时,只需要将需要暴露给子类但不需要暴露给外部的属性用protected修饰,就可以达到保护核心成员的目的,同时结合方法封装可以进一步提升属性的安全性。
Javaprotected访问修饰符跨包继承成员属性封装修改时间:2026-07-07 23:09:28