Java中特殊符号"."的深入理解及protected的访问权限分歧


在深入理解前让我们看一段代码

Java 特殊符号的unicode java中特殊符号_java

Q : 为什么会报错?

A : 因为你在A的类中声明clone方法

Q : 真的是因为这个原因吗?

Java 特殊符号的unicode java中特殊符号_java_02


众所周知,所有的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属性 , 赋值叫 “魔都大迪奥”

这两句话看似没什么区别,其实区别很大
第一种说法是对象为主动
第二种说法是对象为从属关系

所以 “.” 不叫调用,而是叫从属关系

因此clone的实际调用者是TestProtected

所以案例中的方法调用者应该是这样的

方法的提供者:java.long.Object
 方法的调用者:com.Diao.test.java.test.TestProtected

那第二个问题来了,TestProtected的类也是继承Object,为什么也报错呢?

我们可以举一个生活中的例子 :

正常情况下
张三的父亲 和 李四的父亲
不是同一个人
但是他们各自回到家中,都要叫自己的父亲为爸爸

这里原理也是一样的 (画图演示)

Java 特殊符号的unicode java中特殊符号_子类_03


图中,我们就能清晰的看到

TestProtected类的Object类


A类的Object类

不是同一个

所以

他们之间的关系不满足protected的同包同类子类的条件

因此这也就是为什么

a.clone()

会报错的真正原因