Java中protected访问权限编译报错:为何第1行合法第2行不合法?
Java Protected访问权限编译失败问题解析
嘿,我来帮你拆解这个Java protected权限的坑!先看一段典型的问题代码,你就能直观get到问题所在:
首先定义一个父类在单独的包下:
package com.parent; public class Parent { protected String protectedField = "我是protected字段"; protected void protectedMethod() { System.out.println("我是protected方法"); } }
然后在另一个包里写子类:
package com.child; import com.parent.Parent; public class Child extends Parent { public void testAccess() { // 第1行:完全可以正常编译 System.out.println(this.protectedField); this.protectedMethod(); // 第2行:编译直接报错! Parent parentInstance = new Parent(); System.out.println(parentInstance.protectedField); // 这里会触发编译错误 parentInstance.protectedMethod(); // 这里也会触发编译错误 } }
核心原因:搞懂protected的访问规则
很多人误以为protected就是“子类随便访问”,其实Java对protected的权限限制有明确的边界:
- 同一包内的所有类,不管是不是子类,都能直接访问protected成员;
- 不同包的子类,只能通过「子类自身的实例」(比如代码里的
this)或者「子类的子类实例」来访问父类的protected成员,绝对不能直接通过父类的实例来访问。
逐行分析
- 第1行的
this.protectedField:this是Child类的实例,Child是Parent的子类,符合“不同包子类通过自身实例访问父类protected成员”的规则,所以编译器放行。 - 第2行的
parentInstance.protectedField:这里是直接创建了Parent的实例来访问protected成员。对于不同包的类来说,哪怕你是子类,只要不是通过子类自己的实例去访问,而是直接用父类实例,protected成员就是不可见的——这是Java设计protected的初衷:保护父类的内部成员,只允许子类继承后通过自身实例来使用,而不是让其他类(哪怕是子类)直接操作父类的独立实例。
举个额外的例子验证:如果把Child类放到和Parent同一个包下,那第2行的代码就完全能编译通过,因为同一包内不受这个限制。
内容的提问来源于stack exchange,提问作者user989093
相关产品推荐
相关产品推荐

