Python 每日一记281@Object.clone()方法中protected访问权限问题

我最初理解的protected访问权限

protected 修饰的类和属性,对于自己、本包和其子类可见;

实际的protected访问权限

对于protected的成员或方法,要分子类和超类是否在同一个包中。
与超类不在同一个包中的子类,只能访问自身从超类继承而来的受保护成员或者方法,也就是说,只能在子类的内部,使用父类的方法,而这个方法是继承来的,而不能访问超类实例本身的受保护成员方法,也就是说,不能再另外一个第三方的类中,用子类调用成员方法,试想一下,子类和父类有一下秘密,这个秘密只能父类和子类自己内部知道,现在有个隔壁老王,不是和父类在一个包中,但是和子类在一个包中,现在老王如果可以使用子类调用受保护的方法,岂不是知道了父类和子类的秘密,这是很危险的。
另外如果在相同包时,protected和public是一样的;

一个小例子

mypackage中是Test1,访问权限是protected,mypackage2中是extendsTest1,继承Test1,这里面实例化extendsTest1时可以直接访问printk()方法,但在mypackage2中的Test2中实例化extendsTest1,却不能访问printk()方法
在这里插入图片描述
在这里插入图片描述

关于clone的访问权限问题

protected方法,只能是子类内部或者同一个包中的其他类可以使用,这里你的自己的类肯定不会和Object在一个包内,因此必须子类才能使用,Object是所有类的父类,因此在你自定义的这个类的内部是可以使用clone这个方法的,但是问题就在这里,如果你想克隆类A,你不能在一个包含类A的类B内,使用A.clone方法,这会编译器报错‘clone() has protected access in ‘java.lang.Object’’;
但是如果在类A内部使用A.clone方法,虽然不会编译器报错‘clone() has protected access in ‘java.lang.Object’’,却会报错Unhandled exception:java.lang.CloneNotSupportedException,这已经不是刚才的protected访问权限的问题了,这个问题的原因是如果一个类没有实现Cloneable接口,或者一个子类试图重写clone方法都会抛出CloneNotSupportedException这个异常,因此必须对这个类实现Cloneable接口,并且将clone()方法重写为public。

具体查看一下链接,写的很好:
由Object.clone()方法引出的访问权限问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值