Java中特殊符号"."的深入理解及protected的访问权限分歧
在深入理解前让我们看一段代码
Q : 为什么会报错?
A : 因为你在A的类中声明clone方法
Q : 真的是因为这个原因吗?
众所周知,所有的class类都是默认继承object类
虽然clone()在Object中被protected修饰
但根据protected的原理(同包同类子类中都能调用)
这里的clone()应该可以被调用才对
为什么会报错呢?
搞清楚这个问题前
让我们现在搞清楚什么是访问权限
访问权限 : 方法的提供者和方法调用者之间的关系
案例中
方法的提供者:java.long.Object
方法的调用者:com.Diao.test.java.test.A
可按照同包同类子类的依据
A是Object的子类,为什么不能调用Object的clone()方法呢?
这里我们再一次要先搞清楚"."的真正用法
让我们来看一段代码
User user = new User();
user.name = "魔都大迪奥"
这一段代码大家如果用语言表达?
我相信大部分人会这么说
创建一个User的对象
用对象调用 name 的属性 , 然后给name赋值 “魔都大迪奥”
但真的是这样说的吗?!
其实这一段代码应该这么说
创建一个User的对象
给对象的name属性 , 赋值叫 “魔都大迪奥”
这两句话看似没什么区别,其实区别很大
第一种说法是对象为主动
第二种说法是对象为从属关系
所以 “.” 不叫调用,而是叫从属关系
所以案例中的方法调用者应该是这样的
方法的提供者:java.long.Object
方法的调用者:com.Diao.test.java.test.TestProtected
那第二个问题来了,TestProtected的类也是继承Object,为什么也报错呢?
我们可以举一个生活中的例子 :
正常情况下
张三的父亲 和 李四的父亲
不是同一个人
但是他们各自回到家中,都要叫自己的父亲为爸爸
这里原理也是一样的 (画图演示)
图中,我们就能清晰的看到
TestProtected类的Object类
和
A类的Object类
不是同一个
所以
他们之间的关系不满足protected的同包同类子类的条件
因此这也就是为什么
a.clone()
会报错的真正原因