2020.7.19 + 周报(2)

一、今日学习内容      每周周报

   1、对象中的克隆

   (1)克隆的限制

         Java对于克隆(Clone)有一些限制, 主要表现如下:

         a.被克隆的类必须自己实现Cloneable接口,以指示Object.cloneO) 方法可以合法地对该类实例进行按字段复制。Cloneable接口实际上是个标识接口,没有任何接口                方法。

         b.实现Cloneable接口的类应该使用公共方法重写Object.clone (它是受保护的)。某个对象实现了此接口就克隆它是不可能的。

         c.在Java.lang Object类中克隆方法是这么定义的:

                protected object clone()
                throws CloneNotSupportedException

               创建并返回此对象的个副本。 表明是一个受保护的方法, 同个包中可见。 按照惯例,返回的对象应该通过调用super.clone 获得。

     (2)浅层克隆和深层克隆            

            a.浅层克隆:主要复制基本对象的值。
            b.深层克隆:当类存在聚合关系时,克隆就必须考虑聚合对象的克隆。可以复制引用类型的字段。

          示例:浅层克隆

 1 public class CloneDemo (
 2 publte Btatie vold main(string[] args) throws CloneNotSupportedException {
 3      Person P =new Person("任我行",35);
 4      Person p2= (Person)p.clone();
 5      System. out.println("克隆前: "+p.getName()+", "+p.getAge());
 6      System. out.println("克隆后: "+p2 .getName()+", "+p2.getAge());
 7     if (p==p2)
 8       System.out.println("p和p2的地址相等!");
 9     else
10        System.out. println("p和p2的地址不相等!!");
11     }
12 }
13 /**
14 *简单类克隆实现
15 *要实现克隆,必须实现Cloneable接口,这是一个标识接口,没有接口方法
16 *实现了Cloneable接口,以指示object.clone() 方法
17 *可以合法地对该类实例进行按字段复制
18 *按照惯例,实现此接口的类应该使用公共方法重写object.clone (它是受保护的)
19 */
20 class Person implements Cloneable{
21     private String name;
22     private  int age;
23     public Person(String name,int age) {
24        this.name=name;
25        this .age=age;
26     }
27    public String getName() {
28       return name;
29     } 
30    public void setName (String name){
31        this.name=name;
32    }
33    public int getAge(){
34       return age ;
35     }
36    public void setAge (int age) {
37       this.age = age;
38    }
39    @Override
40    protected objéct clone () throws CloneNotSupportedException{
41    return super.clone();
42    }
43 }

         结果:

         示例:深层克隆

 public class CloneDemo (
 publte Btatie vold main(string[] args) throws CloneNotSupportedException {
      Person Per =new Person("令狐冲",20);
         P p=new P(per);
      P p2= (P)p.clone();
     System. out.println("克隆前: "+p.getPer().getName()+", 
        "+p.getPer().getAge());
      System. out.println("克隆后: "+p2.getPer().getName()+", 
         "+p2.getPer().getAge());
    if (p==p2)
      System.out.println("p和p2的地址相等!");
     else
        System.out. println("p和p2的地址不相等!!");
        if(p.getPer()==p2.getPer())
             System.out.println("p中的person对象和p2中的person对象相等!"); 
        else
             System.out.println("p中的person对象和p2中的person对象不相等!"); 
     }
 }
 
 class P implements Cloneable{
     Person per;
     public P(Person per) {
        this.per=per;
     }
    public Person gePer() {
       return per;
     } 
    public void setPer (Person per){
    }
    @Override
    protected objéct clone () throws CloneNotSupportedException{
        P  p=(P)super.clone();
            P.per=(Person)this.per.clone();
            return p;
   }
}

      结果:

二、遇到的问题

    对于克隆问题还没有理解的很明白

三、明日计划

    继续学习第五章的内容

收获:

     在过去一周学习了第四章和第五章的部分内容,学习了java中的类的相关知识:Java中的方法、构造方法、方法的调用、类的属性、包等,第五章的部分内容:类的继承,以及对象中的克隆。

遇到的问题:

    java类的相关知识与c++中的类的相关知识有些不同,需要及时巩固熟练。

下周计划:

   继续学习第五章、第六章的内容

原文地址:https://www.cnblogs.com/wmdww/p/13341891.html