受保护的访问修饰符如何工作以及它与访问Object类克隆方法有何不同

时间:2017-10-28 10:46:10

标签: java clone protected

class Parent implements Cloneable{

    int i ;

    Parent(){

    }
    Parent(int i){
        this.i = i;
    }

    public Object clonemyobj() throws CloneNotSupportedException{
        return this.clone();
    }

    protected Object cloneme() throws CloneNotSupportedException {
        return this.clone();
    }

}

class Child extends Parent{

}

public class CloneDemo{
    public static void main(String... ar) throws CloneNotSupportedException 
    {
        Parent p = new Parent(10);

        Object o1 = p.cloneme();
        // 1. cloneme() is a protected method in parent class i am able to access it

        //Object o2 = p.clone();
        // 2. the above line shows clone() has protected access in java.lang.object
        // but that should be the same with cloneme() method in parent class 
        // why?
        Object o = new Object();

        Child c = new Child();
        //3. o.clone();
        c.cloneme(); 
        //4.(c.cloneme()) is a protected method in parent class
        // but still able to access it using child class object
    }
}

以上所有课程都在同一个课程中。

  1. 任何人都可以向我提供以上四个要点的解释吗?
  2. 这些会如何执行?

1 个答案:

答案 0 :(得分:0)

protected方法可以在同一个类及其子类中访问,也可以在同一个包中使用类。由于您的类不在java.lang包中,因此只能为您自己的类及其子类的对象访问clone java.lang.Object方法。

相比之下,protected中声明的Parent方法可以从CloneDemo访问,因为ParentCloneDemo位于同一个包中。

但请注意,您可以覆盖 clone()方法,即如果您添加

protected Object clone() throws CloneNotSupportedException {
    return super.clone();
}

Parent,您没有更改语义,但Parent.clone()现在可以从CloneDemo访问,ParentCloneDemo位于同一个包中。因此,clone()现在可以在ParentChild的实例上调用 <ListView x:Name="listView" Margin="0,39,0,0"> <ListView.View> <GridView x:Name="gridView"/> </ListView.View> </ListView>