Maison  >  Article  >  Java  >  Analyse d'un exemple d'utilisation de l'interface Java

Analyse d'un exemple d'utilisation de l'interface Java

王林
王林avant
2023-04-19 08:55:041217parcourir

Analyse d'un exemple d'utilisation de l'interface Java


Interface

Un flux d'image
Analyse d'un exemple d'utilisation de l'interface Java

Le concept d'interface et un résumé de quelques points de connaissance

Interface (anglais : Interface) consiste à programmer un type abstrait en JAVA langage. C'est une collection de méthodes abstraites, et une interface est généralement déclarée comme interface. Une classe hérite des méthodes abstraites de l'interface en héritant de l'interface.
Les interfaces ne sont pas des classes La façon d'écrire des interfaces est très similaire aux classes, mais elles appartiennent à des concepts différents. Les classes décrivent les propriétés et méthodes d'un objet. L'interface contient les méthodes à implémenter par la classe. Sauf si la classe qui implémente l'interface est une classe abstraite,
sinon la classe doit définir toutes les méthodes de l'interface .
Les interfaces ne peuvent pas être instanciées, mais elles peuvent être implémentées. Une classe qui implémente une interface doit implémenter toutes les méthodes décrites dans l'interface, sinon elle doit être déclarée comme classe abstraite. De plus, en Java, les types d'interface peuvent être utilisés pour déclarer une variable, Ils peuvent devenir un pointeur nul, ou être liés à un objet qui implémente cette interface. Les similitudes entre les interfaces et les classes

Une interface peut avoir plusieurs

  • Les fichiers d'interface sont enregistrés dans des fichiers se terminant par .Java, et le nom du fichier utilise le nom de l'interface

  • le bytecode du interface Le fichier est enregistré dans un fichier se terminant par .class

  • Le fichier de bytecode correspondant à l'interface doit être dans la structure de répertoires correspondant au nom du package

  • La différence entre interface et classe

Interface ne peut pas être utilisé pour instancier des objets

  • L'interface n'a pas de méthode constructeur

  • Toutes les méthodes de l'interface doivent être des méthodes abstraites. Après Java 8, les méthodes non abstraites modifiées avec le mot-clé par défaut peuvent être utilisées dans l'interface

    .

  • Les interfaces ne peuvent pas contenir de variables membres, à l'exception des variables statiques et finales

  • Le concept selon lequel une interface est héritée par une classe n'est pas exact. Pour être précis, elle devrait être implémentée par une classe

  • Les interfaces peuvent. réalisez ce que nous appelons l'héritage multiple

  • Certaines fonctionnalités des interfaces

Chaque méthode de l'interface est également implicitement abstraite, donc les méthodes de l'interface seront implicitement désignées comme abstraites publiques (ne peuvent être que des abstraites publiques, d'autres modificateurs signaleront une erreur)

  • L'interface contient des variables, mais les variables de l'interface seront implicitement désignées comme variables finales statiques publiques (et ne peuvent être que publiques, la modifier avec private signalera une erreur de compilation)

  • Les méthodes de l'interface ne peuvent pas être implémentées dans l'interface, seules les méthodes de l'interface peuvent être implémentées par la classe qui implémente l'interface

  • La différence entre les classes abstraites et les interfaces

  • Avant JDK1.8, elles avait les différences suivantes

Les méthodes dans les classes abstraites peuvent être concrètes et exécutables. L'instruction, c'est-à-dire le corps de la méthode, peut réaliser la fonction spécifique de la méthode, mais la méthode dans l'interface ne peut pas (par exemple :

Système .out.println("Je suis super maïs !!");
)
  • Résumé Les variables membres d'une classe peuvent être de différents types

    , tandis que les variables membres d'une interface ne peuvent être que de type
  • public static final
  • L'interface ne peut pas contenir de blocs de code statiques ni l'utilisation de méthodes statiques (modifiées avec une méthode statique), et les classes abstraites peuvent avoir des blocs de code statiques et des méthodes statiques

  • Une classe ne peut hériter que d'une seule classe abstraite, mais une classe peut implémenter plusieurs interfaces

  • Ce qu'il convient donc de noter ici :

  • Après JDK1.8, les interfaces sont autorisées à contenir des méthodes statiques et des corps de méthode, et sont autorisées à contenir des méthodes d'implémentation spécifiques. méthode la "méthode par défaut". Cette méthode est modifiée avec le mot-clé par défaut

Après JDK1.9 , permettant de définir les méthodes comme privées, afin que certains codes réutilisés n'exposent pas les méthodes
La signification des classes abstraites est de permettre au compilateur de mieux vérifier. Généralement, nous n'utiliserons pas directement les classes abstraites, mais si nous créons accidentellement un objet via une classe abstraite, le compilateur nous le rappellera à temps.

Remarque : vous pouvez lire le contenu ci-dessus environ une fois. Ce n'est pas grave si vous ne le comprenez pas, je vous l'expliquerai un par un ci-dessous. vous aurez l'impression de vous réveiller d'un grand rêve

Alors, qu'est-ce qu'une interface dans la vraie vie ? Il peut s'agir d'un port USB d'un ordinateur portable, d'une prise de courant, etc.


Ensuite, ces interfaces sont également différentes en termes de normes de mise en œuvre et d'utilisation
Analyse d'un exemple d'utilisation de l'interface Java
Analyse d'un exemple d'utilisation de l'interface Java
Sur le port USB de l'ordinateur, vous pouvez brancher dans : U disk, souris, clavier…tous les appareils conformes au protocole USB

  • La prise de courant peut être branchée sur : des ordinateurs, des téléviseurs, des cuiseurs à riz... tous les équipements répondant aux spécifications

  • Nous pouvons le voir à partir des exemples ci-dessus : Les interfaces sont des normes de comportement public Lorsqu'elles sont mises en œuvre, tant qu'il répond aux normes de spécification, il peut être utilisé universellement. En Java, une interface peut être considérée comme : une spécification commune pour plusieurs classes, qui est un type de données de référence

    Règles de grammaire

    Le format de définition de l'interface est fondamentalement le même que le format de définition d'une classe Remplacer. le mot-clé class avec Le mot-clé interface définit une interface.

    public interface 接口名称{
        //抽象方法
        public abstract void method1();
        //public abstract是固定搭配,可以不写
        public void method2();
        abstract void method3();
        void method4();
        
        //注意:在接口中上述的写法都是抽象方法,所以method4这样写代码更整洁}

    Astuces :

    1. Lors de la création d'une interface, le nom de l'interface commence généralement par la lettre majuscule I (prononcé ai)

    2. La dénomination de l'interface utilise généralement des mots avec une partie adjective du discours

    3. comme convenu dans la norme de codage Alibaba, n'ajoutez aucun modificateur aux méthodes et propriétés de l'interface pour garder le code propre.

    Utilisation des interfaces

    Les interfaces ne peuvent pas être directement instanciées et utilisées. être une classe pour l'implémenter et implémenter toutes les abstractions dans l'interface.Méthode

    public class 类名称 implements 接口名称{
        //...}

    Remarque : la relation d'héritage entre les sous-classes et les classes parentes est étendue, et la relation d'implémentation entre les classes et les interfaces est implémentée.

    Utilisation des classes et des interfaces de souris USB et de clavier USB dans les ordinateurs portables pour implémenter des fonctions

    1. Interface USB : y compris les fonctions d'allumage et d'extinction de l'appareil

    2. Classe d'ordinateur portable : y compris la fonction d'allumage et d'extinction l'appareil et en utilisant le périphérique USB

    3. Classe Souris : implémente l'interface USB et a une fonction de clic

    4. Classe Clavier : implémente l'interface USB et a une fonction d'entrée

    //USB接口public interface USB{
        void openDevice();
        void closeDevice();}//鼠标类,实现USB接口public class Mouse implements USB{
        @Override
        public void openDevice(){
            System.out.println("打开鼠标");
        }
        
        @Override
        public void closeDevice(){
            System.out.println("关闭鼠标");
        }
        public void click(){
            System.out.println("鼠标点击");
        }}//键盘类,实现USB接口public class KeyBoard implements USB {
        @Override
        public void openDevice(){
            System.out.println("打开键盘");
        }
        
        @Override
        public void closeDevice(){
            System.out.println("关闭键盘");
        }
        
        public void inPut(){
            System.out.println("键盘输入");
        }}//笔记本类:使用USB设备public class Computer {
        public void powerOn(){
            System.out.println("打开笔记本电脑");
        }
        
        public void powerOff(){
            System.out.println("关闭笔记本电脑");
        }
        public void useDevice(USB usb){
            usb.openDevice();
            if(usb instanceof Mouse){
                Mouse mouse = (Mouse)usb;
                mouse.click();
            }else if(usb instanceof KeyBoard){
                KeyBoard keyBoard = (KeyBoard)usb;
                keyBoard.inPut();
            }
            usb.closeDevice();
        }}//测试类:public class TestUSB{
        public static void main(String[] args){
            Computer computer = new Computer();
            computer.powerOn();
       
        //使用鼠标设备
        computer.useDevice(new Mouse());
        
        //使用键盘设备
        computer.useDevice(new KeyBoard());
        
        computer.powerOff();
        }}

    Sortie :
    Analyse d'un exemple d'utilisation de l'interface Java

    instanceof

    Dans l'exemple de code ci-dessus, mentionnant instanceof, certains amis peuvent ne pas le comprendre. Je l'ai présenté dans le blog précédent, et je vais vous l'expliquer à nouveau. Instanceof est un mot-clé réservé en Java. Le côté gauche est l'objet, le côté droit. side est la classe et le type de retour est de type booléen.
    Sa fonction spécifique est de tester si l'objet de gauche est un objet instancié créé par la classe de droite ou une sous-classe de la classe de droite
    Si c'est le cas, il renvoie vrai, sinon il renvoie faux

    [Notes sur l'utilisation de instanceof ] Relation d'héritage existante, puis il y a l'utilisation d'instanceof (y compris l'implémentation de l'interface)

    【instanceof scénario d'application】 Lorsque vous devez utiliser la conversion de type forcée de l'objet, vous devez utiliser instanceof pour juger

    Caractéristiques de l'interface

    1. Le type d'interface est un type de référence A, mais ne peut pas créer directement l'objet de l'interface

    2. public class TestUSB {
          public static void main(String[] args){
              USB usb = new USB();
          }}//编译会出错:USB是抽象的,无法实例化

    Analyse d'un exemple d'utilisation de l'interface Java

    1. Chaque méthode de l'interface est une méthode abstraite publique , c'est-à-dire que les méthodes de l'interface seront implicitement désignées comme publiques abstraites (seulement C'est public abstrait, d'autres modificateurs signaleront une erreur)

    2. public interface USB {
          //编译出错:此处不允许使用修饰符private
          //或者是java: 缺少方法主体, 或声明抽象
          private void openDevice();
          void closeDevice();
          //不同JDK版本编译器的标准是不一样的,报错也是不一样的}
    1. Les méthodes de l'interface ne peuvent pas être implémentées dans l'interface, et ne peut être implémenté que par la classe qui implémente l'interface

    2. public interface USB {
          void openDevice();
          
          //编译失败:因为接口中的方法默认为抽象方法
          //Error:接口抽象方法不能带有主体}

    Analyse d'un exemple d'utilisation de l'interface JavaMais si nous ajoutons ici la valeur par défaut précédente, alors le corps de la méthode peut être implémenté.

    Analyse d'un exemple d'utilisation de l'interface Java

    1. Lors du remplacement d'une méthode dans une interface, vous ne pouvez pas utiliser la valeur par défaut comme modification d'autorisation d'accès

    2. public interface USB {void openDevice();//默认为publicvoid closeDevice();//默认为public}public class Mouse implements USB {
          @Override
          void openDevice(){
              System.out.println("打开鼠标");
          }
          
          //...}//这里编译会报错,重写USB中的openDevice方法时,不能使用默认修饰符

    Analyse d'un exemple d'utilisation de l'interface JavaPour implémenter cette interface, la plage du modificateur de restriction d'accès de la méthode qui remplace cette interface est plus large que que dans l'interface Les grandes

    1. interfaces peuvent contenir des variables, mais les variables de l'interface seront automatiquement et implicitement désignées par le compilateur comme

      public static finalvariables

    2. public interface USB {
          double brand = 3.0;//默认为:final public static修饰
          void openDevice();
          void closeDevice();}public class TestUSB {
          public static void main(String[] args){
              System.out.println(USB.brand);
              //可以直接通过接口名访问,说明变量时静态的
              
              //下面写法会报错 Java:无法为最终变量brand分配值
              USB.brand = 2.0;
              //说明brand具有final属性
          }}

    Analyse d'un exemple d'utilisation de l'interface Java

    1. Il ne peut pas y avoir de statique blocs de code et structures dans l'interface Méthode

    2. public interface USB {
          public USB(){
          
          }//编译失败
          
          {
          
          }//编译失败
          
          void openDevice();
          void closeDevice();}

    Analyse d'un exemple d'utilisation de l'interface Java

    1. Bien que l'interface ne soit pas une classe, le format de suffixe du fichier bytecode après la compilation de l'interface est également .class

    2. Si la classe le fait n'implémente pas toutes les méthodes abstraites dans l'interface, la classe doit être définie comme une classe abstraite

    3. JDK8 stipule que l'interface peut contenir la méthode par défaut mentionnée ci-dessus


    implémenter plusieurs interfaces

    En Java, il existe un héritage unique entre les classes, et une classe uniquement Peut être dérivée d'une classe parent, c'est-à-dire que

    L'héritage multiple n'est pas pris en charge en Java, mais une classe peut implémenter plusieurs interfaces. Utilisons du code pour démontrer

    public class Animal {
        protected String name;
        
        public Animal(String name){
            this.name = name;
        }}

    Ensuite, nous écrivons un ensemble d'interfaces pour représenter « les choses qui peuvent voler », « les choses qui peuvent courir » et « les choses qui savent nager ».

    public interface IFlying {
        void fly();}public interface IRunning {
        void run();}public interface ISwimming {
        void swim();}

    Analyse d'un exemple d'utilisation de l'interface Java
    那么接下来我们创建几个具体的动物类来接受并实现这些接口
    比如,猫会跑

    public class Cat extends Animal implements IRunning{
        public Cat(String name) {
            super(name);
        }
        
        @Override
        public void run() {
            System.out.println("小猫"+this.name+"正在跑");
        }}

    鱼会游泳

    public class Fish extends Animal implements ISwimming{
        public Fish(String name){
         super(name);   
        }
        
        @Override
        public void swim() {
            System.out.println("小鱼"+this.name+"正在游泳");
        }}

    而青蛙即会跑又会游泳

    public class Frog extends Animal implements IRunning,ISwimming{
        public Frog(String name){
            super(name);
        }
        
        @Override
        public void run() {
            System.out.println("青蛙"+this.name+"正在跑");
        }
    
        @Override
        public void swim() {
            System.out.println("青蛙"+this.name+"正在游泳");
        }}

    注意:一个类实现多个接口的时候,每个接口中的抽象方法都要去实现,除非类用abstract修饰,为抽象类

    提示IDEA中使用ctrl + i 可以快速实现接口

    还有一种动物水陆空三栖,它是大白鹅

    public class Goose extends Animal implements IRunning,ISwimming,IFlying{
        public Goose(String name) {
            super(name);
        }
    
        @Override
        public void fly() {
            System.out.println(this.name+"正在飞");
        }
    
        @Override
        public void run() {
            System.out.println(this.name+"正在跑");
        }
    
        @Override
        public void swim() {
            System.out.println(this.name+"正在漂在水上");
        }}

    这段代码展现了Java面向对象编程中最常见的用法:一个类继承了一个父类,然后同时实现多个接口
    继承表达的含义是is-a,而接口表达的含义是具有xxx的特性

    猫是一种动物,具有会跑的特性
    青蛙是一种动物,即能跑也能有用
    大白鹅也是一种动物,技能跑,也能游,还能飞

    有了接口之后,类的使用者就不需要去关注具体的类的属性是否符合,而只需要关心某个类是否具有某个特性/功能,如果有,就可以实现对应的接口
    那么我们现在实现一个走路的方法

    public class TestDemo1 {
        public static void walk(IRunning iRunning){
            System.out.println("我带着小伙伴去散步");
            iRunning.run();
        }
    
        public static void main(String[] args) {
            Cat cat = new Cat("小猫");
            walk(cat);
            
            Frog frog = new Frog("小青蛙");
            walk(frog);
        }}

    输出结果
    Analyse d'un exemple d'utilisation de l'interface Java
    只要是会跑的,带有跑这个属性特征的,都可以接受相应的对象

    public class Robot implements IRunning{
        private String name;
        public Robot(String name){
            this.name = name;
        }
        @Override
        public void run() {
            System.out.println(this.name+"正在用轮子跑");
        }
    
        public static void main(String[] args) {
            Robot robot = new Robot("机器人");
            walk(robot);
        }}

    Analyse d'un exemple d'utilisation de l'interface Java
    Analyse d'un exemple d'utilisation de l'interface Java
    故输出结果为
    Analyse d'un exemple d'utilisation de l'interface Java

    接口之间的继承

    在Java中,类和类之间是单继承的,一个类可以实现多个接口,接口与接口之间可以多继承。
    即:用接口可以达到多继承的目的
    接口可以继承一个接口,达到复用的效果。这里使用extends关键字

    interface IRunning {
        void run();}interface ISwimming {
        void swim();}//两栖的动物,即能跑,也能游泳interface IAmphibious extends IRunning ISwimming {}class Frog implements IAmphibious {
        ...}

    通过接口继承创建一个新的接口IAmphibious表示“两栖的”。
    创建的Frog类就实现了这个两栖的接口

    接口之间的继承就相当于把多个接口合并到了一起

    接口使用的例子

    我们在之前的数组中讲解过给数组排序,那么我们该如何给对象数组排序呢?
    首先我们定义一个Student的类,然后重写一下String方法

    public class Student {
        private String name;
        private int score;
        public Student(String name,int score){
            this.name = name;
            this.score = score;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", score=" + score +
                    '}';
        }}

    我们再给定一个学生对象数组,根据这个对象数组中的元素进行排序
    这里我们按照分数降序排序

    public class Student {
        private String name;
        private int score;
        public Student(String name,int score){
            this.name = name;
            this.score = score;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name='" + name + '\'' +
                    ", score=" + score +
                    '}';
        }
    
        public static void main(String[] args) {
            Student[] students = new Student[]{
                    new Student("A",95),
                    new Student("B",96), 
                    new Student("C",97),
                    new Student("D",98),
            };
        }}

    那么按照我们之前的理解,数组中有一个可以供我们使用的sort方法,我们能否直接使用呢?

    Arrays.sort(students);System.out.println(students);//运行结果:Exception in thread "main" java.lang.ClassCastException: class ClassArray.Student cannot be cast to class java.lang.Comparable (ClassArray.Student is in unnamed module of loader 'app'; java.lang.Comparable is in module java.base of loader 'bootstrap')
    	at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
    	at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:188)
    	at java.base/java.util.Arrays.sort(Arrays.java:1041)
    	at ClassArray.Student.main(Student.java:36)

    Analyse d'un exemple d'utilisation de l'interface Java
    我们可以看到这里程序报错了,这里的意思是Student并没有实现Comparable的接口
    那么这里的sort是进行普通数字的比较,大小关系明确,而我们指定的是两个学生对象的引用变量,这样的大小关系的指定是错误的,我们需要额外去人为规定对象中的比较元素
    那么怎么实现呢?

    我们可以用Student类实现Comparable接口,并实现其中的compareTo方法

    public class Student implements Comparable<Student>{
        private String name;
        private int score;
    
        public Student(String name,int score){
            this.name = name;
            this.score = score;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name=&#39;" + name + &#39;\&#39;&#39; +
                    ", score=" + score +
                    &#39;}&#39;;
        }
    
        @Override
        public int compareTo(Student o) {
            if (this.score>o.score){
                return -1;//      如果当前对象应排在参数对象之前,则返回小于0的数字
            } else if(this.score<o.score){
                return 1;//      如果当前对象应排在参数对象之后,则返回大于0的数字
            } else{
                return 0;//      如果当前对象和参数对象不分先后,则返回0      
            }
            
        }}

    那么我们在这里重写了compareTo的方法,自己定义了比较的规则,我们就自己再去写一个sort的方法,去调用这个compareTo方法,真正意义上实现对 对象数组的排序
    我们使用冒泡排序法

        public static void sort(Comparable[] array){//        这里要注意,虽然接口不能实例化对象,//        但是接口类型的引用变量可以指向它的实现类对象//        这里的实现类对象就是实现了这个接口的对象//        例如Comparable[] comparable = new Student[3];//        所以这里的参数就可以用Comparable[] array来接收
            for (int bound = 0;bound<array.length;bound++){
                for (int cur = array.length-1;cur>bound;cur--){
                    if (array[cur-1].compareTo(array[cur])>0){
                        //这里就说明顺序不符合要求,交换两个变量的位置
                        Comparable tmp = array[cur-1];
                        array[cur-1] = array[cur];
                        array[cur] = tmp;
                    }
                }
        }}

    sort方法写好了,我们写一个main函数来测试一下

        public static void main(String[] args) {
            Student[] students = new Student[]{
                    new Student("A",95),
                    new Student("B",91),
                    new Student("C",97),
                    new Student("D",95),
            };
            System.out.println("sort前:"+Arrays.toString(students));
            sort(students);
            System.out.println("sort后:"+Arrays.toString(students));
        }

    运行结果

    E:\develop\Java\jdk-11\bin\java.exe "-javaagent:E:\IDEA\IntelliJ IDEA Community Edition 2021.3.2\lib\idea_rt.jar=65257:E:\IDEA\IntelliJ IDEA Community Edition 2021.3.2\bin" -Dfile.encoding=UTF-8 -classpath E:\JAVAcode\gyljava\Interface\out\production\Interface ClassArray.Studentsort前:[Student{name=&#39;A&#39;, score=95}, Student{name=&#39;B&#39;, score=91}, Student{name=&#39;C&#39;, score=97}, Student{name=&#39;D&#39;, score=95}]sort后:[Student{name=&#39;C&#39;, score=97}, Student{name=&#39;A&#39;, score=95}, Student{name=&#39;D&#39;, score=95}, Student{name=&#39;B&#39;, score=91}]

    那么我们如果想要按照名字排序呢?也是可以的

    import java.util.Arrays;import java.util.Comparator;/**
     * Created with IntelliJ IDEA.
     * Description: Hello,I would appreciate your comments~
     * User:Gremmie
     * Date: -04-13
     * Destination:利用Comparable的接口实现对 对象数组 选择性排序的功能
     */class Student implements Comparable<Student>{
        public String name;
        public int age;
    
        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "Student{" +
                    "name=&#39;" + name + &#39;\&#39;&#39; +
                    ", age=" + age +
                    &#39;}&#39;;
        }
    
        @Override
        public int compareTo(Student o) {
            return this.name.compareTo(o.name);
        }}class AgeComparator implements Comparator<Student> {
        @Override
        public int compare(Student o1, Student o2) {
            return o1.age-o2.age;
        }}class NameComparator implements Comparator<Student> {
    
        @Override
        public int compare(Student o1, Student o2) {
            return o1.name.compareTo(o2.name);
        }}public class TestDemo {
    
        public static void main(String[] args) {
            Student[] students = new Student[3];
            students[0] = new Student("zhangsan",19);
            students[1] = new Student("lisi",8);
            students[2] = new Student("abc",78);
            AgeComparator ageComparator = new AgeComparator();
            NameComparator nameComparator = new NameComparator();
            
            
            //这里的方法sort是Array里面自带的,非常方便,
            //只需将我们写好的比较器传过去就好了
            System.out.println("排序前:"+Arrays.toString(students));
            Arrays.sort(students,nameComparator);
            System.out.println("排序后:"+Arrays.toString(students));
            Comparable<Student>[] studentComparable =students;
        }
    
        public static void main2(String[] args) {
            /*Student students1 = new Student("zhangsan",19);
            Student students2 = new Student("abc",78);
            if(students2.compareTo(students1) > 0) {
                System.out.println("fafaa");
            }*/
    
    
        }
        public static void main1(String[] args) {
            Student[] students = new Student[3];
            students[0] = new Student("zhangsan",19);
            students[1] = new Student("lisi",8);
            students[2] = new Student("abc",78);
            System.out.println("排序前:"+Arrays.toString(students));
            Arrays.sort(students);
            System.out.println("排序后:"+Arrays.toString(students));
        }}

    Clonable接口以及深拷贝

    其作用如其名,是用来进行克隆的,Clonable是个很有用的接口。
    Object类中存在一个clone方法,调用这个方法可以创建出一个对象,实现“拷贝”。
    但是我们想要合法调用clone方法,就要先实现Clonable接口,
    否则就会抛出CloneNotSupportedException异常

    /**
     * Created with IntelliJ IDEA.
     * Description: Hello,I would appreciate your comments~
     * User:Gremmie
     * Date: -04-13
     * Destination:利用Clonable的接口实现clone方法,克隆含对象的对象
     */class Money implements Cloneable{
        public double money = 19.9;
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }}class Person implements Cloneable{
        public int id = 1234;
        public Money m = new Money();
    
        @Override
        public String toString() {
            return "Person{" +
                    "id=&#39;" + id + &#39;\&#39;&#39; +
                    &#39;}&#39;;
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            Person tmp = (Person) super.clone();
            tmp.m = (Money) this.m.clone();
            return tmp;
            //return super.clone();
        }}public class TestDemo {
    
        public static void main(String[] args) {
            Object o = new Person();
    
            Object o2 = new Money();
    
    
        }
    
        public static void main1(String[] args) throws CloneNotSupportedException {
            Person person1 = new Person();
            Person person2 = (Person)person1.clone();
            System.out.println(person1.m.money);
            System.out.println(person2.m.money);
            System.out.println("=========================");
            person2.m.money = 99.99;
            System.out.println(person1.m.money);
            System.out.println(person2.m.money);
        }}

    我们如果只是通过clone,那么就只是拷贝了Person的对象,但是Person中的money对象我们并没有拷贝下来,只是单纯拷贝下来一个地址,那么我们在这里就要进行深拷贝,讲Money类也接受Clonable接口,这样在调用clone方法的时候,money也会进行克隆

    Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

    Déclaration:
    Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer