Java抽象類、接口整理
抽象類
5.1抽象類產生(上標為A)
編寫一個類時,會給該類定義一些方法,這些方法是用來描述功能和具體實現的方式,這些方法都有方法體
例如:一個圖形類應該有周長的方法,但是不同的圖形求周長方法不一樣。分析事物,發現共性,就出現了向上抽取。
方法的聲名相同,但是方法功能主體不同,這樣就可以向上抽取,但只是抽取方法聲名,但不抽取方法主體,稱這個方法就是抽象方法
抽象函數類必須被abstract關鍵字修飾,被abstract關鍵字修飾的類就是抽象類
5.2抽象類&抽象方法的定義
抽象方法定義格式:
public abstract 返回值類型 方法名(參數);
抽象類定義的格式:
abstract class 類名{
}
package com.oracle.demo08;
public abstract class Developer {
//抽象方法
public abstract void work();
}
package com.oracle.demo08;
public class JavaEE extends Developer{
public void work() {
System.out.println("JavaEE工程師寫JavaEE代碼");
}
}
package com.oracle.demo08;
public class Android extends Developer{
public void work() {
System.out.println("Android工程師寫Android代碼");
}
}
package com.oracle.demo08;
public class Text {
public static void main(String[] args) {
JavaEE java=new JavaEE();
java.work();
Android android=new Android();
android.work();
}
}
運行結果:
5.3抽象類的特點:
- 抽象類和抽象方法都要被abstract修飾,抽象方法一定要定義在抽象類中
- 抽象類不可以直接創建對象
- 只有覆蓋了抽象類中所有的抽象方法後,其子類才可以創建對象。否則該子類還是一個抽象類
5.4抽象類的細節問題:
抽象類是一個父類?
是的,不斷抽取而來
抽象類中是否可以不定義抽象方法
是的,不讓該類創建對象,方法可以直接讓子類去使用
Private :私有的方法子類是無法繼承的,也不存在覆蓋
Abstract和private也是不可以一起使用的
接口
6.1接口概念(上標為I)
接口是功能的集合,接口只描述所應該具備的方法,並沒有具體實現,功能的定義和現實分離,優化程序設計
6.2接口的定義
接口定義式需要使用interface關鍵字,編譯之後還是。Class文件
格式:
package com.oracle.demo01;
public interface MyInterface {
//接口中所有成員變量修飾符 public static final
//static 靜態:只要被static 修飾的成員 在外界可以直接通過
//類名.成員調用
//final:最終的 被final修飾的變量叫常量 一次賦值終身不變
//接口中所有的方法的修飾符 public abstract
public abstract void a();
}
使用interface代替了原來的class,其他步驟與定義類相同:
接口中的方法均為公共訪問的抽象方法
接口中無法定義普通的成員變量
6.3類實現接口(implements)
類與接口的關系為實現關系,即類實現接口。實現使用implements
格式:
package com.oracle.demo01;
public class MyinterfaceImp implements MyInterface {
public void a() {
}
}
在類實現接口後,該類就會將接口中的抽象方法繼承過來,此時該類需要重寫該抽象方法,完成具體的邏輯。
接口中定義功能,當需要具有該功能時,可以讓類實現該接口,只聲明了應該具備
該方法,是功能的聲明
在具體實現類中重寫方法,實現功能,是方法的具體實現。
6.4接口中成員的特點
1、接口中可以定義變量,但是變量必須有固定的修飾符修飾,public static final 所以接口中的變量也稱之為常量,其值不能改變。後面我們會講解static與final關鍵字
2、接口中可以定義方法,方法也有固定的修飾符,public abstract
3、接口不可以創建對象。
4、子類必須覆蓋掉接口中所有的抽象方法後,子類才可以實例化。否則子類是一個抽象類。
public: 權限修飾符 公共的 無論在哪裏都是可以訪問被該修飾符的成員
static: 靜態 都可以直接被類名調用, 即類名.變量名(方法名)
final :最終的被 final修飾的變量稱為常量,一旦賦值終身不變
package com.oracle.demo01;
public interface MyInterface {
//接口中所有成員變量修飾符 public static final
//static 靜態:只要被static 修飾的成員 在外界可以直接通過
//類名.成員調用
//final:最終的 被final修飾的變量叫常量 一次賦值終身不變
//接口中所有的方法的修飾符 public abstract
public static final int num=3;
public abstract void show1();
public abstract void show2();
}
package com.oracle.demo01;
public class MyinterfaceImp implements MyInterface {
public void show1() {
}
public void show2() {
}
}
6.5接口的多實現
接口最重要的體現:解決多繼承的弊端。將多繼承這種機制在java中通過多實現完成了。
interface Fu1
{
void show1();
}
interface Fu2
{
void show2();
}
class Zi implements Fu1,Fu2// 多實現。同時實現多個接口。
{
public void show1(){}
public void show2(){}
}
怎麽解決多繼承的弊端
多繼承時,當多個父類中有相同功能時,子類調用會產生不確定性。
其實核心原因就是在於多繼承父類中功能有主體,而導致調用運行時,不確定運行哪個主體內容。
為什麽多實現能解決了呢?
因為接口中的功能都沒有方法體,由子類來明確。
6.6類繼承類同時實現接口
接口和類之間可以通過實現產生關系,子類通過繼承父類擴展功能,通過繼承擴展的功能都是子類應該具備的基礎功能。
class Fu {
public void show(){}
}
interface Inter {
pulbic abstract void show1();
}
class Zi extends Fu implements Inter {
public void show1() {
}
}
接口的出現避免了單繼承的局限性。父類中定義的事物的基本功能。接口中定義的事物的擴展功能。
6.7接口的多繼承
多個接口之間可以使用extends進行繼承。
interface Fu1{
void show();
}
interface Fu2{
void show1();
}
interface Fu3{
void show2();
}
interface Zi extends Fu1,Fu2,Fu3{
void show3();
}
在開發中如果多個接口中存在相同方法,這時若有個類實現了這些接口,那麽就要實現接口中的方法,由於接口中的方法是抽象方法,子類實現後也不會發生調用的不確定性。
6.8接口的思想
舉例:我們都知道電腦上留有很多個插口,而這些插口可以插入相應的設備,這些設備為什麽能插在上面呢?主要原因是這些設備在生產的時候符合了這個插口的使用規則,否則將無法插入接口中,更無法使用。發現這個插口的出現讓我們使用更多的設備。
筆記本案例:
package com.oracle.demo04;
public interface USB {
public abstract void open();
public abstract void close();
}
package com.oracle.demo04;
public class Mouse implements USB{
public void open() {
System.out.println("鼠標正在開啟");
}
public void close() {
System.out.println("鼠標正在關閉");
}
}
package com.oracle.demo04;
public class Keyboard implements USB {
public void open() {
System.out.println("鍵盤正在開啟");
}
public void close() {
System.out.println("鍵盤正在關閉");
}
}
package com.oracle.demo04;
public class Computer {
//運行
public void run(){
System.out.println("電腦正在開啟");
}
//USB設備功能
public void function(USB usb){
//開啟
usb.open();
//關閉
usb.close();
}
//關閉
public void close(){
System.out.println("電腦正在關閉");
}
}
package com.oracle.demo04;
public class Test {
public static void main(String[] args) {
Computer c=new Computer();
Mouse m=new Mouse();
Keyboard key=new Keyboard();
c.run();
c.function(new Mouse());//c.function(m);
c.function(new Keyboard());//c.function(key);
c.close();
}
}
總結:接口在開發中的它好處
1、接口的出現擴展了功能。
2、接口其實就是暴漏出來的規則。
3、接口的出現降低了耦合性,即設備與設備之間實現了解耦。
6.9接口和抽象的區別
相同點:
位於繼承的頂端,用於被其他類實現或繼承;
都不能直接實例化對象;
都可以包含抽象方法,其子類都必須覆寫這些抽象方法;
區別:
抽象類為部分方法提供實現,避免子類重復實現這些方法,提高代碼重用性;接口只能包含抽象方法;
一個類只能繼承一個直接父類(可能是抽象類),卻可以實現多個接口;(接口彌Java的單繼承)
抽象類是這個事物中應該具備的內容, 繼承體系是一種 is..a關系
接口是這個事物中的額外內容,繼承體系是一種 like..a關系
二者的選用:
優先選用接口,盡量少用抽象類;
需要定義子類的行為,又要為子類提供共性功能時才選用抽象類;
Java抽象類、接口整理