Java中一种容易被忽视的访问权限问题

package com.middle.test;

public class Test {
    public static void main(String[] args) {
        A a = new A();
        a.clone(); // 报错 Error:java: clone() 在 java.lang.Object 中是 protected 访问控制
    }
}

class A {}

我们不禁产生一个疑问:对象a父类Object不是有clone()方法的嘛,怎么就没有权限访问了呢?


  1. 首先,我们查看Objectclone()
protected native Object clone() throws CloneNotSupportedException;

protected修饰,说明该方法只能由同包或者子类访问

  1. 搞清方法提供者和调用者

方法提供者:java.lang.Object
方法调用者:com.middle.test.Test 不是com.middle.test.A ( 这是关键点)

那么为什么方法调用者是com.middle.test.Test呢?

a.clone()这里的点(.),并不是说a调用了clone()方法。准确理解,应该是从属的关系。
可以这么理解:在Test的main中,创建了a对象,并调用了a.clone()方法。所以,是Test发号司令,这个调用者是Test

  1. 解释

两个类首先不同包,但是是父子关系的(Test是Object的子类)。那为什么还是访问不了?

Test有自己的一些属性和方法,还有从父类那里继承来的属性和方法
A有自己的一些属性和方法,还有从父类那里继承来的属性和方法
在这里插入图片描述
Test访问A的父亲Object里的protected方法。打个比方就好像:
Test去访问A的爸爸的传家宝,A爸爸当然拒绝,宝贵着呢能给你看?


那么如何才能在Test中使用a.clone()

package com.middle.test;

public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        A a = new A();
        a.clone();
    }
}


class A {
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

这样的话,就是同包访问。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值