1. 程式人生 > >Java抽象類、接口整理

Java抽象類、接口整理

關系 什麽 oid develop ora 靜態 必須 局限性 內容

抽象類

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抽象類的特點:

  1. 抽象類和抽象方法都要被abstract修飾,抽象方法一定要定義在抽象類中
  2. 抽象類不可以直接創建對象
  3. 只有覆蓋了抽象類中所有的抽象方法後,其子類才可以創建對象。否則該子類還是一個抽象類

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抽象類、接口整理