2015-08-29 38 views
2

通过继承我知道所有类都从Object类继承方法。类似地,如果我们用其他方法扩展一个类,它也继承方法。那么,为什么我们可以调用其他类不能继承保护的方法,从Object类为什么在同一个包中使用继承无法访问受保护的clone()方法

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 { 

} 

调用inheritate方法在上面的文件,我可以能够使用的TestClass的实例,然后访问someClassSpecificMethod为什么我就不能访问克隆方法?

回答

1

只有在您正在访问的类中声明方法时,才可以从您自己的包中访问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(); 
2

由于clone不驻留在同一个包中CloneableTest一个类定义的,而someClassSpecificMethod是。一个类只能访问从它的父类继承的受保护的方法,即使它继承自其他类的同一父类,它仍然不能从另一个类访问该方法。这对于protected背后的意图是非常有意义的:它是基类向其子类提供的公共API,但不是该类的客户端。

由于protected严格比封装专用宽,您总是可以访问protected方法,如果它是封装专用的,您可以访问,someClassSpecificMethod也是如此。

相关问题