Java SE 面向对象编程的3个常用接口
作者:wwzzzzzzzzzzzzz? 发布时间:2023-01-14 06:42:32
标签: Java,SE,面向对象,编程,接口
1.Comparable
前言,想要排序Student.有代码:
import java.util.Arrays;
class Student {
public int age;
public String name;
public double score;
public Student(int age, String name, double score) {
this.age = age;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", score=" + score +
'}';
}
}
public class TestDemo {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student(12,"niubi",99.9);
students[1] = new Student(20,"liuren",18.9);
students[2] = new Student(80,"laoren",50.9);
System.out.println(Arrays.toString(students));
Arrays.sort(students);
System.out.println(Arrays.toString(students));
}
}
此代码运行报错:
原因: 没有告诉要如何进行排序,是年龄还是姓名还是分数.没有告诉比较的规则
解决方式:
如果自定义的数据类型 进行大小比较 一定要实现可以比较的接口
import java.util.Arrays;
class Student implements Comparable<Student>{
public int age;
public String name;
public double score;
public Student(int age, String name, double score) {
this.age = age;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", score=" + score +
'}';
}
//谁调用这个方法 谁就是this
@Override
public int compareTo(Student o) {
//return this.age - o.age;//从小到大
return o.age - this.age;//从大到小
}
}
public class TestDemo {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student(12,"niubi",99.9);
students[1] = new Student(6,"liuren",18.9);
students[2] = new Student(80,"laoren",50.9);
System.out.println("比较前 "+Arrays.toString(students));
Arrays.sort(students);//默认从小到大排序
System.out.println("比较后 "+Arrays.toString(students));
}
}
如果要 分数比较 和 姓名比较
//谁调用这个方法 谁就是this
@Override
public int compareTo(Student o) {
//return this.age - o.age;//从小到大
//return o.age - this.age;//从大到小
return (int) (this.score - o.score);//分数排序
return this.name.compareTo(o.name);//姓名排序
}
缺点: 这个接口对类的侵入性非常强.一旦写好了,不敢轻易改动.
如何降低对类的侵入性呢?
使用Comparator
2.Comparator 比较器
import java.util.Arrays;
import java.util.Comparator;
class Student1 {
public int age;
public String name;
public double score;
public Student1(int age, String name, double score) {
this.age = age;
this.name = name;
this.score = score;
}
@Override
public String toString() {
return "Student{" +
"age=" + age +
", name='" + name + '\'' +
", score=" + score +
'}';
}
}
class AgeComparator implements Comparator<Student1>{
@Override
public int compare(Student1 o1, Student1 o2) {
return o1.age - o2.age;
}
}
class ScoreComparator implements Comparator<Student1>{
@Override
public int compare(Student1 o1, Student1 o2) {
return (int) (o1.score - o2.score);
}
}
class NameComparator implements Comparator<Student1>{
@Override
public int compare(Student1 o1, Student1 o2) {
return o1.name.compareTo(o2.name);
}
}
public class TestDemo1 {
public static void main(String[] args) {
Student1[] students1 = new Student1[3];
students1[0] = new Student1(12,"niubi",99.9);
students1[1] = new Student1(6,"liuren",18.9);
students1[2] = new Student1(80,"laoren",50.9);
System.out.println("比较前 "+Arrays.toString(students1));
AgeComparator ageComparator = new AgeComparator();
Arrays.sort(students1,ageComparator);
System.out.println("比较后(按年龄) "+Arrays.toString(students1));
ScoreComparator scoreComparator = new ScoreComparator();
Arrays.sort(students1,scoreComparator);
System.out.println("比较后(按姓名) "+Arrays.toString(students1));
NameComparator nameComparator = new NameComparator();
Arrays.sort(students1,nameComparator);
System.out.println("比较后(按分数) "+Arrays.toString(students1));
}
}
运行结果:
优点:对类的侵入性非常弱.
3.Cloneable
面试问题:
你知道Cloneable接口吗?为啥这个接口是一个空接口?有啥作用?
空接口 -> 标志接口 -> 代表当前这个类是可以被克隆的.
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 TestDemo2 {
public static void main(String[] args) throws CloneNotSupportedException {
Person person = new Person();
person.age = 99;
Person person2 = (Person) person.clone();
System.out.println(person.age);
System.out.println(person2.age);
System.out.println("==========");
person2.age = 199;
System.out.println(person.age);
System.out.println(person2.age);
}
}
运行结果:
注意事项:
1.引用的对象要想被克隆,必须实现Cloneable接口.
2.必须重写克隆方法,并且声明异常.
来源:https://blog.csdn.net/wwzzzzzzzzzzzzz/article/details/121453238
0
投稿
猜你喜欢
- 有段时间没有写博客了,也在努力的从传统单机开发向分布式系统过度,所以再次做一些笔记,以方便日后查看。直接进入正题吧,今天记录spring-b
- 本文介绍了android APP登陆页面适配的实现,分享给大家,具体如下:先看效果图。登陆首页效果图原理为RootView增加监听事件,然后
- C#实现修改文件的创建、修改和访问时间方法,主要是用到了File类的SetCreationTime、SetLastWriteTime、Set
- Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、PROXOOL等DB池的优点,同时加入了日志监控,可以很好的
- 调用微信接口前需要准备的内容。1.微信公众平台的appid2.微信公众平台的secret3..获取tokenid4.获取ticket5.生成
- 一、实现方式@ConfigurationProperties 注解(最好加上前缀prefix=“person”,标明是和配置文件中哪个开头的
- 显示一个计时器开始计时,当计时器到达15s的时候,停止计时。此时页面多一个重置按钮,可再次进行计时。页面布局<LinearLayout
- 1. 服务端配置java启动命令增加以下参数即可:-Dcom.sun.management.jmxremote \-Dcom.sun.man
- 求一个n阶行列式,一个比较简单的方法就是使用全排列的方法,那么简述以下全排列算法的递归实现。首先举一个简单的例子说明算法的原理,既然是递归,
- 一、链表的介绍什么是链表链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结
- 前言 图片加水印:Springboot 图片需要添加水印,怎么办? 1秒就实现那么word文档替换文字、插入图片,当然也是1秒钟了
- 最近工作需要,自定了一个颜色选择器,效果图如下:颜色种类是固定的,圆环上有个指示器,指示选中的颜色,这个定义起来应该是很简单了,直接上代码。
- 什么是Java类库在编写程序的时候,通常有很多功能是通用的,或者是很基础的,可以用这些功能来组成更发杂的功能代码。比如文件操作,不同程序对文
- 前言之前一篇文章介绍了基本的统一异常处理思路: Spring MVC/Boot 统一异常处理最佳实践.上篇文章也有许多人提出了一些问题:如何
- 对于生成的sql语句 自动加上单引号的情况mybatis是这样的,如果表的字段跟系统字段冲突,写sql语句的时候必须得加上单引号,这样才会区
- package mymaven; import java.net.UnknownHostException; imp
- 一、引言在刷算法的时候经常需要对数组进行排序,第一反应就是直接使用java.util包下的Arrays.sort()方法直接排序。但在刷算法
- 作为程序员,开发完一段代码,实现了某个功能时,有必要知道:我的程序需要多长时间?是什么导致我的程序消耗很多内存?比如,统计或者处理了一大批数
- 在进行一个表达式的计算时,先将表达式分割成数字和字符串然后利用出入栈将分割后的表达式进行中缀转后缀,再将后缀表达式进行计算得到结果(思想在上
- 这两天Google更新了Android Studio 1.2正式版,新版本的设置界面大变面,设置条目较旧版本进行了归类,不像以前那样列表长长