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
相关产品推荐
相关产品推荐

