【问题标题】:why protected clone() method is not accessible using inheritance in same package为什么使用同一包中的继承无法访问受保护的克隆()方法
【发布时间】:2023-04-08 20:34:01
【问题描述】:

我知道通过继承所有类都从 Object 类继承方法。类似地,如果我们用另一个类扩展一个类,它也会继承方法。那为什么我们可以从其他类调用继承的保护方法而不能从Object类调用继承方法

package com.core.test;

public class CloneableTest {
    public static void main(String[] args) {
        Testclass test= new Testclass();        

        test.someClassSpecificMethod();
        test.clone();  //ERROR AT tHIS LINE why                  
    }
}

class SomeClass implements Cloneable {

    protected void someClassSpecificMethod(){

    }
}

class Testclass extends SomeClass {

} 

在上面的文件中我可以使用 Testclass 的实例访问 someClassSpecificMethod 那么为什么我不能访问 clone 方法?

【问题讨论】:

    标签: java inheritance protected cloneable


    【解决方案1】:

    因为clone 没有在与CloneableTest 位于同一包中的类中定义,而someClassSpecificMethod 是。一个类只能访问它从其父类继承的受保护方法,即使它与另一个类继承自同一个父类,它仍然不能访问另一个类的方法。这完全符合 protected 背后的意图:它是基类向其子类提供的公共 API,但不向类的客户端提供。

    由于protected 比包私有更宽,您始终可以访问protected 方法,如果它是包私有的,您可以访问该方法,someClassSpecificMethod 就是这种情况。

    【讨论】:

      【解决方案2】:

      只有在您正在访问的类中声明了这些方法时,您才能从自己的包中访问类的protected 方法。类和它的方法都必须在同一个包中,否则它是行不通的。由于Objectclone 方法在java.lang 包中声明为Object 的一部分,因此您无法访问clone,除非您还在包中声明了覆盖:

      class SomeClass implements Cloneable {
          @Override
          protected Object clone() {
              ... // Do something here
          }
      }
      

      现在你可以从同一个包中调用clone,只要你声明一个SomeClass类型的变量:

      SomeClass sc1 = new SomeClass();
      SomeClass sc2 = (SomeClass)sc1.clone();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-14
        • 2020-09-09
        • 2015-03-26
        • 2016-03-17
        • 2012-03-21
        相关资源
        最近更新 更多