【Java】你真的理解父子类的含义吗? protected关键字你真的会用吗?

  • 如代码第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();
    }
}

在这里插入图片描述

用博客见证成长,用行动证明我在努力。
如果你有缘看到我博客,对你有帮助、喜欢博客内容,请“点赞” “评论”“收藏”一键三连哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值