- 如代码第23行,User05 的对象user,为什么不能直接调用Object类中受保护的clone()方法呢?
/**
* @author Nien
* @create 2020-05-25
*/
public class Java05_Access {
public static void main(String[] args) throws Exception {
User05 user = new User05();
// protected访问权限 : 调用者和提供者满足同类,同包,子类
// 方法的提供者:java.lang.Object
// 方法的调用者:com.atguigu.bigdata.java.chapter06.Java05_Access
/* 问题1:方法的调用者不是User05?
对,点的作用只是从属关系,并不是调用关系,
真正的调用者是com.atguigu.bigdata.java.chapter06.Java05_Access
*/
/* 问题2 : Java05_Access和Object没有父子关系?
有父子关系但是每一个类的对象都会构建一个自己的Object父类
以下不能调用clone方法的原因是Java05_Access调用自己的父类Object中的方法可以,
但是通过User调用他的父类Object中的方法是不可以的,内存结构如图一所示
*/
// user.clone(); 无法调用
Java05_Access user2 = new Java05_Access();
//可以调用自己父类中的方法,满足父子关系
user2.clone();
}
}
//声明一个类默认会继承Object类,同时继承Object中的方法
class User05 {
}
- 正确的内存结构理解,图一:
- 错误的内存结构理解,图二:
- 为什么图二是错误的呢,话不多说用代码来证明:
package com.atguigu.bigdata.java.chapter06;
/**
* @author Nien
* @create 2020-05-25
*/
public class Java06_Object {
public static void main(String[] args) {
User06 user1 = new User06();
User06 user2 = new User06();
//以下输出结合图二是理解不了的,结合图一就很好理解
System.out.println(user1.hashCode());//856419764
System.out.println(user1.superHashCode());//856419764
System.out.println(user2.hashCode());//621009875
System.out.println(user2.superHashCode());//621009875
}
}
class Person06{
public void test(){
System.out.println("person test");
}
}
class User06 extends Person06{
@Override
public void test(){
System.out.println("User06 test");
}
public void superTest(){
super.test();
}
public int superHashCode(){
return super.hashCode();
}
}
- 成员方法会动态绑定到com.atguigu.bigdata.java.chapter06.AAA,属于同一个包,所以下面代码可以调用。
package com.atguigu.bigdata.java.chapter06;
/**
* @author Nien
* @create 2020-05-25
*/
public class Java08_Clone {
public static void main(String[] args) throws CloneNotSupportedException {
AAA aaa = new AAA();
//方法的提供者:com.atguigu.bigdata.java.chapter06.AAA
//方法的调用者:com.atguigu.bigdata.java.chapter06.Java08_Clone
aaa.clone();
}
}
class AAA {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
- 编译看左边,左边决定提供者,反编译后显示提供者是java.lang.Object,不属于同一个包,所以以下代码不能调用clone方法
package com.atguigu.bigdata.java.chapter06;
/**
* @author Nien
* @create 2020-05-25
*/
public class Java08_Clone {
public static void main(String[] args) throws CloneNotSupportedException {
Object aaa = new AAA();
//方法的提供者:java.lang.Object
//方法的调用者:com.atguigu.bigdata.java.chapter06.Java08_Clone
//aaa.clone();无法调用
}
}
class AAA {
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
用博客见证成长,用行动证明我在努力。
如果你有缘看到我博客,对你有帮助、喜欢博客内容,请“点赞” “评论”“收藏”
一键三连哦!