1. 程式人生 > 其它 >面對物件3 抽象類 介面 final關鍵字

面對物件3 抽象類 介面 final關鍵字

技術標籤:抽象類多型java介面

面對物件3 抽象類 介面 final關鍵字

抽象類

如果一個類中沒有包含足夠的資訊來描繪一個具體的物件,這樣的類就是抽象類。
抽象類除了不能例項化物件之外,類的其它功能依然存在,成員變數、成員方法和構造方法。
用abstract修飾的類就是抽象類。如果某個類中包含有抽象方法,那麼該類就必須定義成抽象類。抽象類不一定有抽象方法

public abstract class Animals {//不能用抽象類建立物件
    
    String name;

    public abstract void eat();//抽象方法沒有方法體
    public
abstract void name(); public Animals(){//抽象類中可以有構造方法 } }

特點:
抽象類不能被例項化,但可以有建構函式,因為抽象類中含有無具體實現的方法,所以不能用抽象類建立物件。
抽象類只能用作基類(父類),表示的是一種繼承關係。

他就是用來被繼承的,一個類繼承抽象類,要麼將子類定義為抽象類類,要麼使用重寫.重寫所有抽象類中的方法.

抽象方法

抽象方法是一種特殊的方法:只有宣告,沒有具體體現,也就是沒有方法體.

抽象方法必須用abstract關鍵字進行修飾

public abstract void eat();//抽象方法沒有方法體
    public
abstract void name();

使用關鍵字abstract定義抽象類,一般語法

[訪問許可權] abstract class 類名 {
成員列表
}

public abstract class Animals {//不能用抽象類建立物件
public abstract void eat();
}

抽象類,抽象方法,在軟體開發過程中都是設計層面的概念。也就是說,設計人員會設計出抽象類,抽象方法,程式設計師都是來繼承這些抽象類並覆蓋抽象方法,實現具體功能。

介面

生活中常見的介面有:usb充電器,u盤等等

可以使用Java介面來實現

USB本身沒有實現任何功能

USB介面規定了資料傳輸的要求

USB介面可以被多種USB裝置實現

編寫USB介面---->根據需求設計方法

實現USB介面----->實現所有方法

使用USB介面----->用多型的方式使用

public interface  Animal {
    /*
    interface關鍵字修飾的是介面
     */
    public static final int num=0;
    /*
    變數預設為 public static final 修飾
     */
    public abstract void eat();
    void sleep();
    /*
    方法預設為抽象型別的方法
    public abstract void eat();
     */

}

使用interface關鍵字修飾的是介面.

介面中變數預設被public static final修飾

介面中方法預設為抽象型別的方法public abstract void/返回值型別 方法名(){}

介面特性:

介面不可以被例項化

實現類必須重寫介面的所有方法,否則報錯

實現類可以實現多個介面

介面中的變數都是靜態常量

用implements關鍵字實現介面

public class Dog implements Animal{

面向介面程式設計

關心實現類有什麼功能,而不管細節方面

面向介面的約定而不考慮介面的具體實現

介面存在的意義

java中一個類只能有一個父類,所以用介面可以實現多繼承的邏輯

從本質上講,介面是一種特殊的抽象類,這種抽象類中只包含常量和方法的定義,而沒有變數和方法的實現。

介面的定義和使用

介面的定義:使用 interface 關鍵字用來宣告一個介面。
[訪問修飾符] interface 介面名稱 [extends 其他的介面名1,….其他的介面名n] {
// 宣告常量
// 抽象方法
}

public interface  Animal {
    
    public static final int num=0;//宣告常量
    
    public abstract void eat();//抽象方法
    void sleep();
}

介面的使用:類使用implements關鍵字實現介面。在類宣告中,Implements關鍵字放在class聲明後面。
[訪問修飾符] class 類名 implements 介面名1,介面名2……{ }

public class Dog implements Animal1,Animasl2{}

結合繼承:
[訪問修飾符] class 類名 extends 父類名 implements 介面名1,介面名2……{ }

public class Dog extends Animal implements Animal{}

介面的特性

介面是隱式抽象的,當宣告一個介面的時候,不必使用abstract關鍵字。
介面中每一個方法也是隱式抽象的,預設為public abstract 。
介面中宣告的屬性預設為 public static final 的;
介面不是被類繼承了,而是要被類實現。
介面不能例項化物件(無構造方法),但可以宣告物件的引用。(多型性)
多個類可以實現同一個介面。
一個類可以實現多個介面,但只能繼承一個類。
與繼承關係類似,介面與實現類之間存在多型性。
一個介面能繼承其它多個介面。
當類實現介面的時候,類要實現介面中所有的方法。否則,類必須宣告為抽象的類。

final關鍵字

先把整體程式碼貼上來,再逐一介紹

/*
final用於宣告屬性,方法,類
被final修飾的類不能被繼承,並且不能被定義為抽象類或是介面
//public final class FinalDemo{}
 */
public  class FinalDemo {
    /*
    定義就必須直接賦值或者在構造方法中進行賦值,並且不能再修改
     */
    final int num = 10;//final修飾的變數變為常量 值不能改變
    //直接初始化變數        建議用static修飾 在記憶體中就只有一份了
    int count;//在建立的每個物件中包含一個常量 必須在構造方法中賦值
    /*
    在宣告時沒有賦值,則必須在構造方法中逐一賦值
     */

    public FinalDemo(){
        //預設無參的構造方法
    }
    public FinalDemo(int a){
        count=a;
        System.out.println(count);
    }
    public void test(final int a){
        System.out.println(a);
    }
    public final void eat(){//被final修飾的方法不能被子類重寫
        System.out.println("吃");

    }

    public static void main(String[] args) {
        FinalDemo f1 = new FinalDemo(10);
        FinalDemo f2 = new FinalDemo(5);
    }
}

final 用於宣告屬性,方法和類,被final修飾的類不能被繼承,並且不能被定義為抽象類或者是介面

public final class FinalDemo{}

屬性:定義就必須直接賦值或者在構造方法中進行賦值,並且後期都不能修改。

如果在宣告時沒有賦值,則必須在構造方法中逐一賦值

final int num = 10;//final修飾的變數變為常量 值不能改變
 int count;//在建立的每個物件中包含一個常量 必須在構造方法中賦值

int count在宣告時沒有賦值,則必須要在構造方法中賦值

public FinalDemo(int a){
        count=a;
        System.out.println(count);
    }

public static void main(String[] args) {
        FinalDemo f1 = new FinalDemo(10);
    }

方法:子類裡不可被覆蓋。

public final void eat(){//被final修飾的方法不能被子類重寫
        System.out.println("吃");
    }

類:不能被定義為抽象類或是介面,不可被繼承。