ObjectOrientedProgramming - 面向对象的编程(三个常用接口)- Java - 细节狂魔(1)

    this.age = age;

    this.name = name;

    this.score = score;

}



@Override

public String toString() {

    return "student{" +

            "age=" + age +

            ", name='" + name + '\'' +

            ", score=" + score +

            '}';

}

}

public class Test {

public static void main(String[] args) {

    Student[] students = new Student[3];

    students[0] = new Student(18,"小明",80.5);

    students[1] = new Student(16,"小红",96.8);

    students[2] = new Student(19,"小刚",81.5);

    System.out.println(Arrays.toString(students));

    Arrays.sort(students);

    System.out.println(Arrays.toString(students));

}

}




### []( )效果图



![在这里插入图片描述](https://img-blog.csdnimg.cn/22778f62f9c646199d3b85f1d110ad3f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



### []( )原因附图



#### []( )进入sort



![在这里插入图片描述](https://img-blog.csdnimg.cn/f8ea59b597cf4419bc357e1ccd1d5100.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/e8e6a6d4c15949e39e5a98868179a7d3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

![在这里插入图片描述](https://img-blog.csdnimg.cn/5db53e068a034c1ab75d3aa261af12f7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

说白了,就是让每个元素都去调用 Comparable。Comparable就是 数组按照某个规律去排序。



* * *



[]( )既然知道了,为什么不能排序的问题所在,那么我们现在应该思考的是如何让告诉sort,以什么去排序数组,来接着看。

----------------------------------------------------------------------------------------------------------------------



### []( )先让 student 类 实现了 Comparable 接口



> ![在这里插入图片描述](https://img-blog.csdnimg.cn/d3c94be674dc4be89bfc27443c28d781.png)  

> 点进 Comparable  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/7b64c04c36224468a84d4b8893660fd8.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_19,color_FFFFFF,t_70,g_se,x_16)  

> 再我们程序上 Comparable 接口后面加上 尖括号,里面写 Student,意为 比较学生  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/8f0f9ee673c64d42a31bff44516504e9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_19,color_FFFFFF,t_70,g_se,x_16)



* * *



> 再来观察一下,接口 Comparable 里还有什么东西、  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/ab4fe5cf1765443996a1b75adbe1ebc5.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/47778f64dca04cd3855022d0c8cd0fa4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



> compareTo 方法是用来比较数组,那就需要看比较 结果是大于0,还是等于0,再者小于0.  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/404f63cf85c6428fa22f91465b8b87e4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/8ac8cc79220c42f2b0ec40e23529c215.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/2762621535e94531b7f5b666e91c2fa8.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/76151e9d83404470a7f40af14364b0d3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> student调用 compareTo方法,所以 compareTo中的this,指的是 student。  

> 即:this.age == student.age , 而 o.age == student2.age.  

> compareTo 按照 两者的年龄大小去比较。  

> 最后通过 swap方法交换位置  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/5db53e068a034c1ab75d3aa261af12f7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



> 再一次执行那个复杂一点的数组排序  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/ab443f83a1a24a3f90a92de8b8067f25.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



> 其实 compareTo 方法还可以简化  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/843acd2b57de4a9980d90c122dcddfd9.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )由上得知 Arrays.sort();默认排序规律是升序(从小到大),那么逆序怎么实现呢?(交换 this.age 与 o.age的位置就可以了)

----------------------------------------------------------------------------------------------------------------------------------------



![在这里插入图片描述](https://img-blog.csdnimg.cn/68808bfa0b194453a057d8ba9e6fa92d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



### []( )总结:



> 如果 自定义的数据类型,要进行大小的比较’ 一定要实现可以比较的接口Comparable。



* * *



> 但是 Comparable 接口存在着缺陷: 如果我们要以学生的分数或者名字来排序,就需要重新 把 compareTo 方法的实现重写一遍,  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/0fd09ac40d764e99b2cb8072f1fc87a3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



> 如果某一天有个朋友抽风了,觉得你用年龄排序不合适,把你的 compareTo 给改了,改成了分数排序。  

> 有的人觉得没问题,但是你有没有想过,这会影响到你后面实现的代码实现逻辑。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/78c0208d69a748438a76c8507ccd7579.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



> 那么通过名字去排序,要怎么写。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/ccd87df7138446e88d69ceb9e53be855.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 由此不难想出,引用之间的比较,肯定是要通过合适的比较方法的, 那么我们就需要去看 String了。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/87a75eac2a1b47209895b410b1c67ddc.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 你会发现 String,也实现了 Comparable 接口  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/53684a8785634904be3272aab06fd994.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 我们 art + 7  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/6ec54c0b3eaf47ab92209f98f9a02ae7.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 那么,如果我们想通过名字排序,就需要compareTo 方法去比较。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/d04dfc8fdfb447c988ded92e672d1fde.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



> Comparable这个接口,有一个非常大的缺点:对类的侵入性非常强,一旦写好,不敢轻易动。  

> 一动,又不会报错,全班人马像是无头苍蝇一样,想想就觉得不能动,不敢动。



* * *



[]( )因为Comparable 的缺陷,很dan疼,所以 Comparator 接口(别称 比较器) 出世了。

===================================================================================================================



[]( )来着跟着我的思路来一步步来看

-----------------------------------------------------------------------------



> 回到最初的情况, 数组无法排序  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/a267cce6773a4a5fbdf4cc72f8a94822.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 先进入sort(Ctrl+左键)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/25befdb2af4e41d2857a4a112a6ea371.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_19,color_FFFFFF,t_70,g_se,x_16)  

> 你会发现sort 有很多的排序规则  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/497d03fb6c384b27807b2914d1aee7e4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



> 现在 我们来创建一个类,该类实现了Comparator接口  

> Ctrl+左键 进入 Comparator 接口  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/56c4decc4f634bb790d64ecd54f8adb4.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/4582f419941a4408bab87818684f1248.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



> 创建一个类来实现 Comparator 接口,并重写当中唯一的抽象方法  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/8fd1e6f91b62418c9e12f4743b3d95c0.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 输出原理,跟前面讲的,是一样的, 大于就返回一个非零数字,等于返回0,小于返回负数  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/3bde6bf8cb6942848892eb13175f0d2a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 由此可以判断出 我们 Comparator接口(比较器)就完成了。  

> 完成了,就要使用。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/727588ac2a13441e8fde123f70efb964.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 这时,我们再点进sort。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/32cd7690465241b1bb2a1326fb1c9c8f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 此时的 Aarrays,sort 就会根据 Comparator 接口(比较器)的规则,进行排序。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/3106dd46792a4604bf0a6d02ed4f17e1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 如果,你们说:我们想用分数来排序。(创建分数比较器就可以了)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/f7d388a4a5d5459bbda8118969220336.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 名字排序也差不多。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/4a5c26d25b404f49b8de7494377af6b8.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 有的朋友会说,这根Comparable 有什么区别,实现方式都是一样的。  

> 有区别!!!  

> Comparable **通过一个类去实现**的,是定死了的。不能乱改。  

> 而Comparator,**是创建一个类 实现它接口的功能**。意味着Comparator 不局限与一个类。  

>    

> 它可以根据 不同比较规则 来创建不同的类来实现。  

> 想用哪种规则去排序,就去调用相对应的类。  

> 即使 有人改了其中规则,也只影响调用此规则的数据,  

> 调用其他规则的数据,则不受影响。  

>    

> 优点:  

> 1.排查效率高  

> 2.代码侵入性低(牵连范围小多了)  

> 3.灵活



* * *



[]( )Cloneable 接口

===========================================================================



[]( )在了解cloneable接口之前,先来了解创建对象的方式

-------------------------------------------------------------------------------------------



### []( )1\. new 关键字



class Person{

public int age;

public void eat(){

    System.out.println("睡");

}



@Override

public String toString() {

    return super.toString();

}

}

public class Test {

public static void main(String[] args) {

    // 通常创建对象,是通过new

   Person person = new Person();



}

}




#### []( )附图



![在这里插入图片描述](https://img-blog.csdnimg.cn/83e40fdc5637450d89d66899c78f56b3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



### []( )2.克隆



> 比如说:上面的程序中,我想 克隆 一个 person 对象。  

> 这里就要使用 调用 clone() 方法  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/505e8012a73e46a586d589530ff4322a.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 那我们就抛出一个异常。快捷键 ALT + ENTER,我们发现  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/715abe8ab9a541bdbdde8815b366025d.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 为了搞清楚原因: Ctrl + 左键点击clone方法,进入clone方法。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/2081d8da1dcc4d66b5ecc2aa023620ad.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 由图得知了 clone方法,是 一个Object的克隆方法,意味着该方法的返回值 是一个Object的类型,那么我们将其类型强转成Person类型  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/136c4cadf5dd4141a75a30fe2f93d036.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_18,color_FFFFFF,t_70,g_se,x_16)  

> 继续 点击 clone ,ALT + ENTER  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/c29031e1f4be4902831595041c7ce770.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 点击 警告  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/8c587cfe9ad243cfaed06c1606f2020f.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_18,color_FFFFFF,t_70,g_se,x_16)  

> 一看无数眼睛中透露着,这是要干什么?感觉就是不让我们去使用 clone方法。  

> 其实最主要的原因是:一个对象要克隆,产生一个副本,那么这个对象,一定是可克隆的。所以我们必须给 Person 类 实现一个 Cloneable的接口。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/979a7c98a60043ee9e1c265cd8a19bfa.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 为了,搞明白 Person类,在没有重写 Cloneable 接口的抽象方法情况下,为什么不报错。我们点击进入Cloneable接口中  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/cf0f72e2cd9544e1b36121d61740476e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_18,color_FFFFFF,t_70,g_se,x_16)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/cfba2b7d64f94466b0a1470f5ad725c3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 因为 Cloneable 是空的,由此引出一个面试问题: 你知道 Cloneable 接口吗?  

> 你说: 知道。  

> 面试官: 你知道为什么这个接口是一个空接口?  

> 你: 没有为什么,这是一个默认的规则  

> 面试官:有什么作用?  

> 你:如果一个接口是空接口,这时有一个类实现了这个空接口,那么这个空接口,又被称为标志接口,代表当前这个类可以被克隆的。  

> 但是有问题! 我们的clone 还是使用不了  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/88300258413342098766e78cead45fec.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_19,color_FFFFFF,t_70,g_se,x_16)  

> 这是 因为 Cloneable 的特殊:实现接口后,虽然不用重写抽象方法,但是我们需要重写 clone 方法。  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/5b1784546fbe43a5b4731b4a1a7e34a3.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/8106162c176a43d09a2b1b07a696d54e.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 选择该选项  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/c2f4c13126654918aaffd7fe30449e57.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 那么在这里,可能有些朋友可能存在疑问:Person 类,默认继承时Object类(父类就是Object的类),那么为什么通过 person 这样的引用,不能调用clone方法?  

>  注意clone方法比较特殊的,在没有重写clone方法之前,其实是可以被调用的,前面我们 进入clone 方法时,它是可以跳转到 clone方法的。说明程序知道你要调用克隆方法,  

> 但是克隆方法的特殊性就是:如果你想使用clone方法,就必须要在一个类中实现Cloneable接口,并重写clone方法,最后还需要处理异常,才能使用,这是规定,



* * *



&ensp:



[]( )我们通过 clone方法,了解到了Cloneable接口,是与 clone搭配使用的。

----------------------------------------------------------------------------------------------------------



> clone 方法 作用: 就和前面 讲数组拷贝时,是一样的,拷贝一份副本。不了解数组克隆的朋友可以去看这篇文章[The Definition And Use OF Arrays - 数组的定义与使用]( ).



### []( )最终代码如下:



class Person implements Cloneable{

public int age;

public void eat(){

    System.out.println("睡");

}



@Override

public String toString() {

    return "Person{" +

            "age=" + age +

            '}';

}



@Override

protected Object clone() throws CloneNotSupportedException {

    return super.clone();

}

}

public class Test {

public static void main(String[] args) throws CloneNotSupportedException {

    // 通常创建对象,是通过new

   Person person = new Person();

   Person person1 = (Person) person.clone();

   System.out.println(person1);

}

}




#### []( )附图



![在这里插入图片描述](https://img-blog.csdnimg.cn/20e21582122d47639c12dae7dd0eade6.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



#### []( )效果图



![在这里插入图片描述](https://img-blog.csdnimg.cn/0d427703dd024d5a9cf1a1bf71d8df83.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)



* * *



[]( )拓展一

------------------------------------------------------------------



> 在上程序中,如果我们 在 创建好对象之后,在进行拷贝,那么 拷贝的内容,是否会随之变化?  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/ace540ef79bc4b8085e7817072f2c2ab.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 如果 此时,我们再对 副本的age进行赋值,会影响 原本 的值吗?  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/b549eebaea0642d3825b977367362c46.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)




### 最后

金三银四到了,送上一个小福利!

![image.png](https://img-blog.csdnimg.cn/img_convert/a94b380bb2b891e460bda808abec4dda.webp?x-oss-process=image/format,png)


![image.png](https://img-blog.csdnimg.cn/img_convert/e7779352848479341afdb1f7b751da29.webp?x-oss-process=image/format,png)

![专题+大厂.jpg](https://img-blog.csdnimg.cn/img_convert/657f3439920f4b9d577c4679b9382c37.webp?x-oss-process=image/format,png)

片描述](https://img-blog.csdnimg.cn/ace540ef79bc4b8085e7817072f2c2ab.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)  

> 如果 此时,我们再对 副本的age进行赋值,会影响 原本 的值吗?  

> ![在这里插入图片描述](https://img-blog.csdnimg.cn/b549eebaea0642d3825b977367362c46.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBARGFyayBBbmQgR3JleQ==,size_20,color_FFFFFF,t_70,g_se,x_16)




### 最后

金三银四到了,送上一个小福利!

[外链图片转存中...(img-LO1am27r-1714433113332)]


[外链图片转存中...(img-wU3dJY02-1714433113333)]

[外链图片转存中...(img-EtEXQ7g3-1714433113333)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值