面對物件3 抽象類 介面 final關鍵字
面對物件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("吃");
}
類:不能被定義為抽象類或是介面,不可被繼承。