日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

16_抽象类和接口

發(fā)布時(shí)間:2023/12/16 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 16_抽象类和接口 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

16_抽象類(lèi)和接口

一. 抽象類(lèi)

1. 為什么使用抽象類(lèi)

  • 有些類(lèi)創(chuàng)建的對(duì)象并不具體,需要把這個(gè)定義為抽象類(lèi):
Animal animal=new Animal(); Pet pet=new Pet();
  • 使用abstract修飾類(lèi)變成抽象類(lèi):不能實(shí)例化,只能被繼承;

  • 抽象類(lèi)的構(gòu)造方法不能直接使用,只能被子類(lèi)調(diào)用.

2. abstract關(guān)鍵字

關(guān)鍵字:abstract:抽象 可以修飾類(lèi): 叫做抽象類(lèi); 可以修飾方法: 叫做抽象方法,沒(méi)有方法體,需要使用分號(hào)表示聲明結(jié)束,抽象方法所在的類(lèi)必須是抽象類(lèi);子類(lèi)必須重寫(xiě)父類(lèi)的抽象方法,除非子類(lèi)也是抽象類(lèi).

3. 抽象方法

使用abstract關(guān)鍵字修飾的方法,只表示聲明了一個(gè)方法,但是沒(méi)有任何具體的實(shí)現(xiàn).

特點(diǎn):

1).沒(méi)有方法體,需要使用分號(hào)表示方法聲明結(jié)束; 2).如果一個(gè)類(lèi)中有一個(gè)方法是抽象的,那么這個(gè)類(lèi)必須是抽象的; 3).抽象方法必須被子類(lèi)重寫(xiě),除非子類(lèi)也是抽象類(lèi).

4. 抽象類(lèi)

使用abstract關(guān)鍵字修飾的類(lèi).

特點(diǎn):

1).抽象類(lèi)中可以包含抽象方法,也可以不包含抽象方法; 2).抽象類(lèi)中有構(gòu)造方法,但是不能創(chuàng)建對(duì)象,構(gòu)造方法可以在子類(lèi)中會(huì)被調(diào)用; 3).抽象類(lèi)的存在就是為了被繼承,子類(lèi)必須重寫(xiě)父類(lèi)的抽象方法,除非子類(lèi)也是抽象類(lèi).

5. 抽象類(lèi)和普通類(lèi)的區(qū)別

1).抽象類(lèi)需要abstract,而普通類(lèi)不需要; 2).構(gòu)造方法: 都有,但是抽象類(lèi)不能實(shí)例化對(duì)象,普通類(lèi)可以; 3).成員方法: 抽象類(lèi)中可以存在抽象方法也可以存在非抽象方法,而普通類(lèi)中只能存在非抽象方法.

思考1:

final和abstract是否可以連用?

1).兩個(gè)關(guān)鍵字修飾方法時(shí): final修飾的方法特點(diǎn): 可以被繼承不能被重寫(xiě); abstract修飾的方法特點(diǎn): 必須被重寫(xiě); 所以這兩個(gè)關(guān)鍵字不能同時(shí)修飾同一個(gè)方法.2).兩個(gè)關(guān)鍵字修飾類(lèi)時(shí): final修飾的類(lèi)特點(diǎn): 不能被繼承; abstract修飾的類(lèi)特點(diǎn): 必須被繼 承; 所以這兩個(gè)關(guān)鍵字不能同時(shí)修飾同一個(gè)類(lèi).綜上所述: final和abstract不可以連用.

思考2:

final的類(lèi)中能否有abstract方法?

不能?

思考3:

abstract類(lèi)中能否有final方法?

可以.

6. 上機(jī)練習(xí)

package com.syc.day12; /** * 編寫(xiě)交通工具類(lèi),具有前進(jìn)功能run(); * 子類(lèi)有自行車(chē)、小轎車(chē)、地鐵,重寫(xiě)父類(lèi)方法; * 主人有屬性name,age屬性,回家方法goHome(交通工具),需要使用交通工具,使用抽象類(lèi)優(yōu)化程序. TrafficTool Bicycle Car Subway Master */public abstract class TracficTool { //品牌private String brand;public String getBrand() {return brand;}public void setBrand(String brand) {this.brand = brand;}public TracficTool() {//TODOAuto-generated constructor stub}public TracficTool(String brand) {super();this.brand = brand;}/*** 前進(jìn)方法 */public abstract void run(); }package com.syc.day12; public class Bicycle extends TracficTool {public Bicycle() {// TODO Auto-generated constructor stub}public Bicycle(String brand) {super(brand);}@Overridepublic void run() { System.out.println(getBrand()+"的自行車(chē)在行駛...");} }package com.syc.day12;public class Car extends TracficTool{public Car() {//TODOAuto-generated constructor stub}public Car(String brand) {super(brand);//TODOAuto-generated constructor stub}@Overridepublic void run() { System.out.println(getBrand()+"轎車(chē)正在飛速的前進(jìn)...");} }package com.syc.day12;public class Subway extends TracficTool {public Subway() {//TODO Auto-generated constructor stub}public Subway(String brand) {super(brand);// TODO Auto-generated constructor stub}@Overridepublic void run() { System.out.println(getBrand()+"地鐵在高速前進(jìn)...");} }package com.syc.day12;/** * 主人 */ public class Master {private String name;private int age;public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age; }public void setAge(int age) {this.age = age;}public Master() {//TODO Auto-generated constructor stub}public Master(String name, int age) {super();this.name = name;this.age = age;}//回家public void goHome(TracficTool tool) { System.out.println(getName()+"下班了,要回家..."); tool.run(); System.out.println(getName()+"到家了...");} }package com.syc.day12;public class Test {public static void main(String[] args) {Master zhengshuai=new Master("鄭帥", 29); Bicycle fenghuang=new Bicycle("鳳凰牌"); Car baoshijie=new Car("保時(shí)捷");Subway shuaishuai=new Subway("北京地鐵");zhengshuai.goHome(fenghuang);zhengshuai.goHome(baoshijie);zhengshuai.goHome(shuaishuai);} }

7. static,final,abstract總結(jié)



二. 接口

生活中的接口: USB,插座... USB接口: 必須滿(mǎn)足USB接口的寬度和厚度; 內(nèi)部: 需要遵守導(dǎo)線的個(gè)數(shù); 插座: 首先需要滿(mǎn)足插頭的個(gè)數(shù),滿(mǎn)足電壓和電流一些規(guī)則.

2.1 接口的概念

從語(yǔ)法上講: 接口是一種特殊的抽象類(lèi),這種抽象類(lèi)中只包含常量和方法的定義,而沒(méi)有方法的實(shí)現(xiàn).從功能上講: 接口表示一種約定(規(guī)范)或能力.

2.2 使用接口的好處

  • 擴(kuò)展類(lèi)的功能,保持對(duì)外接口一致;

  • 接口實(shí)現(xiàn)了多重繼承,完成類(lèi)和任何實(shí)現(xiàn)接口子類(lèi)的通信和交互;

  • 降低代碼之間的耦合性.

2.3 接口的特點(diǎn):

1).接口不能創(chuàng)建對(duì)象,而且接口中沒(méi)有構(gòu)造方法; 2).接口中的方法一般都是共有抽象方法: public abstract; 3).接口中所有的屬性都是共有靜態(tài)常量屬性: pulbic static final在一個(gè)接口中聲明方法時(shí),若沒(méi)有聲明訪問(wèn)權(quán)限,默認(rèn)也是public,若沒(méi)其他修飾默認(rèn)也是abstract;聲明屬性時(shí),若沒(méi)有聲明訪問(wèn)權(quán)限和靜態(tài)常量,默認(rèn)也是public static final.//示例 public interface Usb { //常量String brand="xxx"; //前面省略public static final //方法void charge(); //前面省略 public abstract }

2.4 接口的聲明語(yǔ)法

關(guān)鍵字interface: 表示一個(gè)接口,接口interface和類(lèi)class是平級(jí)關(guān)系 接口名命名習(xí)慣:
如果接口表示一種能力,命名采用:名字+后綴able ,比如 Serializable Comparable

語(yǔ)法: public interface 接口名{ //接口中的成員:抽象方法和靜態(tài)常量 }

2.5 接口的實(shí)現(xiàn)類(lèi)

接口與類(lèi)的關(guān)系:?
implements: 實(shí)現(xiàn)一個(gè)類(lèi)可以實(shí)現(xiàn)多個(gè)接口.

語(yǔ)法:

public interface I{public abstract void fun(); }public class Impl implements I {public void fun(){} }

思考:

一個(gè)類(lèi)實(shí)現(xiàn)某個(gè)接口之后,是否可以存在父類(lèi)?
可以,實(shí)現(xiàn)接口和繼承類(lèi)不沖突.

注意:

若一個(gè)類(lèi)有父類(lèi)同時(shí)也實(shí)現(xiàn)接口,聲明類(lèi)時(shí),必須先繼承再實(shí)現(xiàn)接口.

語(yǔ)法

public class Dog extends Animal implements I{public void fun(){} }

2.6 接口的分類(lèi):

1).普通接口: 在接口中可以聲明抽象方法和靜態(tài)常量屬性; 2).常量群接口: 在接口中只聲明一組靜態(tài)常量屬性; 3).標(biāo)志性接口: 在接口中沒(méi)有抽象方法,也沒(méi)有靜態(tài)常量,作用為了標(biāo)記某個(gè)類(lèi)具有某個(gè)功能.

2.7 接口和接口的關(guān)系:

繼承關(guān)系:

使用關(guān)鍵字extends實(shí)現(xiàn)接口與接口的繼承關(guān)系.

接口繼承的特點(diǎn):

  • 1).接口中沒(méi)有私有成員,所以父接口中的所有成員都會(huì)被子接口繼承;

  • 2).父子關(guān)系中都是接口,所以在子接口中不需要實(shí)現(xiàn)任何的抽象方法;

  • 3).接口可以多繼承.

思考:

現(xiàn)有類(lèi)A和類(lèi)B,兩個(gè)類(lèi)中都有fun()方法,假如類(lèi)C繼承類(lèi)A和類(lèi)B,當(dāng)使用類(lèi)C的對(duì)象調(diào)用fun方法時(shí),如何執(zhí)行?

此時(shí)不知道執(zhí)行那個(gè)fun方法,所以類(lèi)不可以多繼承.

現(xiàn)有A,B兩個(gè)接口,接口中都有fun方法,接口C繼承A,B,由于接口中的沒(méi)有方法體,所在只要在接口C中存在了fun方法即可,所以接口支持多繼承.

2.7 接口中特殊的方法:

  • 1).JDK 1.8之后接口中使用static關(guān)鍵字修飾的方法有方法體,靜態(tài)方法需要有方法體,注意只能通過(guò) "接口名.方法名" 調(diào)用,因?yàn)椴荒鼙焕^承;

  • 2).JDK 1.8之后接口中使用default關(guān)鍵字修飾的方法有方法體,可以被繼承,通過(guò)實(shí)現(xiàn)類(lèi)調(diào)用.

2.8 接口的使用:

1.USB接口

public interface USB{public void server(); }public class Fan implements USB {public void server() {//TODO Auto-generated method stub System.out.println("風(fēng)扇和電腦連接成功,開(kāi)始工作"); } }public class Mouse implements USB{public void server() {//TODO Auto-generated method stub System.out.println("鼠標(biāo)和電腦連接成功,開(kāi)始工作"); } }public class Computer { //面向接口編程,而不面向具體的實(shí)現(xiàn) public USB usb1;public USB usb2;public USB usb3;public void Run(){ System.out.println("電腦啟動(dòng)成功"); if(usb1!=null) {usb1.server();}if(usb2!=null) {usb2.server();}if(usb3!=null) {usb3.server();}} }

2. 在一個(gè)平臺(tái)或系統(tǒng)中,

如果多個(gè)類(lèi)都需要使用到某些方法(功能),可以將這些方法定義到一個(gè)接口中,所有需要這些方法的類(lèi),可以實(shí)現(xiàn)這個(gè)接口,有效地實(shí)現(xiàn)解耦.

案例:
現(xiàn)有運(yùn)輸工具類(lèi)Transport類(lèi) Transport有三個(gè)子類(lèi),飛機(jī)Plane,車(chē)Car,船Ship.

Plane: 客機(jī)/貨機(jī)/戰(zhàn)斗機(jī);
Car: 貨車(chē)/坦克;
Ship: 客船/貨船/航母;

戰(zhàn)斗機(jī),坦克,航母都有開(kāi)火攻擊的功能,通過(guò)分析,此功能不能來(lái)自于父類(lèi),所以可以將開(kāi)火攻擊的功能設(shè)置在一個(gè)接口中.

//交通工具類(lèi) public class Transport {//成員方法public void transfer(String goods) {System.out.println("運(yùn)輸"+goods); } }//飛機(jī)類(lèi) public class Plane extends Transport {} //船類(lèi) public class Ship extends Transport {} //車(chē)類(lèi) public class Car extends Transport {} //開(kāi)火攻擊接口 public interface Fire {public abstract void fire();//開(kāi)火攻擊方法 }//航母類(lèi): 繼承Ship,實(shí)現(xiàn)Fire public class Carrer extends Ship implements Fire {@Overridepublic void fire() {//TODO Auto-generated method stubSystem.out.println("xiu~~~");} }//戰(zhàn)斗機(jī): 繼承Plane,實(shí)現(xiàn)Fire public class FightingPlane extends Plane implements Fire {@Overridepublic void fire() {// TODO Auto-generated method stubSystem.out.println("piupiupiu~~");} }//坦克類(lèi): 繼承Car,實(shí)現(xiàn)Fire public class Tank extends Car implements Fire{@Overridepublic void fire() {// TODO Auto-generated method stub System.out.println("轟轟轟~~~");} }//測(cè)試 public class TestTransport {public static void main(String[] args) {FightingPlane fp = new FightingPlane();fp.yun("炸藥"); fp.fire();//戰(zhàn)斗機(jī)對(duì)象的開(kāi)火攻擊的功能來(lái)源于Fire接口 //可以使用接口的引用指向?qū)崿F(xiàn)類(lèi)的實(shí)例Fire f = new Tank();} }

2.9 抽象類(lèi)和接口區(qū)別

語(yǔ)法:

  • 1>. 抽象類(lèi)使用abstract,接口使用interface;
  • 2>. 抽象類(lèi)中可以包含抽象方法,也可以包含非抽象方法,接口中只能包含抽象方法和靜態(tài)常量,jdk1.8之后接口可以包含靜態(tài)方法和默認(rèn)方法;
  • 3>. 抽象類(lèi)和接口都不能實(shí)例化;
  • 4>. 抽象類(lèi)可以包含構(gòu)造方法,接口中沒(méi)有構(gòu)造方法.

功能:

  • 1>.抽象類(lèi)一般用來(lái)表示同類(lèi)事物,接口可以表示不同類(lèi)事物;

  • 2>.抽象類(lèi)可以實(shí)現(xiàn)代碼的重用,也可以約束子類(lèi)的功能.接口就是約束實(shí)現(xiàn)類(lèi)的功能,降低代碼之間的耦合性.

使用場(chǎng)景:

  • 1>. 程序或模塊內(nèi)部使用抽象類(lèi);

  • 2>. 程序架構(gòu)或模塊之間使用接口.

三. 總結(jié)

1. 抽象類(lèi): 為什么使用抽象類(lèi)?類(lèi)實(shí)例化對(duì)象沒(méi)有意思,所以把類(lèi)定義為抽象類(lèi);抽象類(lèi)不能實(shí)例化對(duì)象.2. abstract關(guān)鍵字abstract 修飾類(lèi),表示抽象類(lèi);abstract 修飾方法,表示抽象方法 3. 抽象方法抽象方法沒(méi)有方法體;抽象方法被子類(lèi)重寫(xiě);包含抽象方法的類(lèi)一定是抽象類(lèi).4. 抽象類(lèi) 抽象類(lèi)不能實(shí)例化對(duì)象;抽象類(lèi)可以包含抽象方法,也可以包含非抽象方法;抽象類(lèi)的抽象方法必須被子類(lèi)重寫(xiě),除非子類(lèi)也是抽象類(lèi).5. static final abstractfinal 和 abstract 不能一起使用;static和 abstract不能一起使用;6. 接口: 功能: 表示一個(gè)規(guī)范或能力;接口好處:擴(kuò)展類(lèi)的功能,保持對(duì)外接口一致,接口實(shí)現(xiàn)了多重繼承,完成類(lèi)和任何實(shí)現(xiàn)接口子類(lèi)的通信和交互,降低代碼之間的耦合性.

?

總結(jié)

以上是生活随笔為你收集整理的16_抽象类和接口的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。