天天看點

Java學習路線-6:Annotation注解、多态和抽象類第15 章 : Annotation注解第16 章 : 多态性第17 章 : Object類第18 章 : 抽象類的定義與使用

第15 章 : Annotation注解

71 Annotation簡介

JDK>=1.5

作用

1、減少程式配置的代碼

2、進行結構化定義

以注解的形式實作程式開發

程式代碼(資源排程)

資源:關系型資料庫 + NoSQL系統 + 消息服務 + 資料服務

配置檔案:資料庫連接配接資源 + 其他連接配接資源

程式開發結構的曆史

第一階段:所有配置都寫在程式代碼中,不利于維護

第二階段:引入配置檔案,适用于配置項不多的情況

第三階段:配置資訊重新寫回程式裡,利用特殊标記與代碼分離

@Override

@Deprecated

@SuppressWarnings

72 準确覆寫

問題:

1、繼承忘記寫extends

2、覆寫方法單詞拼錯

@Override 明确表示該方法是覆寫方法

程式編譯時檢查錯誤,保證覆寫準确性

class Resource{
    public void connect(){
        System.out.println("資源連接配接");
    } 
}


class Database extends Resource{
    @Override
    public void connect(){
        System.out.println("資料庫資源連接配接");
    }

}


class Demo{
    public static void main(String[] args) {
        Database db = new Database();
        
        // 調用子類的方法
        db.connect();  
        // 資料庫資源連接配接
    }
}
      

73 過期聲明

軟體項目疊代開發過程中,可能有的地方考慮不周,不能直接删除這些操作

給一個過渡時間,老系統可以繼續用,新項目不要用了

class Database{
    @Deprecated
    public void connect(){
        System.out.println("資料庫資源連接配接");
    }

    public void connection(){
        System.out.println("新的方式:資料庫資源連接配接");
    }
}


class Demo{
    public static void main(String[] args) {
        Database db = new Database();
        
        db.connect();  
        /* 注: Demo.java使用或覆寫了已過時的 API。
            注: 有關詳細資訊, 請使用 -Xlint:deprecation 重新編譯。
            資料庫資源連接配接
        */
    }
}
      

74 壓制警告

隐藏警告提示

class Database{
    @Deprecated
    public void connect(){
        System.out.println("資料庫資源連接配接");
    }
}


class Demo{
    // 隐藏 deprecation 警告
    @SuppressWarnings({"deprecation"})
    public static void main(String[] args) {
        Database db = new Database();
        
        db.connect();  
        // 資料庫資源連接配接
    }
}
      

第16 章 : 多态性

75 多态性簡介

多态是在繼承的基礎上擴充出來的概念,實作父子類之間的轉換處理

Java中多态的兩種實作模式

1、方法多态性

-方法重載:同一個方法名稱可以根據傳入的參數類型,個數的不同,實作不同功能的執行

-方法覆寫:同一個方法,在不同子類中有不同的實作

2、對象多态性(父子之間轉換處理)

-對象向上轉型 父類 父類執行個體 = 子類執行個體 (自動轉換)

-對象向下轉型 子類 子類執行個體 = (子類)父類執行個體 (強制轉換)

方法重載

class Demo{
    public static void print(){
        System.out.println("預設輸出");
    }

    public static void print(String message){
        System.out.println(message);
    }

    public static void main(String[] args) {
        Demo.print(); // 預設輸出

        Demo.print("自定義輸出"); // 自定義輸出
    }
}
      

方法覆寫

class Database{
    public void  connect(){
        System.out.println("資料庫連接配接");
    }
}

class MySQLDatabase extends Database{
    @Override
    public void connect(){
        System.out.println("MySQL資料庫連接配接");
    }
}

class RedisDatabase extends Database{
    @Override
    public void connect(){
        System.out.println("Redis資料庫連接配接");
    }
}

class Demo{
    public static void main(String[] args) {
        Database db = null;

        db = new Database();
        db.connect();  // 資料庫連接配接

        db = new MySQLDatabase();
        db.connect(); // MySQL資料庫連接配接


        db = new RedisDatabase();
        db.connect(); // Redis資料庫連接配接

    }
}      

76 對象向上轉型

向上轉型的優勢:參數可以統一設計(接收或傳回參數統一性)

重載也可以實作相同的效果,如果子類過多,代碼不利維護

class Database{
    public void  connect(){
        System.out.println("資料庫連接配接");
    }
}

class MySQLDatabase extends Database{
    @Override
    public void connect(){
        System.out.println("MySQL資料庫連接配接");
    }
}

class RedisDatabase extends Database{
    @Override
    public void connect(){
        System.out.println("Redis資料庫連接配接");
    }
}

class Demo{
    // 接收統一的參數 Database 和其子類
    public static void connect(Database db){
        db.connect();
    }

    public static void main(String[] args) {
        // 相當于 Database db = new Database()
        Demo.connect(new Database()) ;

        // 自動向上轉型 相當于 Database db = new MySQLDatabase()
        Demo.connect(new MySQLDatabase()) ;

        // 自動向上轉型 相當于 Database db = new RedisDatabase()
        Demo.connect(new RedisDatabase()) ;

    }
}
      

77 對象向下轉型

向下轉型主要特點:

需要使用到子類自己的特殊方法

class Person{
    public void eat(){
        System.out.println("I can eat");
    }
}

class SuperMan extends Person{
    public void fly(){
        System.out.println("I can fly");
    }
}

class Demo{
    public static void main(String[] args) {

        // 向上自動轉型
        Person person = new SuperMan() ;
        person.eat() ; // I can eat

        // 向下強制轉型
        SuperMan superMan = (SuperMan) person ;
        superMan.fly() ;  // I can fly

    }
}

      

向上描述的是一些公共特征

向下描述的是子類特殊的定義, 不安全

向下轉型之前一定要有向上轉型

78 instanceof關鍵字

文法

對象 instanceof 類      

如果要執行向下轉型要先做類型判斷

// 向上自動轉型
Person person = new SuperMan() ;
person instanceof Person ; // true
person instanceof SuperMan ; // true

// 向下強制轉型
SuperMan superMan = (SuperMan) person ;
superMan instanceof Person ; // true
superMan instanceof SuperMan ; // true      

第17 章 : Object類

79 Object類的基本概念

Java中隻有一個類不存在繼承關系,Object可以接收所有的資料類型

所有類預設都是Object子類

兩種定義方式等價

class Person{}

class Person extends Object{}
      

Object類提供無參構造方法

class Person{}

class Demo{
    public static void main(String[] args) {
        Object obj = new Person() ;

        if(obj instanceof Person){
            Person person = (Person) obj ;
        }
    }
}
      

Object可以接收所有引用類型,萬能資料類型

适合進行程式的标準設計

Object接收數組

Object obj = new int[] {1, 2, 3} ;

if(obj instanceof int[]){
    int[] data  = (int[]) obj ;

    for(int x : data){
        System.out.println(x);
    }
}      

80 取得對象資訊

toString() 從Object繼承而來

對象直接輸出調用的是toString()

class Person{
    private String name ; 
    private int age ;

    public Person(){}

    public Person(String name, int age){
        this.name = name ;
        this.age = age ;
    }

    @Override
    public String toString(){
        return "name: " + this.name + " age: " + this.age ; 
    }

}

class Demo{
    public static void main(String[] args) {
        Person person = new Person("張三", 23);
        System.out.println(person);
        // name: 張三 age: 23
    }
}
      

81 對象比較

Object提供 equals比較對象内容

預設比較對象位址

class Person{
    private String name ; 
    private int age ;

    public Person(){}

    public Person(String name, int age){
        this.name = name ;
        this.age = age ;
    }

    @Override
    public boolean equals(Object obj){
        
        // 處理null
        if(obj == null){
            return false ;
        }

        // 同對象比較
        if(this == obj ){
            return true;
        }

        // 不同類型比較
        if(!(obj instanceof Person)){
            return false ;
        }

        Person person = (Person) obj ;

        return this.name == person.name && this.age == person.age ;
    }

}

class Demo{
    public static void main(String[] args) {
        Person person1 = new Person("張三", 23);
        Person person2 = new Person("張三", 23);

        System.out.println(person1.equals(person1)); // true
        System.out.println(person1.equals(person2)); // true

        System.out.println(person1.equals(null)); // false
        System.out.println(person1.equals("李四")); // false
     
    }
}
      

第18 章 : 抽象類的定義與使用

82 抽象類基本概念

類繼承主要作用在于可以擴充已有類的功能,不過不能強制子類必須覆寫哪些類

父類設計優先考慮抽象類

抽象類:對子類覆寫方法進行約定

抽象方法:abstract關鍵字定義并且沒有提供方法體的方法

抽象類:抽象方法所在的類必須為抽象類

抽象類不是完整的類,不能直接執行個體化

使用抽象類:

1、抽象類必須提供子類,子類使用extends繼承抽象類

2、抽象類子類一定要覆寫抽象類中的全部抽象方法

3、抽象類的對象執行個體化可以利用對象多态性通過子類向上轉型的方式完成

抽象類隻是比普通類增加了抽象方法,以及對子類的強制性覆寫要求,使用和普通類完全相同

核心問題:抽象類無法直接執行個體化

主要目的:進行過渡操作,解決類繼承問題中代碼重複處理

// 定義抽象類
abstract class Database{
    private String type ;

    // 抽象方法
    public abstract void connect() ;

    // 普通方法
    public void setType(String type){
        this.type = type;
    }

    public String getType(){
        return this.type;
    }
}

class MySQLDatabase extends Database{
    @Override
    public void connect(){
        System.out.println("MySQL資料庫連接配接");
    }
}

class Demo{
    public static void main(String[] args) {
        Database db = new MySQLDatabase();
        db.connect();
        // MySQL資料庫連接配接
    }
}
      

83 抽象類的相關說明

注意要點:

1、定義抽象類不能使用final 關鍵字定義,抽象類必須有子類

2、抽象類是普通類的加強版,抽象類可以提供構造方法

3、抽象類允許沒有抽象方法,無法new執行個體化對象,必須由子類完成

4、抽象類可以提供static 方法,不受抽象類結構限制

static 方法永遠可以通過類名調用

// 定義抽象類
abstract class Database{}

// 子類繼承
class MySQLDatabase extends Database{}

class Demo{
    public static void main(String[] args) {
        Database db = new MySQLDatabase();
    }
}      

84 模闆設計模式

抽象類的定義比普通類更高一層

抽象類好處

1、對子類方法統一管理

2、提供一些普通方法,并且普通方法可調用抽象方法

// 定義抽象類
abstract class Action{
    public static final int EAT = 1;
    public static final int SLEEP = 2;

    public void command(int code){
        switch (code){
            case EAT:{
                this.eat();
                break;
            }

            case SLEEP: {
                this.sleep();
                break;
            }

            case EAT + SLEEP: {
                this.eat();
                this.sleep();
                break;
            }
        }
    }

    public abstract void eat();
    public abstract void sleep();

}


class Dog extends Action{
    public void eat(){
        System.out.println("Dog eat");
    }

    public void sleep(){
        System.out.println("Dog sleep");
    }
}


class Cat extends Action{
    public void eat(){
        System.out.println("Cat eat");
    }

    public void sleep(){
        System.out.println("Cat sleep");
    }
}


class Demo{
    public static void main(String[] args) {
        Action dog = new Dog();
        dog.command(Action.EAT);
        // Dog eat

        Action cat = new Cat();
        cat.command(Action.EAT + Action.SLEEP);
        // Cat eat
        // Cat sleep
    }
}
      

85 包裝類實作原理分析

包裝類針對基本資料類型對象轉換而實作

基本資料類型不是一個類

基本資料類型以類的形式進行處理,需要對其進行包裝

裝箱:将基本資料類型儲存到包裝類中

拆箱:從包裝類對象中擷取基本資料類型

// 定義包裝類
class Int{
    private int data;
    
    public Int(int data){
        this.data = data ;
    }

    public int intValue(){
        return this.data ;
    }
}
    

class Demo{
    public static void main(String[] args) {
        // 裝箱 基本資料類型 => 對象類型
        Object obj = new Int(12) ;

        // 拆箱 對象類型 => 基本資料類型
        int x = ((Int)obj).intValue();
       
        System.out.println(x) ;
       // 12
    }
}
      

基本資料類型進行包裝類後,可以向對象一樣進行引用傳遞

8種基本資料類型

Object
-數值型Number{abstract}
    -Byte: byte-8
    -Short: short-16
    -Integer: int-32
    -Long: long-64          
    -Float: float-32
    -Double: double-64     
-布爾型Boolean:boolean                    
-字元型Character:char-16           

Java中有兩種包裝類:

1、對象型包裝類Object子類:Boolean,Character

2、數值型包裝類Number子類:Byte,Short, Integer, Long, Float, Double

Number類提供的方法:

byte byteValue()
short shortValue()
abstract int intValue()
abstract long longValue()
abstract float floatValue()
abstract double doubleValue()      

86 裝箱與拆箱

Integer

Integer obj = new Integer(12) ;
int x = obj.intValue();

System.out.println(x) ;
// 12      
boolean booleanValue()      

JDK >= 1.5 自動裝箱拆箱

JDK >= 1.9 過期

Integer obj = 2 ;
int x = obj;

// 直接參與數學運算
System.out.println(x * obj) ;
// 4      

自動裝箱好處是Object可直接接收基本資料類型

// 自動裝箱為Integer,再自動向上轉型為Object
Object obj = 2 ;

// 先向下轉型為Integer,再自動拆箱
int x = (Integer)obj;      

相等判斷,一定使用equals完成

Integer x = 12 ;
Integer y = 12 ;

System.out.println(x == y ); // true


Integer x = 127 ;
Integer y = 127 ;

System.out.println(x == y ); // true


Integer x = 128 ;
Integer y = 128 ;

System.out.println(x == y ); // false
System.out.println(x.equals(y)); // true

Integer x = -128 ;
Integer y = -128 ;

System.out.println(x == y ); // true


Integer x = -129 ;
Integer y = -129 ;

System.out.println(x == y ); // false