欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

JAVA抽象類,接口,內(nèi)部類詳解

 更新時(shí)間:2021年09月01日 09:48:41   作者:高小小天  
這篇文章主要給大家介紹了關(guān)于Java中抽象類,接口,內(nèi)部類的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一.內(nèi)容

抽象類

當(dāng)編寫一個(gè)類時(shí),常常會為該類定義一些方法,這些方法用于描述這個(gè)類的行為。但在某些情況下只需要定義出一些方法,而不需要具體的去實(shí)現(xiàn)這些行為。也就是說這些方法沒有方法體,只是一些簽名而已,這樣的方法被稱為抽象方法,包含抽象方法的類被稱為抽象類。

抽象方法與抽象類

抽象方法與抽象類必須使用abstract關(guān)鍵字進(jìn)行修飾,有抽象方法的類必須被定義成抽象類,抽象類里面可以沒有抽象方法。

抽象類與抽象方法的規(guī)則如下:

  • 抽象類與抽象方法必須使用abstract關(guān)鍵字進(jìn)行修飾,抽象方法不能有方法體。
  • 抽象類不能被實(shí)例化。即使抽象類不包含抽象方法,也不能被實(shí)例化
  • 抽象類可以包含field、方法、構(gòu)造器、初始化塊、內(nèi)部類5種成分。
  • 包含抽象方法的類,只能被定義成抽象類。

語法格式:抽象方法

【修飾符】 abstract 返回值類型 methodName(形參列表);
//示例:
public abstract void runWay();//定義一個(gè)行進(jìn)的方法

注意:抽象方法是沒有方法體,僅僅是一個(gè)方法聲明而已。所有Java要求其子類必須將父類中定義的抽象方法進(jìn)行實(shí)現(xiàn)。這也就意味著子類需要先將該方法繼承過來,所以修飾符也就只能是public或者protected。

示例代碼:抽象類定義

public abstract class Piece{}//定義一個(gè)棋子類

注意:抽象類不能實(shí)例化,只能被繼承,抽象類中可以沒有抽象方法,即使抽象類中沒有抽象方法也不能被實(shí)例化。

抽象類的使用

抽象類不能創(chuàng)建實(shí)例,只能當(dāng)成父類來被繼承。抽象類可以看成是從多個(gè)具體類中抽象出來的父類,它具有更高層次的抽象。從多個(gè)具有相同特征的類中抽象出來的一個(gè)抽象類,以這個(gè)抽象類作為其子類的模板,從而避免子類設(shè)計(jì)的隨意性。

抽象類的體現(xiàn)就是一種模板模式的設(shè)計(jì),抽象類作為多個(gè)子類的通用模板,子類在抽象類的基礎(chǔ)上進(jìn)行擴(kuò)展、改造,但子類總體上會保留抽象類的行為方式。

編寫一個(gè)抽象父類,父類提供了多個(gè)子類的通用方法,并把一個(gè)或多個(gè)方法留給其子類實(shí)現(xiàn),這就是一種模板模式,模板模式也是十分常見的設(shè)計(jì)模式。

示例代碼:

//定義抽象父類Piece
public abstract class Piece{
    /**
    *定義棋子的行進(jìn)方法
    */
    public abstract void runWay();
    /**
    *定義棋子進(jìn)攻的方法
    */
    public void attack() { 
        System.out.println("吃掉下面的棋子");
    }
}
//Piece的子類Horse
public class Horse extends Piece{
    /**
    *實(shí)現(xiàn)父類中定義的抽象方法
    */
    public void runWay() {
        System.out.println("按照日字格行進(jìn)!");
    }
}
//Piece的子類Cannon
public class Cannon extends Piece{
    /**
    *實(shí)現(xiàn)父類中定義的抽象方法
    */
    public void runWay() { 
        System.out.println("按照直線方式行進(jìn)!");
    }
}

模板模式在面向?qū)ο蟮能浖泻艹S?,其原理簡單,?shí)現(xiàn)也很簡單。使用模板模式有如下規(guī)則:抽象父類可以只定義需要使用的方法,把不能實(shí)現(xiàn)的部分抽象成抽象方法留給子類去實(shí)現(xiàn)。

接口

抽象類是從多個(gè)類中抽象出來的模板,如果將這種抽象進(jìn)行得更徹底,則可以提煉出一種更加特殊的“抽象類”——接口(interface)。接口里不能包含普通方法,接口里的所有方法都是抽象方法。接口里面可以放:常量,抽象方法,默認(rèn)方法,靜態(tài)方法,私有化方法

接口的概念

Java中的接口是一系列方法的聲明,是一些方法特征的集合,一個(gè)接口只有方法的特征沒有方法的實(shí)現(xiàn),因此這些方法可以在不同的地方被不同的類實(shí)現(xiàn),而這些實(shí)現(xiàn)可以具有不同的行為(功能)。

接口的定義

接口和類定義不同,定義接口不在使用class關(guān)鍵字,而是使用interface關(guān)鍵字。

語法格式如下

【public】interface 接口名 extends 父接口1,父接口2{
    //零到多個(gè)常量定義
    //零到多個(gè)抽象方法定義
}

語法分析:

  • 修飾符可以是public或者protected,大多數(shù)是使用public,protected省略采用默認(rèn)包權(quán)限訪問控制符。
  • 接口名應(yīng)與類名采用相同的命名規(guī)則。
  • 一個(gè)接口可以有多個(gè)直接父接口,但接口只能繼承接口,不能繼承類。

接口中的成員變量

接口定義的是一種規(guī)范,因此接口里不能包含構(gòu)造器和初始化塊定義。接口里可以包含field、方法、內(nèi)部類定義。因?yàn)榻涌跊]有構(gòu)造器與初始化塊,因此系統(tǒng)不能為field進(jìn)行默認(rèn)的初始化操作,只能由程序編寫人員為field指定默認(rèn)的值,所以field只能是常量。又因?yàn)閒ield只能是常量,所以系統(tǒng)自動為這些field增加了static和final兩個(gè)修飾符。也就是說在接口中定義的Field不管是否使用了public static final修飾符,接口里的Field總是默認(rèn)使用public static final修飾符來進(jìn)行修飾,不可更改。

示例代碼

interface DBobjectType{
    //對于在接口中定義的成員變量,用或不用public static final,意義都是相同的
    public static final int ROOT=0;
    public static final int DATABASE=1; 
    int TABLE=2; 
    int COLUMN=3;
    int INDEX=4;
}

接口中的方法

接口里定義的方法都是抽象方法,因此系統(tǒng)會自動為方法增加public abstract修飾符。因此不管定義接口方法時(shí)是否使用了public abstract修飾符,系統(tǒng)都會默認(rèn)方法使用public abstract修飾符來進(jìn)行修飾。

示例代碼:

public interface DataConnection{
    /**
    *定義獲取數(shù)據(jù)庫連接的方法*/
    public abstract void getConnection();
    /**
    *定義關(guān)閉數(shù)據(jù)庫連接的方法,在接口中是否使用public abstract意義相同*/
    void close();
}

接口的繼承

接口的繼承與類的繼承不一樣,接口完全支持多繼承,即一個(gè)接口可以有多個(gè)直接父接口。和繼承相似,子接口擴(kuò)展父接口,將會獲得父接口里定義的所有抽象方法、field、內(nèi)部類和枚舉定義。

一個(gè)接口繼承多個(gè)父接口時(shí),多個(gè)父接口排在extends關(guān)鍵字之后,多個(gè)父接口之間使用英文逗號(,)進(jìn)行分隔。

示例代碼:

public interface InterA{//定義接口A
    void a();
}
public interface InterB{//定義接口B
    void b();
}
public interface Inter extends InterA,InterB{//定義接口Inter繼承A、B
    voidc();
}

接口的實(shí)現(xiàn)/使用

接口不能用于創(chuàng)建實(shí)例,但接口可以用于聲明引用類型變量。當(dāng)使用接口來聲明引用類型變量時(shí),這個(gè)引用類型變量必須引用到其實(shí)現(xiàn)類的對象。除此之外,接口的主要用途就是被實(shí)現(xiàn)類進(jìn)行實(shí)現(xiàn)。

一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,繼承使用extends關(guān)鍵字,而實(shí)現(xiàn)則使用implements關(guān)鍵字。

單繼承多實(shí)現(xiàn)

示例代碼:

public interface InterA {
  void a();
}
public class InterAImpl implements InterA
{
    @Override
    public void a(){
        System.out.println("將接口InterA中定義的抽象方法進(jìn)行實(shí)現(xiàn)!");
    }
}

實(shí)現(xiàn)接口與繼承類相似,一樣可以獲得所實(shí)現(xiàn)接口里定義的常量field、抽象方法、內(nèi)部類和枚舉類定義。讓類實(shí)現(xiàn)接口需要在類定義后面增加implements部分,當(dāng)需要實(shí)現(xiàn)多個(gè)接口時(shí),多個(gè)接口之間以英文逗號(,)隔開。一個(gè)類可以繼承一個(gè)父類并同時(shí)實(shí)現(xiàn)多個(gè)接口,implements部分必須放在extends部分之后。

示例代碼:

public interface DBobjectType {
    public static final int ROOT =0; 
    public static final int DATABASE =1;   
    int TABLE=2;
    int COLUMN=3;
    int INDEX=4;
}
public interface DataConnection{
    /**
    *定義獲取數(shù)據(jù)庫連接的方法
    */
    public abstract void getConnection();
    /**
    *定義關(guān)閉數(shù)據(jù)庫連接的方法,在接口中是否使用publicabstract意義相同
    */
    void close();
}
public class ConnectionImpl implements
    DBobjectType,DataConnection {
    @Override
    public void getConnection() {
        System.out.println("獲取一個(gè)連接對象!");
    }
    @Override
    public void close() {
        System.out.println("將連接進(jìn)行關(guān)閉!");
    }
    public static void main(String[]args){
        ConnectionImpl impl=new ConnectionImpl();
        //直接使用從DBobjectType繼承過來的成員變量定義
        System.out.println("數(shù)據(jù)對象類型:"+ConnectionImpl.ROOT);
        impl.getConnection();
    }
}

一個(gè)類實(shí)現(xiàn)了一個(gè)或多個(gè)接口之后,這個(gè)類必須完全實(shí)現(xiàn)這些接口里所定義的全部抽象方法,否則該類將保留從父接口那里繼承到的抽象方法,該類也必須定義成抽象類。

接口與抽象類的差異

1、接口和抽象類都不能進(jìn)行實(shí)例化,它們都位于繼承樹的頂端,用于被其他類實(shí)現(xiàn)和繼承。

2、接口和抽象類都可以包含抽象方法,實(shí)現(xiàn)接口或繼承抽象類的普通子類都必須實(shí)現(xiàn)這些抽象方法。

接口作為系統(tǒng)與外界交互的窗口,接口體現(xiàn)的是一種規(guī)范。對于接口的實(shí)現(xiàn)者而言,接口規(guī)定了實(shí)現(xiàn)者必須向外提供哪些服務(wù)。對于接口的調(diào)用者而言,接口規(guī)定了調(diào)用者可以調(diào)用哪些服務(wù)。當(dāng)在一個(gè)程序中使用接口時(shí),接口是多個(gè)模塊間的耦合標(biāo)準(zhǔn),當(dāng)在多個(gè)應(yīng)用程序之間使用接口時(shí),接口是多個(gè)程序之間的通信標(biāo)準(zhǔn)。

接口類似于系統(tǒng)的總綱,一旦接口發(fā)生變化,對于整個(gè)系統(tǒng)是輻射式的,所有實(shí)現(xiàn)這個(gè)接口的普通類都要進(jìn)行改寫。

分析:JDBC編程是后面需要給大家講到的數(shù)據(jù)庫編程,在此示例中不涉及到具體代碼,只看結(jié)構(gòu)圖。Java程序不可能為行業(yè)內(nèi)使用個(gè)各種數(shù)據(jù)庫都提供一套連接方式。它只會提供一套標(biāo)準(zhǔn)的接口,告訴數(shù)據(jù)庫生產(chǎn)廠商應(yīng)該提供哪些實(shí)現(xiàn)。所以不同的數(shù)據(jù)庫生產(chǎn)廠商需要將Java提出的接口進(jìn)行底層的實(shí)現(xiàn),當(dāng)我們需要進(jìn)行JDBC編程時(shí),只需要將不同數(shù)據(jù)庫生產(chǎn)廠商提供的JAR包導(dǎo)入進(jìn)來,按照接口的方式進(jìn)行編程即可

抽象類則不一樣,抽象類作為系統(tǒng)中多個(gè)子類的共同父類,它所體現(xiàn)的是一種模版式設(shè)計(jì)。抽象類作為多個(gè)子類的抽象父類,可以被當(dāng)成系統(tǒng)實(shí)現(xiàn)過程中的中間產(chǎn)品。這個(gè)中間產(chǎn)品已經(jīng)實(shí)現(xiàn)了系統(tǒng)的部分功能,但這個(gè)類不能稱為最終產(chǎn)品,必須有更進(jìn)一步的完善,這種完善可能有幾種不同的方式來實(shí)現(xiàn)。

接口與抽象類在用法上也存在如下差異:

  • 接口里只能包含抽象方法,不包含已經(jīng)提供實(shí)現(xiàn)的方法,抽象類則完全可以包含普通方法。
  • 接口和抽象類里都可以定義靜態(tài)方法。
  • 接口里只能定義靜態(tài)常量Field,不能定義普通的Field,抽象類里則都可以。
  • 接口里不包含構(gòu)造器,抽象類里可以包含構(gòu)造器,抽象類里的構(gòu)造器并不是用來創(chuàng)建對象,而是讓其子類調(diào)用這些構(gòu)造器完成屬于抽象類的初始化操作。
  • 接口里不能包含初始化塊,但抽象類則完全可以包含初始化塊。
  • 一個(gè)類最多只有一個(gè)父類,包括抽象類,但是一個(gè)類可以實(shí)現(xiàn)多個(gè)接口。

面向接口編程

接口體現(xiàn)的是一種規(guī)范和實(shí)現(xiàn)分離的設(shè)計(jì)模式,充分利用接口可以很好降低程序各模塊之間的耦合,從而提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。

基于這種原則,軟件架構(gòu)設(shè)計(jì)理論都倡導(dǎo)“面向接口”編程,而不是面向?qū)崿F(xiàn)類編程,希望通過面向接口編程來降低程序的耦合。下面使用數(shù)據(jù)庫編程這種場景來示范面向接口編程的優(yōu)勢。

//定義接口規(guī)范
public interface DataConnection{
    /**
    *定義獲取數(shù)據(jù)庫連接的方法*/
    public abstract void getConnection();
    /**
    *定義關(guān)閉數(shù)據(jù)庫連接的方法
    */
    public abstract void close();
}
//定義不同數(shù)據(jù)庫的實(shí)現(xiàn)類MySql
public class MySqlConnection implements DataConnection {
    @Override
    public void getConnection() {
        System.out.println("獲取MySql數(shù)據(jù)庫的連接。。。");
    }
    @Override
    public void close() {
        System.out.println("關(guān)閉MySql數(shù)據(jù)庫的連接。。。");
    }
}
//定義不同數(shù)據(jù)庫的實(shí)現(xiàn)類Oracle
public class OracleConnection implements DataConnection {
    @Override
    public void getConnection(){
        System.out.println("獲取Oracle數(shù)據(jù)庫的連接。。。");
    }
    @Override
    public void close() {
        System.out.println("關(guān)閉Oracle數(shù)據(jù)庫的連接。。。");
    }
}
//定義不同數(shù)據(jù)庫的實(shí)現(xiàn)類SqlServer
public class SqlServerConnection implements DataConnection {
    @Override
    public void getConnection() {
        System.out.println("獲取SqlServer數(shù)據(jù)庫的連接。。。");
    }
    @Override 
    public void close() {
        System.out.println("關(guān)閉SqlServer數(shù)據(jù)庫的連接。。。");
    }
}

內(nèi)部類

在定義類的時(shí)候,我們一般把類定義成一個(gè)獨(dú)立的程序單元。但是在某些情況下,我們會把一個(gè)類放在另一個(gè)類的內(nèi)部定義,這個(gè)定義在其他類內(nèi)部的類就被稱為內(nèi)部類,也可以稱為嵌套類。包含內(nèi)部類的類也被稱為外部類,也可以稱為宿主類。Java從JDK1.1開始引入內(nèi)部類,內(nèi)部類的主要作用如下:

  • 內(nèi)部類提供了更好的封裝,可以把內(nèi)部類隱藏在外部類之內(nèi),不允許同一個(gè)包中其他類訪問該類。
  • 內(nèi)部類成員可以直接訪問外部類的私有數(shù)據(jù),因?yàn)閮?nèi)部類被當(dāng)成外部類的成員,同一個(gè)類成員之間可以相互訪問。
  • 匿名內(nèi)部類適合用于創(chuàng)建那些僅需要一次使用的類。

非靜態(tài)內(nèi)部類

定義內(nèi)部類非常簡單,只要把一個(gè)類放在另一個(gè)類內(nèi)部定義即可。此處的“內(nèi)部類”包括類中的任何位置,甚至在方法中也可以定義內(nèi)部類,在方法中定義的內(nèi)部類叫做局部內(nèi)部類。

通常情況下,內(nèi)部類都被作為成員內(nèi)部類定義,而不是作為局部內(nèi)部類。成員內(nèi)部類是一種與成員field、成員方法、構(gòu)造方法和初始化塊相同級別的類成員。

成員內(nèi)部類分為:靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類兩種,使用static修飾的成員內(nèi)部類就是靜態(tài)內(nèi)部類,沒有使用static修飾的成員內(nèi)部類就是非靜態(tài)內(nèi)部類。

因?yàn)閮?nèi)部類作為其外部類的成員,所以可以使用任意訪問控制符:private、protected、public修飾的Field成員。

示例代碼:

public class DiningRoom {
    private String egg="雞蛋";
    class Cook { 
        public void makeFood() {
            //使用了外部類DiningRoom中定義的私有成員egg
            System.out.println("廚師使用"+egg+",做了一份炒雞蛋!");
        }
    }
    /**
    *DiningRoom類對外提供的做炒雞蛋的功能*實(shí)際該功能是由內(nèi)部類Cook來執(zhí)行的
    */
    public void fireEgg(){
        new Cook().makeFood();
    }
}

代碼優(yōu)化

假設(shè)內(nèi)部類Cook提供了多個(gè)方法,而外部類中定義的多個(gè)方法又多次用到了Cook中提供的方法,那么類似上述示例中的調(diào)用方式,就會每次調(diào)用都會創(chuàng)建一個(gè)Cook的對象,用完即丟棄了,造成了程序上性能的降低。像這種情況我們就可以在父類DiningRoom中定義Cook的成員變量即可。

public class DiningRoom {
    private String egg="雞蛋";
    private Cook cook=new Cook();
    class Cook {
        public void makeFood() {
            //使用了外部類DiningRoom中定義的私有成員egg
            System.out.println("廚師使用"+egg+",做了一份炒雞蛋!");
        }
    }
    /**
    *DiningRoom類對外提供的做炒雞蛋的功能*實(shí)際該功能是由內(nèi)部類Cook來執(zhí)行的
    */
    public void fireEgg(){ 
        this.cook.makeFood();
    }
}

分析:通過代碼的改寫,那么即使父類DiningRoom中的多個(gè)方法多次調(diào)用Cook類中定義的方法時(shí),也只會創(chuàng)建Cook的一個(gè)對象,而不是多個(gè)對象。

靜態(tài)內(nèi)部類

使用static修飾符來修飾內(nèi)部類就稱為靜態(tài)內(nèi)部類,則這個(gè)內(nèi)部類就屬于外部類本身,而不屬于外部類的某個(gè)對象。因此使用static修飾的內(nèi)部類被稱為靜態(tài)內(nèi)部類

靜態(tài)內(nèi)部類可以包含靜態(tài)成員,也可以包含非靜態(tài)成員。根據(jù)靜態(tài)成員不能訪問非靜態(tài)成員的規(guī)則,靜態(tài)內(nèi)部類不能訪問外部類的實(shí)例成員,只能訪問外部類的類成員。即使是靜態(tài)內(nèi)部類的實(shí)例方法也不能訪問外部類的實(shí)例成員,只能訪問外部類的靜態(tài)成員。

示例代碼:

public class Factory {
    public static String noodle="面條";
    public static String dumplings="水餃";
    private String chicken="雞肉";
    public void madamFood(String food){
        System.out.println("廠長吃的是自己夫人做的飯!"+food);
    }
    public static void diningFood(String food){
        System.out.println("工人吃的是食堂做的飯!"+food);
    }
    static class DiningRoom {
        public static void eat(){
        	diningFood(Factory.noodle);
        }
        public void managerEat() {
            //編譯報(bào)錯(cuò),在靜態(tài)內(nèi)部類中,即使是非靜態(tài)的成員
            //也不能訪問外部類的非靜態(tài)的成員
            madamFood("abc");
        }
    }
}

分析:在上述示例中,靜態(tài)內(nèi)部類DiningRoom在進(jìn)行編譯時(shí)報(bào)錯(cuò),提示對象的實(shí)例上調(diào)用了不在范圍內(nèi)的數(shù)據(jù)信息。因?yàn)殪o態(tài)內(nèi)部類會跟隨外部類的靜態(tài)的信息同時(shí)存在,此時(shí)可以創(chuàng)建靜態(tài)內(nèi)部類的實(shí)例對象,但是并不一定會創(chuàng)建外部類的實(shí)例對象,那么去訪問外部類實(shí)例對象的成員就會出問題,因?yàn)閷ο蠖紱]有,怎么訪問對象上的成員呢?

局部內(nèi)部類

如果把一個(gè)內(nèi)部類定義在方法里面定義,則這個(gè)內(nèi)部類就是一個(gè)局部內(nèi)部類。

示例代碼:

public void run() {
    //定義一個(gè)局部內(nèi)部類,作用范圍更小,在方法外根本無法訪問
    class InnerTest {
        public int num2=5;
        public void run(){
            System.out.println(num2);
        }
    }
    InnerTest it=new InnerTest();
    it.run();
}

匿名內(nèi)部類

匿名內(nèi)部類的語法有些特別,創(chuàng)建匿名內(nèi)部類時(shí)會立即創(chuàng)建一個(gè)該類的實(shí)例,這個(gè)類定義立即消失,匿名內(nèi)部類不能重復(fù)使用。因此匿名內(nèi)部類適合創(chuàng)建那種只需要一次使用的類。

語法格式:

new 父類構(gòu)造器|實(shí)現(xiàn)接口 (){
    //匿名內(nèi)部類的類體部分
}

匿名內(nèi)部類必須繼承一個(gè)父類,或?qū)崿F(xiàn)一個(gè)接口,但最多只能繼承一個(gè)父類,實(shí)現(xiàn)一個(gè)接口。

  • 匿名內(nèi)部類不能是抽象類,因?yàn)橄到y(tǒng)在創(chuàng)建匿名內(nèi)部類時(shí),會立即創(chuàng)建匿名內(nèi)部類的對象。
  • 匿名內(nèi)部類不能定義構(gòu)造器,因?yàn)槟涿麅?nèi)部類沒有類名,也就無法定義構(gòu)造器,但是匿名內(nèi)部類可以定義實(shí)例初始化塊,通過初始化塊來完成初始化操作。

在Java的類庫中,有很多非常有用的工具類提供了大量的底層操作,可以讓程序開發(fā)人員能夠快速的進(jìn)行軟件的業(yè)務(wù)邏輯開發(fā),而不用去關(guān)注底層的實(shí)現(xiàn)。但是有些方法確實(shí)需要接收一些參數(shù)的,而這些參數(shù)都是接口類型,當(dāng)程序開發(fā)人員調(diào)用此方法時(shí),就必須要提供該接口的一個(gè)實(shí)現(xiàn)類,再去創(chuàng)建該實(shí)現(xiàn)類的對象才能去調(diào)用那些方法。

如果僅僅是為了調(diào)用某個(gè)方法,就為此去創(chuàng)建一個(gè)新的類就有點(diǎn)得不償失了。因此Java提供了匿名內(nèi)部類的方式可以非常有效的解決此類問題。

示例代碼:

public class Test { 
    public static void main(String[]args) {
        Integer [] nums={1,3,10,21,14,5,27};
        //sort方法需要接收一個(gè)Comparator排序器對象,Comparator是接口類型
        Arrays.sort (nums,new Comparator <Integer>(){
            @Override 
            public int compare (Integer int1,Integer int2){ 
                if(int1>int2){
                    return-1;               
                }else {
                    return1;
                }
            }
        });
        System.out.println(Arrays.toString(nums));
    }
}

代碼分析:Comparator<T>是一個(gè)排序器接口,用于進(jìn)行兩個(gè)數(shù)據(jù)之間的比較,數(shù)據(jù)類型需要通過<>這種方式在其中定義出來,compare就是接口中定義的方法,如果大于返回1,小于返回1,等于返回0。就是普通的升序排序,而如果反過來就是降序排序。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!

相關(guān)文章

  • IDEA調(diào)試小技巧之Evaluate調(diào)試工具詳解

    IDEA調(diào)試小技巧之Evaluate調(diào)試工具詳解

    這篇文章主要介紹了IDEA調(diào)試小技巧之Evaluate調(diào)試工具,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式

    Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了Java的深拷貝與淺拷貝的幾種實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • RocketMQ的push消費(fèi)方式實(shí)現(xiàn)示例

    RocketMQ的push消費(fèi)方式實(shí)現(xiàn)示例

    這篇文章主要為大家介紹了RocketMQ的push消費(fèi)方式實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-08-08
  • 一篇文章帶你入門Java修飾符

    一篇文章帶你入門Java修飾符

    Java語言提供了很多修飾符,主要分為以下兩類:訪問修飾符;非訪問修飾符。修飾符用來定義類、方法或者變量,通常放在語句的最前端。我們通過下面的例子來說明,下面就跟小編一起來看下吧
    2021-08-08
  • Spring?Boot?4.0對于Java開發(fā)的影響和前景

    Spring?Boot?4.0對于Java開發(fā)的影響和前景

    探索Spring?Boot?4.0如何徹底革新Java開發(fā),提升效率并開拓未來可能性!別錯(cuò)過這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強(qiáng)大魅力和潛力,準(zhǔn)備好了嗎?
    2024-02-02
  • Struts2訪問Servlet的三種方式

    Struts2訪問Servlet的三種方式

    這篇文章主要介紹了Struts2訪問Servlet的三種方式,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-06-06
  • springboot整合mail實(shí)現(xiàn)郵箱的發(fā)送功能

    springboot整合mail實(shí)現(xiàn)郵箱的發(fā)送功能

    本文分步驟給大家介紹springboot整合mail實(shí)現(xiàn)郵箱的發(fā)送功能,代碼簡單易懂,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-09-09
  • 使用Java反射模擬實(shí)現(xiàn)Spring的IoC容器的操作

    使用Java反射模擬實(shí)現(xiàn)Spring的IoC容器的操作

    這篇文章主要介紹了使用Java反射模擬實(shí)現(xiàn)Spring的IoC容器的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 使用Swagger2實(shí)現(xiàn)自動生成RESTful?API文檔

    使用Swagger2實(shí)現(xiàn)自動生成RESTful?API文檔

    在開發(fā)?RESTful?API?的過程中,文檔是非常重要的一部分,可以幫助開發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實(shí)現(xiàn)自動生成?RESTful?API?文檔,需要的可以參考一下
    2023-06-06
  • SpringBoot項(xiàng)目加載配置文件的6種方式小結(jié)

    SpringBoot項(xiàng)目加載配置文件的6種方式小結(jié)

    這篇文章給大家總結(jié)了六種SpringBoot項(xiàng)目加載配置文件的方式,通過@value注入,通過@ConfigurationProperties注入,通過框架自帶對象Environment實(shí)現(xiàn)屬性動態(tài)注入,通過@PropertySource注解,yml外部文件,Java原生態(tài)方式注入這六種,需要的朋友可以參考下
    2023-09-09

最新評論