浅谈 Java 的 protected 修饰符,“子类实例可以访问其从基类继承而来的 protected 方法,而不能访问基类实例的protected方法“ 的理解

博文介绍

        在学习的过程中,发现之前很久都没考虑过的问题。protected 与 default 的区别,和真正的

的使用场景。特此,分享下相关的理解,如有不对的地方请指教,感谢!

作用分析:为了保证系统安全,JDK核心的函数不被其外部调用,防止滥用造成系统安全问题。

场景分析

什么情况下,使用访问修饰符呢?对于该类重要且核心的函数,不想对外提供入口。

例如:人类的精神网络决策分析函数,只限于人去使用,而不想对外提供开放出去。

权限分析

Public : 完全放开权限,可以修饰类、变量、和方法;

Protected : 受保护的权限,可以修饰变量和方法在同包或者子类中访问;

Default : 默认的权限,可以修饰类、变量和方法,同包的类可以访问。

Private : 私有的权限,可以修饰变量和方法,只能在本类中访问。

结论推导

由于 protected 和 default  权限的问题,产生了 "包的可见性" 的概念延伸;

对于 protected 和 default  同包下,所有类都可以访问实例的属性和方法;

对于 protected 和 default  不同包下,所有类都不可以访问实例的属性和方法;

但 protected 除子类外,可以通过继承的方式访问,而不能通过 new 基类的形式调用其方法;

而孙类继承子类后,不同包可以通过 "继承的方式" 访问基类的方法。

总结:受保护的函数,子类可以通过继承的方式访问,但不能实例化基类进行访问。

疑问:通过实例化基类的方式,为什么不能访问呢?因受限于 "包的可见性",遵循定义规范。

代码附录

基类 :包目录 package com.example.utils.study.C;

package com.example.utils.study.C;

public class Father {
    protected int money = 10000;// 1万欧元
}

子类:包目录 package com.example.utils.study.B;

package com.example.utils.study.B;

import com.example.utils.study.C.Father;

public class Son extends Father {

    protected int money = 20000; // 2万欧元

    public int accessFatherMoney() {
        return super.money;
    }

    public static void main(String[] args) {
        System.out.println(new Son().accessFatherMoney());
    }
}

孙类:包目录 package com.example.utils.study.A;  

package com.example.utils.study.A;

import com.example.utils.study.B.Son;

public class GrandSon extends Son {
    public int accessFatherMoney() {
        return super.money;
    }

    public static void main(String[] args) {
        System.out.println(new GrandSon().accessFatherMoney());
    }
}

希望得到你的参与和支持。 如果内容有描述不恰当的地方,请指出。 谢谢!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值