• Java-访问修饰符


    目录

    一、private(私有权限)

    二、default(默认权限)

    三、protected(受保护权限)

    ​四、public(公共权限)

    五、总结

    示意图 

    private(default)protectedpublic
    本类YesYesYesYes
    同包的类NoYesYesYes
    不同包的父子关系NoNoYesYes
    不同包的非父子关系NoNoNoYes

    注意点:外部类只能由public或不写修饰符(default)修饰。

    一、private(私有权限)

    1、可以修饰成员属性构造方法(若是修饰了构造函数,且构造函数只有一个,则该类不能在外部类创建对象,或者被其他类继承(因为继承时,会先调用父类的构造函数),其他修饰符按照各自修饰范围限制)成员方法内部类,不能修饰外部类

    2、被private修饰的成员,只能在定义它们的类中使用(也就是定义类的{},大括号里面),在其他类中不能访问。

    二、default(默认权限)

    默认不写修饰符,就是默认权限,不能主动写default关键字,否则编译器会报错。

    1、成员属性构造方法成员方法都能使用默认权限,只需不写任何修饰符关键字即可。

    2、默认权限即同包权限,同包权限只能由本类以及同包的类访问。

    三、protected(受保护权限)

    1、可以修饰成员属性构造方法成员方法内部类

    2、被protected修饰的成员,能在定义它们的类或同包的类被访问。

    3、如果有不同包的类想访问调用它们,那么这个类必须是定义它们的类的子类。(在该类的{}中,通过this或者创建该类的对象访问它们,不能通过创建定义类对象访问)。

    如下图,Test类的msg成员属性被protected修饰符修饰,

    不同包下的Red想要访问msg属性,则只能通过继承Test类,然后通过this.msg访问,或创建Red对象red,通过red.msg访问。

    在Red类中,创建Test对象test,不能通过test访问msg。

    四、public(公共权限)

    1、可以修饰成员属性构造方法成员方法

    2、被public修饰的成员,可以在任何一个类中被调用,不管同包或不同包,是权限最大的一个修饰符。

    五、总结

    判断是否可访问成员的逻辑:

    类A若想通过对象(类B或类B的子类)访问类B的成员,先判断对象是否拥有该成员(例如对象类型是类B的子类,子类是否能正常继承类B的成员),若是对象拥有该成员,则根据成员的修饰符、类A与类B(定义成员的类)的关系(是否在同一个包、是否是父子关系等)判断是否可访问该成员。

    例如类A中,通过创建类C(继承了类B)对象c访问类B的成员msg,因为类B的msg属性修饰符为protected,所以类C能继承类B的msg属性,且类A和类B在同一个包中,符合protected的要求,所以在类A中,能通过c访问msg属性。

    假设将类A移到类C包中,没与类B在同一个包中,且类A没继承类B,则不符合protected的要求,所以无法通过c对象访问msg属性。

    如想访问到类B的msg属性,只能与类B同一个包,或者继承类B,在类A中通过this.msg或者创建类A的对象访问msg属性。

    参考

    Java访问修饰符全面详细介绍_努力努力再努力c.的博客-CSDN博客_java访问修饰符

  • 相关阅读:
    【深入理解C++】RTTI、dynamic_cast、typeid()
    我真的不想再用mybatis和其衍生框架了选择自研亦是一种解脱
    快速上手Linux核心命令(四):文件内容相关命令
    平衡二叉搜索树--AVL树
    交易积累-RSI
    登录ip地址异常怎么办
    JDK API Diff Report Generator-Java版本对比工具
    【Vue框架】vue路由导航守卫
    3.primitive主数据类型和引用 认识变量
    自定义表单工具好用的优点是什么?
  • 原文地址:https://blog.csdn.net/weixin_37607613/article/details/126543397