我是靠谱客的博主 安静百合,最近开发中收集的这篇文章主要介绍java中缺省访问修饰符和protected的一个理解误区,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

结论

对象访问自己的实例方法,在同一个包中的其他类里,可以访问除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的一个理解误区所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部