黑马程序员技术交流社区

标题: 关于java继承的一个问题 [打印本页]

作者: 鲍霄霄    时间: 2012-7-17 19:17
标题: 关于java继承的一个问题
今天遇到这么一个问题:
java的Object对象有个clone方法,这个方法的修饰符是protected,如果我设计一个Class去继承Object,要使用这个clone一定要实现一个Cloneable的接口,这是为什么,我原本以为继承的protected方法就能直接用了?
作者: 苑占丽    时间: 2012-7-17 19:57
因为带有protected的方法不能被子类去继承呀,是被保护的方法,


实现接口Cloneable的类应该使用公共方法重写 Object.clone(它是受保护的)。

此接口虽不 包含 clone 方法。
但也要实现它,因为只有实现了 Cloneable 接口,才能指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。
因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。

作者: 梁小波    时间: 2012-7-17 20:50
苑占丽 发表于 2012-7-17 19:57
因为带有protected的方法不能被子类去继承呀,是被保护的方法,

因为带有protected的方法不能被子类去继承呀,是被保护的方法,
这句话有点歧义吧,protected是可以说是专门为了被子类继承,防止外类访问的方法,怎么能说不可以被子类继承呢?
不过clone()这个方法还真学习了一下,
作者: 高欢欢    时间: 2012-7-17 22:38
Cloneable 接口   ·public interface Cloneable此类实现了 Cloneable 接口,以指示 Object.clone() 方法可以合法地对该类实例进行按字段复制。   如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException  异常。
注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。





·cloneable接口是一个标志性的接口,实现他可以不实现任何方法。使用了它就标志这个类可以复制,如果想实现深层次的克隆,那就要重载clone()方法。



·若需要修改一个对象,同时不想改变调用者的对象,就用克隆,   
    先用implements   Cloneble实现Cloneble接口,   
    再实现clone();




作者: 苑占丽    时间: 2012-7-17 22:38
梁小波 发表于 2012-7-17 20:50
因为带有protected的方法不能被子类去继承呀,是被保护的方法,
这句话有点歧义吧,protected是可以说是专 ...

嗯,非常感谢你的指正,是我掌握的不精。。。。
作者: 苑占丽    时间: 2012-7-17 22:39
王艺霖 发表于 2012-7-17 21:38
protected修饰符 同一个类中  同一个包中    不同包中的子父类中 都可以访问   只有在不同包中不可以访问 ...

嗯,非常感谢你的指正,是我掌握的不精。。。。
作者: 苑占丽    时间: 2012-7-17 22:40
苑占丽 发表于 2012-7-17 19:57
因为带有protected的方法不能被子类去继承呀,是被保护的方法,

嗯,非常感谢你的指正,是我掌握的不精。。。。有点想当然了。惭愧。。。
作者: 张世威    时间: 2012-7-18 00:18
1、Cloneable是一个标记接口,没有成员,只有实现了接口,成为它的子类,jvm才允许这个子类
重写clone方法。标记接口,就好像在你身上贴个标记,有这个标记的人才可以到这个论坛来转悠。
  还有一个标记接口Serializable,实现了它,标志你能被序列化,即能往外设里面写。

2、这样的标记给java虚拟机好确认:只有拥有什么-----才能干什么;
否则jvm就给你抛出异常。CloneNotSupportedException 你不支持拷贝
3、对应Cloneable方法,它是为一个对象在内存中创建一个同卵兄弟,这兄弟两个拥有完全相同的东西,不过它们不能共享任何相同的东西,就是说它们身上的任何一个元素,都有2份。

4我写一个实现Clone方法的小例子,代码如下:
  public class CloneExp implements Cloneable {

        private String name;
        private String address;
        private int age;
        private Department depart;

        public CloneExp() {

        }

        public CloneExp(String aName,String address, int aAge, Department aDepart) {

                this.name = aName;
                this.address=address;
                this.age = aAge;
                this.depart = aDepart;
        }

        protected Object clone() throws CloneNotSupportedException {

                CloneExp clone = (CloneExp) super.clone();

                // 执行Department的一个浅拷贝
                clone.depart = (Department) depart.clone();
                return clone;

        }

        public static void main(String[] args) {
                Department aDepart=new Department("销售部");
                CloneExp ce = new CloneExp("张三","湖北",30,aDepart);
                CloneExp cloned=null;

                try {
                        // 执行CloneExp的深拷贝
                         cloned = (CloneExp) ce.clone();
                } catch (CloneNotSupportedException e) {
                        e.printStackTrace();
                }
               
                /*
                 * 测试:①x.clone() != x   真
                 *  ②x.clone().getClass() == x.getClass() 真
                 *  ③x.clone().equals(x)  真
                 */
                System.out.println(cloned!=ce);
                System.out.println(cloned.getClass()==ce.getClass());
                System.out.println(cloned.equals(ce));

        }
}
class Department implements Cloneable{
        private String depname;
       
        public  Department(){
               
        }

        public boolean equals(Department dep) {
                // TODO Auto-generated method stub
                return depname.equals(dep.depname);
        }
        public Department(String depname){
                this.depname=depname;
        }
        @Override
        protected Object clone() throws CloneNotSupportedException {
                // TODO Auto-generated method stub
                Department clone=(Department)super.clone();
                return clone;
        }
       
       
}        




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2