Java SE 面向对象编程的3个常用接口

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.必须重写克隆方法,并且声明异常.

到此这篇关于 Java SE 面向对象编程的3个常用接口的文章就介绍到这了,更多相关 Java SE 面向对象编程接口内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Day11基础不牢地动山摇-Java基础

    目录 1.Eclipse开发工具 1.1 Eclipse历史 1.2 快捷键 1.3 Debug调试 1.4 JUNIT测试工具 2.Java基础新特性 2.1 可变参数 2.2 foreach输出 2.3 静态导入 3. JDK三大主要特性--泛型 3.1 泛型的引出 3.2 泛型实现 3.3 通配符 3.4 泛型接口 3.5 泛型方法 4.JDK三大主要特性--枚举 4.1 多例与枚举 4.2 Enum类 面试题:请解释enum和Enum的区别? 4.3 枚举中定义其它结构 4.4 枚举应用

  • JavaSE的三大接口:Comparator,Comparable和Cloneable详解

    进阶JavaSE-三大接口:Comparator.Comparable和Cloneable. Comparable和Comparator这两个接口很相似,都是用于比较大小的接口.在我们写一些数据结构的算法题时,用的比较多,具体是怎么用的,我们接着往下看. Comparator接口: public interface Comparator<T> { public int compare(T o1, T o2); //比较方法 } Comparable接口: public interface Co

  • Java集合之Set接口及其实现类精解

    目录 Set接口概述 HashSet实现类 1.HashSet 具有以下特点: 2.HashSet 集合判断两个元素相等的标准 3.向HashSet中添加元素的过程 LinkedHashSet实现类 TreeSet实现类 Set接口概述 1.Set接口是Collection的子接口,set接口没有定义额外的方法,使用的都是Collection接口中的方法. 2.Set 集合不允许包含相同的元素,如果试把两个相同的元素加入同一个Set 集合中,则添加操作失败. 3.Set:存储无序的.不可重复的数

  • java调用webservice的.asmx接口的使用步骤

    目录 前言 一.接口类型 二.使用步骤 1.访问方式 2.导入的maven 前言 接触到一个.asmx结尾的webservice接口,为了增加记忆决定记录下来. 一.接口类型 已.asmx结尾的接口 例:接口地址:http://IP地址/xxx/service/xxx/xxxx.asmx 方法名:test 参数类型:string 二.使用步骤 1.访问方式 代码如下(示例): controller类: String s = clientUtil.test("http://IP地址/xxx/ser

  • Java编程中使用XFire框架调用WebService程序接口

    JAVA调用webservice,当你刚开始接触的时候你会觉得它是一个恶梦,特别是没有一个统一的标准实现,比起.net的那些几步就可以完成的webservice实现,我们看着JAVA的实现真是伤心啊.但就算是伤心,我们也还是要完成的.JAVA也不乏比较好的实现,如xfire,jersey,CXF. 这里我们就一起来看一下xfire的实现. 1)首先,当然是要下包啦,这个普通人都知道.http://xfire.codehaus.org/Download可以到这里去下,可以下all也可以下distr

  •  Java SE 面向对象编程的3个常用接口

    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 = na

  • 浅谈Java实现面向对象编程java oop

    一.对象的综述 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显得如此高雅和浅显.此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务.每个人都可从中获益,至少表面如此. 所有编程语言的最终目的都是解决企业又或者人在现实生活中所遇到的问题,最初我们的程序可能长这样"11111100001",相信大家都不会陌生,只是大家没这么子去敲过代码.再

  • Java语言面向对象编程思想之类与对象实例详解

    在初学者学Java的时候,面向对象很难让人搞懂,那么今天小编就来为大家把这个思想来为大家用极为简单的方法理解吧. 首先我们来简单的阐述面向对象的思想. 面向对象: 官方的语言很抽象,我们把官方的解释和定义抛开.想想,自己有什么,对!!我们自己有手脚眼口鼻等一系列的器官.来把自己所具有的器官就可以看作我们的属性,自己是不是可以喜怒哀乐和嬉笑怒骂,这些是不是我们的行为,那么自己的具有的属性加自己有的行为就称为一个对象. 注意!!我们自己,一个个体是一个对象,因为,你是你,我是我,我们虽然有相同的,但

  • Java的面向对象编程基本概念学习笔记整理

    个人理解,编程中所谓的 类¨ 与现实世界中对物体的分门别类中的类是同一个概念,只是在编程中将其借用进来.类代表有一系列共性和相同操作或动作的事物,在编程中即为抽象的数据类型.具体的每个个体(现实世界中).实例变量(对于在编程中来说)就是对象. 类是现实世界某些对象的共同特征(属性和操作)的表示,对象是类的实例. 类的属性:就是类的静态属性的简称,指类内包含的各项数据,如变量或其他类的对象:    类的服务:  则被称为成员函数或方法. ¨ Java中类的定义形式如下: [修饰符] class 类

  • 全方位讲解Java的面向对象编程思想

    什么是面向对象? Object 对象,Oriendted 以-为导向的, Programming 程序设计 面向对象就是使用对象进行程序设计,简写成OOP. SP和OOP对比 面向对象的三大原则      封装  继承   多态 对象 对象是面向对象编程的核心部分,是实际存在的具体实体,具有明确定义的状态和行为: 对象其实就是"数据"和"函数"的封装体,其中: 数据表示自身的状态,也称作"属性"或"成员数据": 函数表示自身的

  • Java面向对象编程(封装/继承/多态)实例解析

    本文主要介绍了面向对象的三大特征实例解析,下面看看具体内容. 封装 封装一个Teacher和Student类 package com.hz.test; public class Teacher { private String name; private String majorDirection; private String teachCourse; private int teachAge; public Teacher() { super(); } public Teacher(Stri

  • java面向对象编程类的内聚性分析

    目录 类划分时关于内聚性的问题 静态类的设计 高内聚类的设计 附:面向过程编程中模块的内聚性 偶然内聚或巧合内聚(Coincidental) 逻辑内聚(Logical): 时间内聚(Temporal ): 过程内聚: 通信内聚(Communicational): 顺序内聚(Sequential): 功能内聚(Functional): 类划分时关于内聚性的问题 静态类的设计 在软件设计中,我们经常会将一些通用的方法封装到一个类中,这种类只包含方法,没有属性,类中的方法之间没有关联,内聚性最低,属于

  • Java面向对象编程之类的继承详解

    本文实例讲述了Java面向对象编程之类的继承.分享给大家供大家参考,具体如下: 继承:特殊类拥有一般类的全部属性与行为. 继承好处: 1.提高了代码的复用性 2.让类与类之前产生了关系,有了这个关系才有多态的特性.继承是类和类之前的关系. 注意事项: 1.java只支持单继承,不支持多继承.因为多继承有安全隐患:当多个父类定义相同的函数,但是功能不同时,子类不知道运行哪一个. 2.子类继承父类时,继承了父类的所有方法和属性,可直接使用. 3,java支持多层继承,即:孙-子-父的关系 语法: [

  • Java学习笔记之面向对象编程精解

    目录 包 继承 super 关键字 final protected关键字 组合 多态 抽象类 接口 面向对象编程(包.继承.组合.多态 .抽象类.接口) 包 包其实就是类的集合,其本质上其实就是一个文件夹,里面存放的. java 文件里面有我们写的代码,并且包的存在还可以有效解决在实际开发过程中程序员. java文件命名重叠问题,其实就是,一个包里面是能有两个名字相同的.java文件,但是如果是不同的包下就允许这样的情况存在. 我们创建一个包只需要在 src 目录底下去创建就行了,公司里面给报的

  • 理解Java面向对象编程设计

    目录 1 前言 2 结构化程序设计 3 面向对象编程设计 4 码农洞见 4.1 两种编程范式之间的区别 4.2 两种编程范式之间的联系 1 前言 计算机革命的起源来自机器.编程语言就像是那台机器.它不仅是我们思维放大的工具与另一种表达媒介,更像是我们思想的一部分.语言的灵感来自其他形式的表达,如写作,绘画,雕塑,动画和电影制作.编程语言就是创建应用程序的思想结构. 面向对象编程(Object-Oriented Programming OOP)是一种编程思维方式和编码架构. 2 结构化程序设计 结

随机推荐