概述
结论
对象访问自己的实例方法,在同一个包中的其他类里,可以访问除private之外的方法;对象在其他包的类中,只能访问自己的public方法。
问题
以前一直以为使用缺省访问修饰符的方法是包访问权限,protected方法是包+子类访问权限,今天发现之前的理解有误区,主要是修饰符为protected时。
如上图所示,A是B和C的父类,A中有m1方法。
m1的访问修饰符为protected时:
public class A {
void m1() {
System.out.println("m1");
}
}
public class C extends A {
public static void main(String[] args) {
C c = new C();
c.m1(); // 正确
A a = new A();
a.m1(); // 正确
}
}
public class B extends A {
public static void main(String[] args) {
B b = new B();
b.m1(); // 正确
A a = new A();
a.m1(); // 'm1()' has protected access in 'p1.A'
}
}
原以为虽然B和A不在一个包中,但B是A的子类,所以在B中a是可以调用m1的,结果发现不行,但是在同一个包中的C类中的a可以调用m1。
m1的访问修饰符为缺省时:
当m1的访问修饰符为缺省时,m1只具有访问包内访问权限,B继承了A也不会获得A的m1方法。
public class A {
void m1() {
System.out.println("m1");
}
}
public class C extends A {
public static void main(String[] args) {
C c = new C();
c.m1(); // 正确
A a = new A();
a.m1(); // 正确
}
}
public class B extends A {
public static void main(String[] args) {
B b = new B();
b.m1(); // 编译不通过,'m1()' is not public in 'p1.A'. Cannot be accessed from outside package
A a = new A();
a.m1(); //'m1()' is not public in 'p1.A'. Cannot be accessed from outside package
}
}
从以上的提示信息可以看出,即使是A类的对象访问自己的实例方法,如果在包外访问也只能访问public方法。但是如果在包内访问,如果是在包中的其他类中,可以访问缺省和protected方法。
最后
以上就是安静百合为你收集整理的java中缺省访问修饰符和protected的一个理解误区的全部内容,希望文章能够帮你解决java中缺省访问修饰符和protected的一个理解误区所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复