You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:50:42