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

Java访问修饰符使用困惑:跨包继承代码报错求助

问题原因分析

你遇到的错误不是因为protected方法的使用问题,而是父类Testing本身的访问权限限制:

  • 你在p1包中的Testing类没有加任何访问修饰符,这属于Java中的默认包访问权限(也叫包私有),这种权限的类只能被同一个包内的其他类访问,外部包完全看不到这个类。
  • 哪怕你想通过继承来使用protected方法,前提是你的子类能“看到”父类才行——现在p2包的Pqr根本无法访问p1包的Testing类,自然没法继承,所以报错。
解决办法

只需要修改一个地方,就能解决问题:

1. 将p1包的Testing类改为public权限

修改后的p1.Testing代码:

package p1;
// 关键:给类加上public修饰符,让外部包可以访问
public class Testing{
    protected static boolean find(String a,String b){
        boolean ans = false;
        for(int i=0;i<a.length();i++){
            String m = a.charAt(i) + "";
            if( m.equals(b)){
                ans = true;
            }
        }
        return ans;
    }
    public static void main(String args[]){
    }
}

2. 验证p2包的代码

此时p2包的代码不需要修改,运行后就能正常执行。不过这里有个小细节:find是static方法,规范上更推荐直接通过Testing.find("Mississippi","p")调用,而不是通过子类实例调用,但两种方式都能正常运行。

补充知识点
  • 顶级类(不是内部类)的访问修饰符只有两种:public(所有包可访问)和默认(仅同包可访问),protected和private不能用来修饰顶级类。
  • protected成员的访问规则:
    • 同包内的所有类都可以访问;
    • 不同包的子类可以访问,但前提是父类本身是可被外部包访问的(也就是父类是public)。

内容的提问来源于stack exchange,提问作者Akshit Gupta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:10:36