java中构造器权限决定能否实例化和继承初始化,成员变量权限决定可访问性与继承可见性;public构造器任意调用,private仅本类可用,protected和default限制包和子类访问;成员变量同理但语义侧重读写与封装。

Java中权限修饰符对构造器和成员变量的限制,核心在于“谁可以访问”和“能否参与继承”,但两者适用规则并不完全相同。
构造器的权限限制
构造器本质是创建对象的入口,它的访问权限直接影响子类能否实例化父类或完成继承链初始化。
-
public构造器:任何地方都能调用,子类可通过
super()调用,跨包继承无障碍 -
protected构造器:同包类可直接调用;不同包子类也能通过
super()调用,但外部非子类无法实例化该类 - default(包私有)构造器:仅限同包内调用,子类若在不同包中,即使继承了该类,也无法调用其构造器——编译报错
-
private构造器:只能在本类内部使用,常见于单例、工具类(如
java.lang.Math),彻底阻止外部实例化和继承
成员变量的权限限制
成员变量的权限决定其数据是否可被读写、是否可被子类继承并直接访问,影响封装强度和扩展安全性。
- private成员变量:仅本类可读写,子类不可见,也不参与继承(但字段仍存在于子类对象内存中)
- default成员变量:同包内所有类可见可修改,子类若在同包中可直接访问;不同包中的子类无法访问
- protected成员变量:同包内任意类可访问;不同包中的子类也可访问(通过继承关系),但不能被不同包的非子类访问
- public成员变量:无访问限制,但违背封装原则,一般不推荐——应配合getter/setter控制访问
关键区别与常见陷阱
构造器和成员变量虽共用同一套修饰符,但语义重心不同:构造器管“能不能造出来”,成员变量管“能不能看/改/继承”。
- 顶层类不能用
protected或private修饰,但构造器可以——这是唯一能用private实现单例控制的位置 - 子类继承时,
protected成员变量可被子类直接使用,但protected构造器不自动“开放给子类调用”,仍需显式super()且满足权限要求 - 如果父类只有
private或default构造器,而子类在不同包中,编译会失败,因为子类默认隐式调用super()却找不到可访问的构造器











