最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java中抽象類和接口的相同和不同點(diǎn)介紹

 更新時(shí)間:2021年12月19日 09:04:10   作者:白了又了白1992  
大家好,本篇文章主要講的是java中抽象類和接口的相同和不同點(diǎn)介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽

前言

本文簡(jiǎn)單介紹抽象類,接口以及它們的異同點(diǎn),另附簡(jiǎn)單的代碼舉例。

一、抽象類是什么?

在 Java 語(yǔ)言中使用 abstract class 來(lái)定義抽象類。抽象類是不能被實(shí)例化的,即不能用new關(guān)鍵字來(lái)實(shí)例化對(duì)象。包含抽象方法的一定是抽象類,但抽象類不一定包含抽象方法。如果一個(gè)子類實(shí)現(xiàn)了父類(抽象類)的所有抽象方法,那么該子類可以不必是抽象類,否則就是抽象類。抽象類中的抽象方法的修飾符只能為public或者protected。

為什么要在抽象類中定義抽象方法呢?下面我們來(lái)看一個(gè)代碼實(shí)例:

package example;
 
import java.util.Date;
 
public abstract class GeometricObject {
	private String color="white";
	private boolean filled;
	private java.util.Date dateCreated;
	protected GeometricObject() {
		dateCreated=new java.util.Date();
	}//構(gòu)建默認(rèn)的幾何對(duì)象
	protected GeometricObject(String color,boolean filled) {
		dateCreated=new java.util.Date();
		this.color=color;
		this.filled=filled;
	}
	public String getColor() {
		return color;
	}//返回顏色
	public void setColor(String color) {
		this.color=color;
	}//設(shè)置新的顏色
	public boolean getFilled() {
		return filled;
	}
	public void setFilled(boolean filled) {
		this.filled=filled;
	}
	public java.util.Date getDateCreated(){
		return dateCreated;
	}
	public abstract double getArea();//抽象方法定義得到面積
	public abstract double getPerimeter();//抽象方法得到周長(zhǎng)
}

我們假設(shè)自定義的Circle類和Rectangle類均為GeometricObject的子類,且均有求各自面積的getArea()方法和各自周長(zhǎng)的getPerimeter()方法,但這些方法并不能在父類中定義,因?yàn)榫唧w的計(jì)算方法要取決于幾何對(duì)象的具體類型。所以采取抽象方法進(jìn)行定義,這樣可以保證父類中的抽象方法可以在子類中被重寫。

抽象類只有定義沒有實(shí)現(xiàn)。

下面是抽象類值得注意的幾點(diǎn):

1.抽象方法不能包含在非抽象類中。如果抽象父類的子類不能實(shí)現(xiàn)所有的抽象方法,那么子類也必須定義為抽象的。也就是說(shuō),在繼承自抽象類的非抽象子類中,必須實(shí)現(xiàn)所有的抽象方法。還要注意到,抽象方法是靜態(tài)的。

2.抽象類不能使用new操作符來(lái)初始化。但仍然可以定義它的構(gòu)造方法,這個(gè)構(gòu)造方法在它的子類的構(gòu)造方法中進(jìn)行調(diào)用。

3.包含抽象方法的類必須是抽象的。但是是可以定義一個(gè)不包含抽象方法的抽象類,這個(gè)抽象類用于作為定義新子類的基類。

4.即使子類的父類是具體的,這個(gè)子類也可以是抽象的。

5.不能使用new操作符從一個(gè)抽象類創(chuàng)建一個(gè)實(shí)例,但是抽象類可以用做一種數(shù)據(jù)類型。

例如:GeometricObject[] objects=new GeometricObject[10];是正確的,。

6.子類可以重寫父類的方法并將它定義為抽象的,這雖然不常見,但很適用于當(dāng)父類的方法實(shí)現(xiàn)在子類中變得無(wú)效時(shí)的情況。

二、接口是什么?

接口是一種與類很相似的結(jié)構(gòu),用于為對(duì)象定義共同操作,但它的目的是指明相關(guān)或者不相關(guān)類的對(duì)象的共同行為。

Java中接口使用interface關(guān)鍵字修飾。接口是抽象方法的集合。如果一個(gè)類實(shí)現(xiàn)了某個(gè)接口,那么它就繼承了這個(gè)接口的抽象方法。

類和接口之間的關(guān)系稱為接口繼承。

下面是簡(jiǎn)單的代碼舉例:

package example;
 
public class TestEdible {
 
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Object[] objects= {new Tiger(),new Chicken(),new Apple()};
		//創(chuàng)建由Tiger,Chicken和Apple類型的三個(gè)對(duì)象構(gòu)成的數(shù)組
		for(int i=0;i<objects.length;i++) {
			if(objects[i] instanceof Edible)
				System.out.println(((Edible)objects[i]).howToEat());
			if(objects[i] instanceof Animal) {
				System.out.println(((Animal)objects[i]).sound());
		}
		}//如果可食用,則調(diào)用howToEat方法,如果是動(dòng)物,則調(diào)用sound方法
	}
 
}
abstract class Animal{
	private double weight;
	public double getWeight() {
		return weight;
	}
	public void setWeight(double weight) {
		this.weight=weight;
	}
	public abstract String sound();//返回動(dòng)物的聲音,是抽象方法,被具體的animal類實(shí)現(xiàn)
}
class Chicken extends Animal implements Edible{
	@Override
	public String howToEat() {
		return "Chicken: Fry it";
	}//實(shí)現(xiàn)了Edible接口。當(dāng)一個(gè)類實(shí)現(xiàn)接口時(shí),該類實(shí)現(xiàn)定義在接口中的所有方法。
	@Override
	public String sound() {
		return "Chicken: cock-a-doodle-doo";
	}
}
class Tiger extends Animal{
	@Override
	public String sound() {
		return "Tiger:RROOAARR";
	}
}
abstract class Fruit implements Edible{
}//Fruit類實(shí)現(xiàn)了Edible,但沒有實(shí)現(xiàn)howToEat方法,所以它必須定義為abstract。
class Apple extends Fruit{
		@Override
		public String howToEat() {
			return "Apple:Make apple cider";
	}
}//Fruit的具體子類必須實(shí)現(xiàn)howToEat方法,所以Apple類實(shí)現(xiàn)了howToEat方法。

需要注意的是,接口中所有的數(shù)據(jù)域都是public static final,而且所有方法都是public abstract,但Java允許忽略這些修飾符。

即下面的兩個(gè)代碼是等價(jià)的:

public interface T {
	public static final int K=1;
	public abstract void p();
}
public interface T {
	int K=1;
	void p();
}

盡管public修飾符對(duì)于定義在接口中的方法可以省略,但是在子類實(shí)現(xiàn)中方法必須定義為public。

三、抽象類和接口的異同點(diǎn)

一個(gè)類可以實(shí)現(xiàn)多個(gè)接口,但是只能繼承一個(gè)父類。

首先我們先來(lái)列舉個(gè)表格簡(jiǎn)單講述一下抽象類和接口之間的異同點(diǎn):

比較點(diǎn) 抽象類 接口
關(guān)鍵字 abstract class interface
字段 無(wú)限制 變量必須是public static final
方法 既可以含普通方法,又可以含抽象方法,無(wú)限制 只能含抽象方法,且必須是public的
繼承/實(shí)現(xiàn) 只能被類或抽象類繼承 既可以被接口繼承,也能被類或抽象類實(shí)現(xiàn)
多重繼承 不支持 可以繼承多個(gè)父接口

java只允許為類的繼承做單一繼承,但是允許使用接口做多重繼承。例如:

public class NewClass extends BaseClass implements Interface1,...,InterfaceN{
}

利用extends,接口可以繼承其他接口,這樣的接口被稱為子接口。例如:下面的代碼中,NewInterface是Interface1,...,InterfaceN的子接口。

public interface NewInterface extends Interface1,...,InterfaceN{
}

一個(gè)實(shí)現(xiàn)NewInterface的類必須實(shí)現(xiàn)在NewInterface,Interface1,...,InterfaceN中定義的抽象方法。接口可以繼承其他接口但不能繼承類。一個(gè)類可以繼承它的父類同時(shí)實(shí)現(xiàn)多個(gè)接口。

所有的類都有一個(gè)共同的根類Object,但是接口并沒有共同的根。與類相似,接口同樣也可以定義一種類型。一個(gè)接口類型的變量可以引用任何實(shí)現(xiàn)該接口的類的實(shí)例。如果一個(gè)類實(shí)現(xiàn)了一個(gè)接口,那么這個(gè)接口就類似于該類的一個(gè)父類??梢詫⒔涌诋?dāng)作一種數(shù)據(jù)類型使用,將接口類型的變量轉(zhuǎn)換為它的子類,反過來(lái)同樣可以。

通常情況下,使用接口的頻率更高,因?yàn)榻涌诒阮惛屿`活,不用使所有東西都屬于同一個(gè)類型的類。

下面進(jìn)行一個(gè)簡(jiǎn)單的代碼舉例:

abstract class Animal{
    public  abstract String howToEat();
}//在Animal中定義howToEat方法
//Animal的兩個(gè)子類定義如下
class Chicken extends Animal{
	@Override
	public String howToEat() {
		return "Chicken: Fry it";
    }
}
class Duck extends Animal{
	@Override
	public String howToEat() {
		return "Roast it";
    }
}
public static void main(String[] args) {
    Animal animal = new Chicken();
    eat(animal);
 
    Animal animal = new Duck();
    eat(animal);
}
public static void eat(Animal animal){
    System.out.println(animal.howToEat());
}

假設(shè)給定這個(gè)繼承結(jié)構(gòu),java在調(diào)用方法時(shí)可以根據(jù)對(duì)象動(dòng)態(tài)地決定調(diào)用具體的howToEat方法。但有一個(gè)限制條件,即該子類必須是另一種動(dòng)物才可以。如果一種動(dòng)物不可食用,那么此刻再繼承Animal類就并不合適了。

限制條件這個(gè)問題在接口中可以被解決,例如:

public class Demo{
public static void main(String[] args) {
    Edible stuff = new Chicken();
    eat(stuff);
 
    Edible stuff = new Broccoli();
    eat(stuff);
  }
public static void eat(Edible stuff){
    System.out.println(stuff.howToEat());
  }
}
interface Edible{
    public String howToEat();
}
class Chicken implements Edible{
	@Override
	public String howToEat() {
		return "Chicken: Fry it";
	}
}
class Broccoli implements Edible{
	@Override
	public String howToEat() {
		return "Broccoli: Stir-fty it";
	}
}

定義表示可食用對(duì)象的一個(gè)類,只須讓該類實(shí)現(xiàn)Edible接口即可。任何Edible對(duì)象都可以被傳遞以調(diào)用HowToEat方法。

總結(jié)

到此這篇關(guān)于java中抽象類和接口的相同和不同點(diǎn)介紹的文章就介紹到這了,更多相關(guān)java中抽象類和接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 教你如何編寫簡(jiǎn)單的網(wǎng)絡(luò)爬蟲

    教你如何編寫簡(jiǎn)單的網(wǎng)絡(luò)爬蟲

    實(shí)際的爬蟲是從一系列的種子鏈接開始。種子鏈接是起始節(jié)點(diǎn),種子頁(yè)面的超鏈接指向的頁(yè)面是子節(jié)點(diǎn)(中間節(jié)點(diǎn)),對(duì)于非html文檔,如excel等,不能從中提取超鏈接,看做圖的終端節(jié)點(diǎn)
    2013-10-10
  • Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程

    Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程

    這篇文章主要介紹了Springmvc ResponseBody響應(yīng)json數(shù)據(jù)實(shí)現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-10-10
  • 詳解Spring3.x 升級(jí)至 Spring4.x的方法

    詳解Spring3.x 升級(jí)至 Spring4.x的方法

    本篇文章主要介紹了詳解Spring3.x 升級(jí)至 Spring4.x的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-04-04
  • Java Web開發(fā)防止多用戶重復(fù)登錄的完美解決方案

    Java Web開發(fā)防止多用戶重復(fù)登錄的完美解決方案

    在web項(xiàng)目開發(fā)中,很多情況下都可以讓同一個(gè)賬號(hào)信息在不同的登錄入口登錄很多次,這樣子做的不是很完善。一般解決這種情況有兩種解決方案,小編呢主要以第二種方式給大家介紹具體的實(shí)現(xiàn)方法,對(duì)java web 防止多用戶重復(fù)登錄的解決方案感興趣的朋友一起看看吧
    2016-11-11
  • Spring Mybatis 基本使用過程(推薦)

    Spring Mybatis 基本使用過程(推薦)

    Mybatis是一個(gè)半自動(dòng)ORM(Object Relational Mapping)框架,它可以簡(jiǎn)化數(shù)據(jù)庫(kù)編程,讓開發(fā)者更專注于SQL本身,本文給大家介紹Spring Mybatis 基本使用過程,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Spring MVC 攔截器實(shí)現(xiàn)代碼

    Spring MVC 攔截器實(shí)現(xiàn)代碼

    本篇文章主要介紹了Spring MVC 攔截器的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • IntelliJ IDEA 設(shè)置數(shù)據(jù)庫(kù)連接全局共享的步驟

    IntelliJ IDEA 設(shè)置數(shù)據(jù)庫(kù)連接全局共享的步驟

    在日常的軟件開發(fā)工作中,我們經(jīng)常會(huì)遇到需要在多個(gè)項(xiàng)目之間共享同一個(gè)數(shù)據(jù)庫(kù)連接的情況,默認(rèn)情況下,IntelliJ IDEA 中的數(shù)據(jù)庫(kù)連接配置是針對(duì)每個(gè)項(xiàng)目單獨(dú)存儲(chǔ)的,幸運(yùn)的是,IntelliJ IDEA 提供了一種方法來(lái)將數(shù)據(jù)庫(kù)連接配置設(shè)置為全局共享,從而簡(jiǎn)化這一過程
    2024-10-10
  • java數(shù)據(jù)結(jié)構(gòu)和算法之馬踏棋盤算法

    java數(shù)據(jù)結(jié)構(gòu)和算法之馬踏棋盤算法

    這篇文章主要為大家詳細(xì)介紹了java數(shù)據(jù)結(jié)構(gòu)和算法之馬踏棋盤算法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Java操作pdf的工具類itext的處理方法

    Java操作pdf的工具類itext的處理方法

    這篇文章主要介紹了Java操作pdf的工具類itext,iText是一種生成PDF報(bào)表的Java組件,通過在服務(wù)器端使用Jsp或JavaBean生成PDF報(bào)表,客戶端采用超鏈接顯示或下載得到生成的報(bào)表,需要的朋友可以參考下
    2022-04-04
  • Java線程生命周期圖文詳細(xì)講解

    Java線程生命周期圖文詳細(xì)講解

    在java中,任何對(duì)象都要有生命周期,線程也不例外,它也有自己的生命周期。線程的整個(gè)生命周期可以分為5個(gè)階段,分別是新建狀態(tài)、就緒狀態(tài)、運(yùn)行狀態(tài)、阻塞狀態(tài)和死亡狀態(tài)
    2023-01-01

最新評(píng)論

唐山市| 渑池县| 邯郸市| 县级市| 开江县| 襄汾县| 遵化市| 安康市| 旺苍县| 石阡县| 卢湾区| 永靖县| 吴川市| 潢川县| 革吉县| 卢湾区| 沙雅县| 湘乡市| 榆中县| 公安县| 个旧市| 永善县| 雷山县| 密云县| 武夷山市| 绥宁县| 黔西| 土默特左旗| 白河县| 康马县| 阿勒泰市| 正镶白旗| 栖霞市| 云阳县| 西贡区| 肇州县| 辉南县| 禹城市| 十堰市| 恩平市| 营山县|