国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之抽象類&接口&內(nèi)部類(十一)

這篇具有很好參考價(jià)值的文章主要介紹了從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之抽象類&接口&內(nèi)部類(十一)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

第一章 抽象類

1.1 概述

1.1.1 抽象類引入

? 父類中的方法,被它的子類們重寫,子類各自的實(shí)現(xiàn)都不盡相同。那么父類的方法聲明和方法主體,只有聲明還有意義,而方法主體則沒有存在的意義了(因?yàn)樽宇悓?duì)象會(huì)調(diào)用自己重寫的方法)。換句話說,父類可能知道子類應(yīng)該有哪個(gè)功能,但是功能具體怎么實(shí)現(xiàn)父類是不清楚的(由子類自己決定),父類只需要提供一個(gè)沒有方法體的定義即可,具體實(shí)現(xiàn)交給子類自己去實(shí)現(xiàn)。我們把沒有方法體的方法稱為抽象方法。Java語法規(guī)定,包含抽象方法的類就是抽象類。

  • 抽象方法 : 沒有方法體的方法。
  • 抽象類:包含抽象方法的類。

1.2 abstract使用格式

abstract是抽象的意思,用于修飾方法方法和類,修飾的方法是抽象方法,修飾的類是抽象類。

1.2.1 抽象方法

使用abstract 關(guān)鍵字修飾方法,該方法就成了抽象方法,抽象方法只包含一個(gè)方法名,而沒有方法體。

定義格式:

修飾符 abstract 返回值類型 方法名 (參數(shù)列表)

代碼舉例:

public abstract void run();

1.2.2 抽象類

如果一個(gè)類包含抽象方法,那么該類必須是抽象類。注意:抽象類不一定有抽象方法,但是有抽象方法的類必須定義成抽象類。

定義格式:

abstract class 類名字 { 
  
}

代碼舉例:

public abstract class Animal {
    public abstract void run()}

1.2.3 抽象類的使用

要求:繼承抽象類的子類必須重寫父類所有的抽象方法。否則,該子類也必須聲明為抽象類。

代碼舉例:

// 父類,抽象類
abstract class Employee {
	private String id;
	private String name;
	private double salary;
	
	public Employee() {
	}
	
	public Employee(String id, String name, double salary) {
		this.id = id;
		this.name = name;
		this.salary = salary;
	}
	
	// 抽象方法
	// 抽象方法必須要放在抽象類中
	abstract public void work();
}

// 定義一個(gè)子類繼承抽象類
class Manager extends Employee {
	public Manager() {
	}
	public Manager(String id, String name, double salary) {
		super(id, name, salary);
	}
	// 2.重寫父類的抽象方法
	@Override
	public void work() {
		System.out.println("管理其他人");
	}
}

// 定義一個(gè)子類繼承抽象類
class Cook extends Employee {
	public Cook() {
	}
	public Cook(String id, String name, double salary) {
		super(id, name, salary);
	}
	@Override
	public void work() {
		System.out.println("廚師炒菜多加點(diǎn)鹽...");
	}
}

// 測(cè)試類
public class Demo10 {
	public static void main(String[] args) {
		// 創(chuàng)建抽象類,抽象類不能創(chuàng)建對(duì)象
		// 假設(shè)抽象類讓我們創(chuàng)建對(duì)象,里面的抽象方法沒有方法體,無法執(zhí)行.所以不讓我們創(chuàng)建對(duì)象
//		Employee e = new Employee();
//		e.work();
		
		// 3.創(chuàng)建子類
		Manager m = new Manager();
		m.work();
		
		Cook c = new Cook("ap002", "庫(kù)克", 1);
		c.work();
	}
}

此時(shí)的方法重寫,是子類對(duì)父類抽象方法的完成實(shí)現(xiàn),我們將這種方法重寫的操作,也叫做實(shí)現(xiàn)方法。

1.3 抽象類的特征

抽象類的特征總結(jié)起來可以說是 有得有失

有得:抽象類得到了擁有抽象方法的能力。

有失:抽象類失去了創(chuàng)建對(duì)象的能力。

其他成員(構(gòu)造方法,實(shí)例方法,靜態(tài)方法等)抽象類都是具備的。

1.4 抽象類的細(xì)節(jié)

不需要背,只要當(dāng)idea報(bào)錯(cuò)之后,知道如何修改即可。

關(guān)于抽象類的使用,以下為語法上要注意的細(xì)節(jié),雖然條目較多,但若理解了抽象的本質(zhì),無需死記硬背。

  1. 抽象類不能創(chuàng)建對(duì)象,如果創(chuàng)建,編譯無法通過而報(bào)錯(cuò)。只能創(chuàng)建其非抽象子類的對(duì)象。

    理解:假設(shè)創(chuàng)建了抽象類的對(duì)象,調(diào)用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。

  2. 抽象類中,可以有構(gòu)造方法,是供子類創(chuàng)建對(duì)象時(shí),初始化父類成員使用的。

    理解:子類的構(gòu)造方法中,有默認(rèn)的super(),需要訪問父類構(gòu)造方法。

  3. 抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。

    理解:未包含抽象方法的抽象類,目的就是不想讓調(diào)用者創(chuàng)建該類對(duì)象,通常用于某些特殊的類結(jié)構(gòu)設(shè)計(jì)。

  4. 抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則子類也必須定義成抽象類,編譯無法通過而報(bào)錯(cuò)。

    理解:假設(shè)不重寫所有抽象方法,則類中可能包含抽象方法。那么創(chuàng)建對(duì)象后,調(diào)用抽象的方法,沒有意義。

  5. 抽象類存在的意義是為了被子類繼承。

    理解:抽象類中已經(jīng)實(shí)現(xiàn)的是模板中確定的成員,抽象類不確定如何實(shí)現(xiàn)的定義成抽象方法,交給具體的子類去實(shí)現(xiàn)。

1.5 抽象類存在的意義

? 抽象類存在的意義是為了被子類繼承,否則抽象類將毫無意義。抽象類可以強(qiáng)制讓子類,一定要按照規(guī)定的格式進(jìn)行重寫。

第二章 接口

2.1 概述

我們已經(jīng)學(xué)完了抽象類,抽象類中可以用抽象方法,也可以有普通方法,構(gòu)造方法,成員變量等。那么什么是接口呢?接口是更加徹底的抽象,JDK7之前,包括JDK7,接口中全部是抽象方法。接口同樣是不能創(chuàng)建對(duì)象的。

2.2 定義格式

//接口的定義格式:
interface 接口名稱{
    // 抽象方法
}

// 接口的聲明:interface
// 接口名稱:首字母大寫,滿足“駝峰模式”

2.3 接口成分的特點(diǎn)

在JDK7,包括JDK7之前,接口中的只有包含:抽象方法和常量

2.3.1.抽象方法

? 注意:接口中的抽象方法默認(rèn)會(huì)自動(dòng)加上public abstract修飾程序員無需自己手寫??!
? 按照規(guī)范:以后接口中的抽象方法建議不要寫上public abstract。因?yàn)闆]有必要啊,默認(rèn)會(huì)加上。

2.3.2 常量

在接口中定義的成員變量默認(rèn)會(huì)加上: public static final修飾。也就是說在接口中定義的成員變量實(shí)際上是一個(gè)常量。這里是使用public static final修飾后,變量值就不可被修改,并且是靜態(tài)化的變量可以直接用接口名訪問,所以也叫常量。常量必須要給初始值。常量命名規(guī)范建議字母全部大寫,多個(gè)單詞用下劃線連接。

2.3.3 案例演示

public interface InterF {
    // 抽象方法!
    //    public abstract void run();
    void run();

    //    public abstract String getName();
    String getName();

    //    public abstract int add(int a , int b);
    int add(int a , int b);


    // 它的最終寫法是:
    // public static final int AGE = 12 ;
    int AGE  = 12; //常量
    String SCHOOL_NAME = "程序員";

}

2.4 基本的實(shí)現(xiàn)

2.4.1 實(shí)現(xiàn)接口的概述

類與接口的關(guān)系為實(shí)現(xiàn)關(guān)系,即類實(shí)現(xiàn)接口,該類可以稱為接口的實(shí)現(xiàn)類,也可以稱為接口的子類。實(shí)現(xiàn)的動(dòng)作類似繼承,格式相仿,只是關(guān)鍵字不同,實(shí)現(xiàn)使用 implements關(guān)鍵字。

2.4.2 實(shí)現(xiàn)接口的格式

/**接口的實(shí)現(xiàn):
    在Java中接口是被實(shí)現(xiàn)的,實(shí)現(xiàn)接口的類稱為實(shí)現(xiàn)類。
    實(shí)現(xiàn)類的格式:*/
class 類名 implements 接口1,接口2,接口3...{

}

從上面格式可以看出,接口是可以被多實(shí)現(xiàn)的。大家可以想一想為什么呢?

2.4.3 類實(shí)現(xiàn)接口的要求和意義

  1. 必須重寫實(shí)現(xiàn)的全部接口中所有抽象方法。
  2. 如果一個(gè)類實(shí)現(xiàn)了接口,但是沒有重寫完全部接口的全部抽象方法,這個(gè)類也必須定義成抽象類。
  3. 意義:接口體現(xiàn)的是一種規(guī)范,接口對(duì)實(shí)現(xiàn)類是一種強(qiáng)制性的約束,要么全部完成接口申明的功能,要么自己也定義成抽象類。這正是一種強(qiáng)制性的規(guī)范。

2.4.4 類與接口基本實(shí)現(xiàn)案例

假如我們定義一個(gè)運(yùn)動(dòng)員的接口(規(guī)范),代碼如下:

/**
   接口:接口體現(xiàn)的是規(guī)范。
 * */
public interface SportMan {
    void run(); // 抽象方法,跑步。
    void law(); // 抽象方法,遵守法律。
    String compittion(String project);  // 抽象方法,比賽。
}

接下來定義一個(gè)乒乓球運(yùn)動(dòng)員類,實(shí)現(xiàn)接口,實(shí)現(xiàn)接口的實(shí)現(xiàn)類代碼如下:

package com.itheima._03接口的實(shí)現(xiàn);
/**
 * 接口的實(shí)現(xiàn):
 *    在Java中接口是被實(shí)現(xiàn)的,實(shí)現(xiàn)接口的類稱為實(shí)現(xiàn)類。
 *    實(shí)現(xiàn)類的格式:
 *      class 類名 implements 接口1,接口2,接口3...{
 *
 *
 *      }
 * */
public class PingPongMan  implements SportMan {
    @Override
    public void run() {
        System.out.println("乒乓球運(yùn)動(dòng)員稍微跑一下?。?);
    }

    @Override
    public void law() {
        System.out.println("乒乓球運(yùn)動(dòng)員守法!");
    }

    @Override
    public String compittion(String project) {
        return "參加"+project+"得金牌!";
    }
}

測(cè)試代碼

public class TestMain {
    public static void main(String[] args) {
        // 創(chuàng)建實(shí)現(xiàn)類對(duì)象。
        PingPongMan zjk = new PingPongMan();
        zjk.run();
        zjk.law();
        System.out.println(zjk.compittion("全球乒乓球比賽"));

    }
}

2.4.5 類與接口的多實(shí)現(xiàn)案例

類與接口之間的關(guān)系是多實(shí)現(xiàn)的,一個(gè)類可以同時(shí)實(shí)現(xiàn)多個(gè)接口。

首先我們先定義兩個(gè)接口,代碼如下:

/** 法律規(guī)范:接口*/
public interface Law {
    void rule();
}

/** 這一個(gè)運(yùn)動(dòng)員的規(guī)范:接口*/
public interface SportMan {
    void run();
}

然后定義一個(gè)實(shí)現(xiàn)類:

/**
 * Java中接口是可以被多實(shí)現(xiàn)的:
 *    一個(gè)類可以實(shí)現(xiàn)多個(gè)接口: Law, SportMan
 *
 * */
public class JumpMan implements Law ,SportMan {
    @Override
    public void rule() {
        System.out.println("尊長(zhǎng)守法");
    }

    @Override
    public void run() {
        System.out.println("訓(xùn)練跑步!");
    }
}

從上面可以看出類與接口之間是可以多實(shí)現(xiàn)的,我們可以理解成實(shí)現(xiàn)多個(gè)規(guī)范,這是合理的。

2.5 接口與接口的多繼承

Java中,接口與接口之間是可以多繼承的:也就是一個(gè)接口可以同時(shí)繼承多個(gè)接口。大家一定要注意:

類與接口是實(shí)現(xiàn)關(guān)系

接口與接口是繼承關(guān)系

接口繼承接口就是把其他接口的抽象方法與本接口進(jìn)行了合并。

案例演示:

public interface Abc {
    void go();
    void test();
}

/** 法律規(guī)范:接口*/
public interface Law {
    void rule();
    void test();
}

 *
 *  總結(jié):
 *     接口與類之間是多實(shí)現(xiàn)的。
 *     接口與接口之間是多繼承的。
 * */
public interface SportMan extends Law , Abc {
    void run();
}

2.6擴(kuò)展:接口的細(xì)節(jié)

不需要背,只要當(dāng)idea報(bào)錯(cuò)之后,知道如何修改即可。

關(guān)于接口的使用,以下為語法上要注意的細(xì)節(jié),雖然條目較多,但若理解了抽象的本質(zhì),無需死記硬背。

  1. 當(dāng)兩個(gè)接口中存在相同抽象方法的時(shí)候,該怎么辦?

只要重寫一次即可。此時(shí)重寫的方法,既表示重寫1接口的,也表示重寫2接口的。

  1. 實(shí)現(xiàn)類能不能繼承A類的時(shí)候,同時(shí)實(shí)現(xiàn)其他接口呢?

繼承的父類,就好比是親爸爸一樣
實(shí)現(xiàn)的接口,就好比是干爹一樣
可以繼承一個(gè)類的同時(shí),再實(shí)現(xiàn)多個(gè)接口,只不過,要把接口里面所有的抽象方法,全部實(shí)現(xiàn)。

  1. 實(shí)現(xiàn)類能不能繼承一個(gè)抽象類的時(shí)候,同時(shí)實(shí)現(xiàn)其他接口呢?

實(shí)現(xiàn)類可以繼承一個(gè)抽象類的同時(shí),再實(shí)現(xiàn)其他多個(gè)接口,只不過要把里面所有的抽象方法全部重寫。

  1. 實(shí)現(xiàn)類Zi,實(shí)現(xiàn)了一個(gè)接口,還繼承了一個(gè)Fu類。假設(shè)在接口中有一個(gè)方法,父類中也有一個(gè)相同的方法。子類如何操作呢?

處理辦法一:如果父類中的方法體,能滿足當(dāng)前業(yè)務(wù)的需求,在子類中可以不用重寫。
處理辦法二:如果父類中的方法體,不能滿足當(dāng)前業(yè)務(wù)的需求,需要在子類中重寫。

  1. 如果一個(gè)接口中,有10個(gè)抽象方法,但是我在實(shí)現(xiàn)類中,只需要用其中一個(gè),該怎么辦?

可以在接口跟實(shí)現(xiàn)類中間,新建一個(gè)中間類(適配器類)
讓這個(gè)適配器類去實(shí)現(xiàn)接口,對(duì)接口里面的所有的方法做空重寫。
讓子類繼承這個(gè)適配器類,想要用到哪個(gè)方法,就重寫哪個(gè)方法。
因?yàn)橹虚g類沒有什么實(shí)際的意義,所以一般會(huì)把中間類定義為抽象的,不讓外界創(chuàng)建對(duì)象

第三章 內(nèi)部類

3.1 概述

3.1.1 什么是內(nèi)部類

將一個(gè)類A定義在另一個(gè)類B里面,里面的那個(gè)類A就稱為內(nèi)部類,B則稱為外部類。可以把內(nèi)部類理解成寄生,外部類理解成宿主。

3.1.2 什么時(shí)候使用內(nèi)部類

一個(gè)事物內(nèi)部還有一個(gè)獨(dú)立的事物,內(nèi)部的事物脫離外部的事物無法獨(dú)立使用

  1. 人里面有一顆心臟。
  2. 汽車內(nèi)部有一個(gè)發(fā)動(dòng)機(jī)。
  3. 為了實(shí)現(xiàn)更好的封裝性。

3.2 內(nèi)部類的分類

按定義的位置來分

  1. 成員內(nèi)部類,類定義在了成員位置 (類中方法外稱為成員位置,無static修飾的內(nèi)部類)
  2. 靜態(tài)內(nèi)部類,類定義在了成員位置 (類中方法外稱為成員位置,有static修飾的內(nèi)部類)
  3. 局部?jī)?nèi)部類,類定義在方法內(nèi)
  4. 匿名內(nèi)部類,沒有名字的內(nèi)部類,可以在方法中,也可以在類中方法外。

3.3 成員內(nèi)部類

成員內(nèi)部類特點(diǎn)

  • 無static修飾的內(nèi)部類,屬于外部類對(duì)象的。
  • 宿主:外部類對(duì)象。

內(nèi)部類的使用格式

 外部類.內(nèi)部類。 // 訪問內(nèi)部類的類型都是用 外部類.內(nèi)部類

獲取成員內(nèi)部類對(duì)象的兩種方式

方式一:外部直接創(chuàng)建成員內(nèi)部類的對(duì)象

外部類.內(nèi)部類 變量 = new 外部類().new 內(nèi)部類();

方式二:在外部類中定義一個(gè)方法提供內(nèi)部類的對(duì)象

案例演示

方式一:
public class Test {
    public static void main(String[] args) {
        //  宿主:外部類對(duì)象。
       // Outer out = new Outer();
        // 創(chuàng)建內(nèi)部類對(duì)象。
        Outer.Inner oi = new Outer().new Inner();
        oi.method();
    }
}

class Outer {
    // 成員內(nèi)部類,屬于外部類對(duì)象的。
    // 拓展:成員內(nèi)部類不能定義靜態(tài)成員。
    public class Inner{
        // 這里面的東西與類是完全一樣的。
        public void method(){
            System.out.println("內(nèi)部類中的方法被調(diào)用了");
        }
    }
}


方式二:
public class Outer {
    String name;
    private class Inner{
        static int a = 10;
    }
    public Inner getInstance(){
        return new Inner();
    }
}

public class Test {
    public static void main(String[] args) {
        Outer o = new Outer();
        System.out.println(o.getInstance());


    }
}

3.4 成員內(nèi)部類的細(xì)節(jié)

編寫成員內(nèi)部類的注意點(diǎn):

  1. 成員內(nèi)部類可以被一些修飾符所修飾,比如: private,默認(rèn),protected,public,static等
  2. 在成員內(nèi)部類里面,JDK16之前不能定義靜態(tài)變量,JDK16開始才可以定義靜態(tài)變量。
  3. 創(chuàng)建內(nèi)部類對(duì)象時(shí),對(duì)象中有一個(gè)隱含的Outer.this記錄外部類對(duì)象的地址值。(請(qǐng)參見3.6節(jié)的內(nèi)存圖)

詳解:

? 內(nèi)部類被private修飾,外界無法直接獲取內(nèi)部類的對(duì)象,只能通過3.3節(jié)中的方式二獲取內(nèi)部類的對(duì)象

? 被其他權(quán)限修飾符修飾的內(nèi)部類一般用3.3節(jié)中的方式一直接獲取內(nèi)部類的對(duì)象

? 內(nèi)部類被static修飾是成員內(nèi)部類中的特殊情況,叫做靜態(tài)內(nèi)部類下面單獨(dú)學(xué)習(xí)。

? 內(nèi)部類如果想要訪問外部類的成員變量,外部類的變量必須用final修飾,JDK8以前必須手動(dòng)寫final,JDK8之后不需要手動(dòng)寫,JDK默認(rèn)加上。

3.5 成員內(nèi)部類面試題

請(qǐng)?jiān)?地方向上相應(yīng)代碼,以達(dá)到輸出的內(nèi)容

注意:內(nèi)部類訪問外部類對(duì)象的格式是:外部類名.this

public class Test {
    public static void main(String[] args) {
        Outer.inner oi = new Outer().new inner();
        oi.method();
    }
}

class Outer {	// 外部類
    private int a = 30;

    // 在成員位置定義一個(gè)類
    class inner {
        private int a = 20;

        public void method() {
            int a = 10;
            System.out.println(???);	// 10   答案:a
            System.out.println(???);	// 20	答案:this.a
            System.out.println(???);	// 30	答案:Outer.this.a
        }
    }
}

3.6 成員內(nèi)部類內(nèi)存圖

從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之抽象類&接口&內(nèi)部類(十一),java基礎(chǔ),學(xué)習(xí),java,開發(fā)語言,spring boot,spring cloud

3.7 靜態(tài)內(nèi)部類

靜態(tài)內(nèi)部類特點(diǎn)

  • 靜態(tài)內(nèi)部類是一種特殊的成員內(nèi)部類。
  • 有static修飾,屬于外部類本身的。
  • 總結(jié):靜態(tài)內(nèi)部類與其他類的用法完全一樣。只是訪問的時(shí)候需要加上外部類.內(nèi)部類。
  • 拓展1:靜態(tài)內(nèi)部類可以直接訪問外部類的靜態(tài)成員。
  • 拓展2:靜態(tài)內(nèi)部類不可以直接訪問外部類的非靜態(tài)成員,如果要訪問需要?jiǎng)?chuàng)建外部類的對(duì)象。
  • 拓展3:靜態(tài)內(nèi)部類中沒有銀行的Outer.this。

內(nèi)部類的使用格式

外部類.內(nèi)部類。

靜態(tài)內(nèi)部類對(duì)象的創(chuàng)建格式

外部類.內(nèi)部類  變量 = new  外部類.內(nèi)部類構(gòu)造器;

調(diào)用方法的格式:

  • 調(diào)用非靜態(tài)方法的格式:先創(chuàng)建對(duì)象,用對(duì)象調(diào)用
  • 調(diào)用靜態(tài)方法的格式:外部類名.內(nèi)部類名.方法名();

案例演示

// 外部類:Outer01
class Outer01{
    private static  String sc_name = "程序";
    // 內(nèi)部類: Inner01
    public static class Inner01{
        // 這里面的東西與類是完全一樣的。
        private String name;
        public Inner01(String name) {
            this.name = name;
        }
        public void showName(){
            System.out.println(this.name);
            // 拓展:靜態(tài)內(nèi)部類可以直接訪問外部類的靜態(tài)成員。
            System.out.println(sc_name);
        }
    }
}

public class InnerClassDemo01 {
    public static void main(String[] args) {
        // 創(chuàng)建靜態(tài)內(nèi)部類對(duì)象。
        // 外部類.內(nèi)部類  變量 = new  外部類.內(nèi)部類構(gòu)造器;
        Outer01.Inner01 in  = new Outer01.Inner01("張三");
        in.showName();
    }
}

3.8 局部?jī)?nèi)部類

  • 局部?jī)?nèi)部類 :定義在方法中的類。

定義格式:

class 外部類名 {
	數(shù)據(jù)類型 變量名;
	
	修飾符 返回值類型 方法名(參數(shù)列表) {
		// …
		class 內(nèi)部類 {
			// 成員變量
			// 成員方法
		}
	}
}

3.9 匿名內(nèi)部類【重點(diǎn)】

3.9.1 概述

匿名內(nèi)部類 :是內(nèi)部類的簡(jiǎn)化寫法。他是一個(gè)隱含了名字的內(nèi)部類。開發(fā)中,最常用到的內(nèi)部類就是匿名內(nèi)部類了。

3.9.2 格式

new 類名或者接口名() {
     重寫方法;
};

包含了:

  • 繼承或者實(shí)現(xiàn)關(guān)系

  • 方法重寫

  • 創(chuàng)建對(duì)象

所以從語法上來講,這個(gè)整體其實(shí)是匿名內(nèi)部類對(duì)象

3.9.2 什么時(shí)候用到匿名內(nèi)部類

實(shí)際上,如果我們希望定義一個(gè)只要使用一次的類,就可考慮使用匿名內(nèi)部類。匿名內(nèi)部類的本質(zhì)作用

是為了簡(jiǎn)化代碼。

之前我們使用接口時(shí),似乎得做如下幾步操作:

  1. 定義子類
  2. 重寫接口中的方法
  3. 創(chuàng)建子類對(duì)象
  4. 調(diào)用重寫后的方法
interface Swim {
    public abstract void swimming();
}

// 1. 定義接口的實(shí)現(xiàn)類
class Student implements Swim {
    // 2. 重寫抽象方法
    @Override
    public void swimming() {
        System.out.println("狗刨式...");
    }
}

public class Test {
    public static void main(String[] args) {
        // 3. 創(chuàng)建實(shí)現(xiàn)類對(duì)象
        Student s = new Student();
        // 4. 調(diào)用方法
        s.swimming();
    }
}

我們的目的,最終只是為了調(diào)用方法,那么能不能簡(jiǎn)化一下,把以上四步合成一步呢?匿名內(nèi)部類就是做這樣的快捷方式。

3.9.3 匿名內(nèi)部類前提和格式

匿名內(nèi)部類必須繼承一個(gè)父類或者實(shí)現(xiàn)一個(gè)父接口。

匿名內(nèi)部類格式

new 父類名或者接口名(){
    // 方法重寫
    @Override 
    public void method() {
        // 執(zhí)行語句
    }
};

3.9.4 使用方式

以接口為例,匿名內(nèi)部類的使用,代碼如下:

interface Swim {
    public abstract void swimming();
}

public class Demo07 {
    public static void main(String[] args) {
        // 使用匿名內(nèi)部類
		new Swim() {
			@Override
			public void swimming() {
				System.out.println("自由泳...");
			}
		}.swimming();

        // 接口 變量 = new 實(shí)現(xiàn)類(); // 多態(tài),走子類的重寫方法
        Swim s2 = new Swim() {
            @Override
            public void swimming() {
                System.out.println("蛙泳...");
            }
        };

        s2.swimming();
        s2.swimming();
    }
}

3.9.5 匿名內(nèi)部類的特點(diǎn)

  1. 定義一個(gè)沒有名字的內(nèi)部類
  2. 這個(gè)類實(shí)現(xiàn)了父類,或者父類接口
  3. 匿名內(nèi)部類會(huì)創(chuàng)建這個(gè)沒有名字的類的對(duì)象

3.9.6 匿名內(nèi)部類的使用場(chǎng)景

通常在方法的形式參數(shù)是接口或者抽象類時(shí),也可以將匿名內(nèi)部類作為參數(shù)傳遞。代碼如下:

interface Swim {
    public abstract void swimming();
}

public class Demo07 {
    public static void main(String[] args) {
        // 普通方式傳入對(duì)象
        // 創(chuàng)建實(shí)現(xiàn)類對(duì)象
        Student s = new Student();
        
        goSwimming(s);
        // 匿名內(nèi)部類使用場(chǎng)景:作為方法參數(shù)傳遞
        Swim s3 = new Swim() {
            @Override
            public void swimming() {
                System.out.println("蝶泳...");
            }
        };
        // 傳入匿名內(nèi)部類
        goSwimming(s3);

        // 完美方案: 一步到位
        goSwimming(new Swim() {
            public void swimming() {
                System.out.println("大學(xué)生, 蛙泳...");
            }
        });

        goSwimming(new Swim() {
            public void swimming() {
                System.out.println("小學(xué)生, 自由泳...");
            }
        });
    }

    // 定義一個(gè)方法,模擬請(qǐng)一些人去游泳
    public static void goSwimming(Swim s) {
        s.swimming();
    }
}

后記
????????美好的一天,到此結(jié)束,下次繼續(xù)努力!欲知后續(xù),請(qǐng)看下回分解,寫作不易,感謝大家的支持!! ??????
文章來源地址http://www.zghlxwxcb.cn/news/detail-649428.html

到了這里,關(guān)于從零開始學(xué)習(xí) Java:簡(jiǎn)單易懂的入門指南之抽象類&接口&內(nèi)部類(十一)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包