第一章 抽象類
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ì),無需死記硬背。
-
抽象類不能創(chuàng)建對(duì)象,如果創(chuàng)建,編譯無法通過而報(bào)錯(cuò)。只能創(chuàng)建其非抽象子類的對(duì)象。
理解:假設(shè)創(chuàng)建了抽象類的對(duì)象,調(diào)用抽象的方法,而抽象方法沒有具體的方法體,沒有意義。
-
抽象類中,可以有構(gòu)造方法,是供子類創(chuàng)建對(duì)象時(shí),初始化父類成員使用的。
理解:子類的構(gòu)造方法中,有默認(rèn)的super(),需要訪問父類構(gòu)造方法。
-
抽象類中,不一定包含抽象方法,但是有抽象方法的類必定是抽象類。
理解:未包含抽象方法的抽象類,目的就是不想讓調(diào)用者創(chuàng)建該類對(duì)象,通常用于某些特殊的類結(jié)構(gòu)設(shè)計(jì)。
-
抽象類的子類,必須重寫抽象父類中所有的抽象方法,否則子類也必須定義成抽象類,編譯無法通過而報(bào)錯(cuò)。
理解:假設(shè)不重寫所有抽象方法,則類中可能包含抽象方法。那么創(chuàng)建對(duì)象后,調(diào)用抽象的方法,沒有意義。
-
抽象類存在的意義是為了被子類繼承。
理解:抽象類中已經(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)接口的要求和意義
- 必須重寫實(shí)現(xiàn)的全部接口中所有抽象方法。
- 如果一個(gè)類實(shí)現(xiàn)了接口,但是沒有重寫完全部接口的全部抽象方法,這個(gè)類也必須定義成抽象類。
- 意義:接口體現(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ì),無需死記硬背。
- 當(dāng)兩個(gè)接口中存在相同抽象方法的時(shí)候,該怎么辦?
只要重寫一次即可。此時(shí)重寫的方法,既表示重寫1接口的,也表示重寫2接口的。
- 實(shí)現(xiàn)類能不能繼承A類的時(shí)候,同時(shí)實(shí)現(xiàn)其他接口呢?
繼承的父類,就好比是親爸爸一樣
實(shí)現(xiàn)的接口,就好比是干爹一樣
可以繼承一個(gè)類的同時(shí),再實(shí)現(xiàn)多個(gè)接口,只不過,要把接口里面所有的抽象方法,全部實(shí)現(xiàn)。
- 實(shí)現(xiàn)類能不能繼承一個(gè)抽象類的時(shí)候,同時(shí)實(shí)現(xiàn)其他接口呢?
實(shí)現(xiàn)類可以繼承一個(gè)抽象類的同時(shí),再實(shí)現(xiàn)其他多個(gè)接口,只不過要把里面所有的抽象方法全部重寫。
- 實(shí)現(xiàn)類Zi,實(shí)現(xiàn)了一個(gè)接口,還繼承了一個(gè)Fu類。假設(shè)在接口中有一個(gè)方法,父類中也有一個(gè)相同的方法。子類如何操作呢?
處理辦法一:如果父類中的方法體,能滿足當(dāng)前業(yè)務(wù)的需求,在子類中可以不用重寫。
處理辦法二:如果父類中的方法體,不能滿足當(dāng)前業(yè)務(wù)的需求,需要在子類中重寫。
- 如果一個(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ú)立使用
- 人里面有一顆心臟。
- 汽車內(nèi)部有一個(gè)發(fā)動(dòng)機(jī)。
- 為了實(shí)現(xiàn)更好的封裝性。
3.2 內(nèi)部類的分類
按定義的位置來分
- 成員內(nèi)部類,類定義在了成員位置 (類中方法外稱為成員位置,無static修飾的內(nèi)部類)
- 靜態(tài)內(nèi)部類,類定義在了成員位置 (類中方法外稱為成員位置,有static修飾的內(nèi)部類)
- 局部?jī)?nèi)部類,類定義在方法內(nèi)
- 匿名內(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):
- 成員內(nèi)部類可以被一些修飾符所修飾,比如: private,默認(rèn),protected,public,static等
- 在成員內(nèi)部類里面,JDK16之前不能定義靜態(tài)變量,JDK16開始才可以定義靜態(tài)變量。
- 創(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)存圖
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í),似乎得做如下幾步操作:
- 定義子類
- 重寫接口中的方法
- 創(chuàng)建子類對(duì)象
- 調(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)
- 定義一個(gè)沒有名字的內(nèi)部類
- 這個(gè)類實(shí)現(xiàn)了父類,或者父類接口
- 匿名內(nèi)部類會(huì)創(chuàng)建這個(gè)沒有名字的類的對(duì)象
3.9.6 匿名內(nèi)部類的使用場(chǎng)景
通常在方法的形式參數(shù)是接口或者抽象類時(shí),也可以將匿名內(nèi)部類作為參數(shù)傳遞。代碼如下:文章來源:http://www.zghlxwxcb.cn/news/detail-649428.html
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)!