亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

首頁 Java Java入門 深入理解java中抽象類別和接口

深入理解java中抽象類別和接口

Nov 27, 2019 pm 04:43 PM
java 抽象類別 介面

相信大家都有這種感覺:抽象類別與介面這兩者有太多相似的地方,又有太多不同的地方。往往這二者可以讓初學(xué)者摸不著頭腦,無論是在實(shí)際程式設(shè)計的時候,或是在面試的時候,抽象類別與介面都顯得格外重要!希望看完這篇文章各位都能從容地明了二者...

深入理解java中抽象類別和接口

我所理解的抽象類別

1、抽象類別和類別的相樣韻味

#1)、抽象類別和類別一樣,都是可以用來繼承的
2)、類別可以有的成分,抽象類別都可以擁有【包括建構(gòu)方法、static靜態(tài)修飾成分等】

抽象類別正如這個名字定義一樣,它也是一個類別

2、抽象方法

講不同樣韻味之前很有必要要先深知的抽象方法

1)、抽象方法沒有方法體
2)、抽象方法必須用abstract關(guān)鍵字修飾
3)、有抽象方法的類別必然是抽象類別
4)、抽象方法必須為publicprotected,預(yù)設(shè)情況下預(yù)設(shè)為public

抽象類別不一定有抽象方法

3、抽象類別和類別的異樣韻律

1) 、抽象類別必須用abstract關(guān)鍵字修飾,有abstract修飾的類別就是抽象類別!
2)、抽象類別可有可無抽象方法
3)、抽象類別雖然有建構(gòu)方法但不能用來直接建立物件實(shí)例
4)、抽象類別不能用final、private修飾
5)、外部抽象類別不能用Static修飾,但內(nèi)部的抽象類別可以使用static宣告。這句話理解程式碼如下:

//定義一個抽象類A
abstract class A{
   //定義一個內(nèi)部抽象類B
    static abstract class B{  //static定義的內(nèi)部類屬于外部類
        public abstract void saoMethod();
    }
}

class C extends A.B{

    public void saoMethod(){
        System.out.println("======saoMethod方法執(zhí)行了======");
    }
}
public class StaticDemo {

    public static void main(String[] args) {
        A.B ab = new C();//向上轉(zhuǎn)型
        ab.saoMethod();
    }

}

運(yùn)行結(jié)果:  ======saoMethod方法執(zhí)行了======

有的童鞋就看懵逼了, C extends A.B是啥騷操作啊,還能這樣玩?是的,當(dāng)使用static宣告的內(nèi)部抽象類別相當(dāng)於一個外部抽象類,繼承的時候使用「外部類別.內(nèi)部類別」的形式表示類別名稱。這種騷操作屬實(shí)是穩(wěn)中帶皮。

抽象類別是一個特殊的類,抽象類別和普通類別有著本質(zhì)區(qū)別

4、掌握抽象類別

#抽象類別就是為了繼承而存在的,定義了一個抽象類,卻不去繼承它,創(chuàng)建的這個抽象類別就毫無意義!

抽象類別雖然有建構(gòu)方法但不能直接被實(shí)例化,要創(chuàng)建物件涉及向上轉(zhuǎn)型,主要是用於被其子類別呼叫

還有對於抽象類別可以沒有抽象方法這句話,這只是一個要記住的重要概念,一定要記住!實(shí)際開發(fā)中抽象類別一般都有抽象方法,不然抽象類別就失去存在意義,和普通類別沒啥兩樣!

一個普通類別A繼承一個抽象類別B,則子類別A必須實(shí)作父類別B的所有抽象方法。如果子類別A沒有實(shí)作父類別B的抽象方法,則必須將子類別A也定義為為abstract類,也就是抽象類別。

我所理解的介面

介面(interface)可以說成是抽象類別的一種特例,抽象類別與介面這兩者有太多相似的地方,又有太多不同的地方。相對的,介面更像是一種行為的抽象!

1、介面特性

1)、介面中的方法預(yù)設(shè)為public abstract類型,介面中的成員變數(shù)類型不寫預(yù)設(shè)為public static final。
2)、介面沒有建構(gòu)方法
3)、介面可以實(shí)現(xiàn)“多繼承”,一個類別可以實(shí)作多個接口,實(shí)作寫法格式為直接用逗號隔開即可。

2、介面必知

介面中只能含有public static final變量,不寫預(yù)設(shè)是public static final,用private修飾會編譯失敗。

介面中所以的方法會被隱含地指定為public abstract方法且只能是public abstract方法,用其他關(guān)鍵字,例如 private、protected、static、 final等修飾會編譯失敗。

3、介面誤區(qū)

網(wǎng)路上很多文章說介面中的所有方法都是抽象方法,部落客回去研究了一下發(fā)現(xiàn),其實(shí)這樣說是不夠嚴(yán)謹(jǐn)?shù)模苯涌磦€簡單程式吧

package InterfaceDemo;

interface AA{   //接口AA
   default void hh(){
       System.out.println("123");
   };
}

class BB implements AA{  //實(shí)現(xiàn)接口
    
}

public class InterfaceDesign {

    public static void main(String[] args) {
        AA a=new BB(); //通過實(shí)現(xiàn)類創(chuàng)建實(shí)例
        a.hh();
    }
}
運(yùn)行結(jié)果: 123

顯然hh方法并不是抽象方法,但是這樣設(shè)計就失去接口的意義了,實(shí)際開發(fā)中不會出現(xiàn)這樣的代碼,確實(shí)有點(diǎn)專牛角尖的韻味,所以我也不否認(rèn)網(wǎng)上的言論,只是覺得不夠嚴(yán)謹(jǐn),我覺得大家還是注意一下比較好...如果面試官聽到你這樣的回答,可能對你刮目相看,會認(rèn)為你是一個對知識極度向往、探索以及有個人思維想法的學(xué)習(xí)者 ~說白了,就是杠精,這里杠精是褒義詞~

抽象類和接口本質(zhì)區(qū)別

抽象類和接口本質(zhì)區(qū)別主要從語法區(qū)別和設(shè)計思想兩方面下手

1、語法區(qū)別

1.抽象類可以有構(gòu)造方法,接口中不能有構(gòu)造方法。

2.抽象類中可以有任何類型成員變量,接口中只能有public static final變量

3.抽象類中可以包含非抽象的普通方法,接口中的可以有非抽象方法,比如deaflut方法

4.抽象類中的抽象方法的訪問類型可以是public,protected和(默認(rèn)類型,雖然 eclipse下不報錯,但應(yīng)該也不行),但接口中的抽象方法只能是public類型的,并且默認(rèn)即為public abstract類型。

5.抽象類中可以包含靜態(tài)方法,接口中不能包含靜態(tài)方法

6.抽象類和接口中都可以包含靜態(tài)成員變量,抽象類中的靜態(tài)成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認(rèn)即為public static final類型。

7.一個類可以實(shí)現(xiàn)多個接口,但只能繼承一個抽象類。

2、設(shè)計思想?yún)^(qū)別

對于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實(shí)現(xiàn)(相當(dāng)于寫普通類的普通方法并添加方法體的實(shí)現(xiàn)代碼),子類可以不進(jìn)行變更;而對于接口則不行,如果接口進(jìn)行了變更,則所有實(shí)現(xiàn)這個接口的類都必須進(jìn)行相應(yīng)的改動。這一點(diǎn)應(yīng)該很好理解。

從設(shè)計角度來講抽象類是對一種對類抽象,抽象類是對整個類整體進(jìn)行抽象,包括屬性、行為。而接口是對行為的抽象,接口是對類局部(行為)進(jìn)行抽象。從某一角度來講,接口更像是抽象的抽象!

怎么理解上面這段話呢?

理解二者設(shè)計思想的區(qū)別從程序員宜春和花姑娘(一頭可愛的小母豬)的故事開始,程序員宜春每天過著三點(diǎn)一線的生活,不是吃就是睡覺,閑暇之余還會敲敲代碼,而花姑娘就厲害了,每天都是一點(diǎn)一線的生活,不是吃就是睡覺,閑暇之余不是吃就是睡覺。程序員宜春和花姑娘都過著幸福安逸的生活,突然有一天,風(fēng)起云涌,天射大便~天色大變~,萬惡的產(chǎn)品經(jīng)理來需求了,要設(shè)計一個程序員宜春和花姑娘的一個程序,要求使用抽象類或者接口去設(shè)計,這個時候你會怎么去設(shè)計,下面給出兩個設(shè)計方案...

方案一:使用抽象類設(shè)計,分別設(shè)計eat、sleep、qiaoDaiMa方法,具體代碼如下:

abstract class Myclass{
    public abstract void eat();
    public abstract void sleep();
    public abstract void qiaoDaiMa();
  }

方案二:使用接口設(shè)計,分別設(shè)計eat、sleep、qiaoDaiMa方法,具體代碼如下:

interface Myclass{
    public abstract void eat();
    public abstract void sleep();
    public abstract void qiaoDaiMa();
  }

顯然,不管是哪個類繼承抽象類或者實(shí)現(xiàn)上面的接口,都會出現(xiàn)同樣的狀況:重寫它們的抽象方法。
如果有一百個程序員宜春,上面的設(shè)計都是很好地得到解決。但是到花姑娘身上就不管用了,花姑娘不會敲代碼這種高端操作啊!一百個花姑娘都重寫的qiaoDaiMa方法都沒有意義啊,顯然這樣設(shè)計有問題。

從上面可以看出,eat、sleep對于qiaoDaiMa方法不是同一范疇內(nèi)的行為(方法)。實(shí)際上我們可以這樣設(shè)計:定義一個抽象類,包含eat、sleep方法,再定義一個接口包含qiaoDaiMa方法,具體代碼如下:

abstract class Myclass{
    public abstract void eat();
    public abstract void sleep();
   }

interface MyclassTwo{
    public abstract void qiaoDaiMa();
  }
  
class YiChun extends Myclass implements MyclassTwo{

          @Override
          public void eat() {
              
          }

          @Override
          public void sleep() {

          }

          @Override
          public void qiaoDaiMa() {

          }
      }

我們只要讓一百個程序員宜春繼承抽象類并實(shí)現(xiàn)接口就好了,而花姑娘就直接繼承抽象類就好了。這樣一設(shè)計,堪稱完美...

同樣的,這樣講述是很不負(fù)責(zé)的,為啥捏?因?yàn)槟銜l(fā)現(xiàn),這樣設(shè)計不管是抽象類還是接口好像沒有什么區(qū)別,剛才的抽象類換成接口,接口換成抽象類,實(shí)現(xiàn)效果也一致,代碼如下:

interface Myclass{
    public abstract void eat();
    public abstract void sleep();
   }

abstract class MyclassTwo{
    public abstract void qiaoDaiMa();
  }

所以,為了講解清晰設(shè)計思想?yún)^(qū)別,程序員宜春和花姑娘的故事不得不繼續(xù)講下去...

我們都知道,可愛的小母豬一般都是粉色的對吧,這個時候我們的產(chǎn)品經(jīng)理又改需求了。啥?產(chǎn)品經(jīng)理家中一百只小豬有一只是黑白sai的,額...

萬惡的產(chǎn)品經(jīng)理只會無理改需求,可是產(chǎn)品經(jīng)理永遠(yuǎn)不會知道他一味逼程序員,程序員自己都不知道自己有多優(yōu)秀!

我們都知道,可愛的小母豬一般都是粉色的對吧,這個時候我們的產(chǎn)品經(jīng)理又改需求了。啥?產(chǎn)品經(jīng)理家中一百只小豬有一只是黑白sai的,額...

萬惡的產(chǎn)品經(jīng)理只會無理改需求,可是產(chǎn)品經(jīng)理永遠(yuǎn)不會知道他一味逼程序員,程序員自己都不知道自己有多優(yōu)秀!

那么這個時候,我們都知道,抽象類和接口都是可以有成員變量的,只不過接口比較苛刻只能是public static final正是因?yàn)檫@一點(diǎn)!抽象類和接口的設(shè)計精髓就在這里了,這個時候我們這樣設(shè)計:

interface Myclass{
    public abstract void eat();
    public abstract void sleep();
   }

abstract class MyclassTwo{
    String color="red";
    public abstract void qiaoDaiMa();
  }

讓宜春類這樣設(shè)計

package AbstractTest;

interface Myclass {
    public abstract void eat();

    public abstract void sleep();
}

abstract class MyclassTwo {
    String color = "red";

    public abstract void qiaoDaiMa();
}

class YiChun extends MyclassTwo implements Myclass {

    @Override
    public void eat() {

    }

    @Override
    public void sleep() {

    }

    @Override
    public void qiaoDaiMa() {

    }
}

public class AbstractDemo {
    public static void main(String[] args) {
        YiChun yc = new YiChun();
    }

}

然而宜春對于color這個屬性可以是不理睬的,可以當(dāng)做不存在,除非宜春不嫌棄自己也是一只紅sai佩奇哈哈哈....

而花姑娘類就要注意了!然后讓產(chǎn)品經(jīng)理家中的100只小豬設(shè)計代碼如下;

package AbstractTest;

interface Myclass {
     public abstract void qiaoDaiMa();
}

abstract class MyclassTwo {
    String color = "red";

    public abstract void eat();
    public abstract void sleep();
  
}

class Pig extends MyclassTwo {

    @Override
    public void eat() {

    }

    @Override
    public void sleep() {

    }

}

public class AbstractDemo {
    public static void main(String[] args) {
        Pig p = new Pig ();
        String color = "blackWhite";
        System.out.println(color);
    }

}

其余的99只花姑娘就直接不用動了也就是不需要String color = "blackWhite";這一句代碼,它的color屬性默認(rèn)是red了...

這個時候抽象類和接口就不能更換了,從而抽象類和接口的設(shè)計思想就很清晰了,你何識著咩啊~

本文來自?java入門?欄目,歡迎學(xué)習(xí)!

以上是深入理解java中抽象類別和接口的詳細(xì)內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Laravel 教程
1597
29
PHP教程
1488
72
VSCODE設(shè)置。 JSON位置 VSCODE設(shè)置。 JSON位置 Aug 01, 2025 am 06:12 AM

settings.json文件位於用戶級或工作區(qū)級路徑,用於自定義VSCode設(shè)置。 1.用戶級路徑:Windows為C:\Users\\AppData\Roaming\Code\User\settings.json,macOS為/Users//Library/ApplicationSupport/Code/User/settings.json,Linux為/home//.config/Code/User/settings.json;2.工作區(qū)級路徑:項(xiàng)目根目錄下的.vscode/settings

如何使用JDBC處理Java的交易? 如何使用JDBC處理Java的交易? Aug 02, 2025 pm 12:29 PM

要正確處理JDBC事務(wù),必須先關(guān)閉自動提交模式,再執(zhí)行多個操作,最後根據(jù)結(jié)果提交或回滾;1.調(diào)用conn.setAutoCommit(false)以開始事務(wù);2.執(zhí)行多個SQL操作,如INSERT和UPDATE;3.若所有操作成功則調(diào)用conn.commit(),若發(fā)生異常則調(diào)用conn.rollback()確保數(shù)據(jù)一致性;同時應(yīng)使用try-with-resources管理資源,妥善處理異常並關(guān)閉連接,避免連接洩漏;此外建議使用連接池、設(shè)置保存點(diǎn)實(shí)現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

在Java的掌握依賴注入春季和Guice 在Java的掌握依賴注入春季和Guice Aug 01, 2025 am 05:53 AM

依賴性(di)IsadesignpatternwhereObjectsReceivedenciesenciesExtern上,推廣looseSecouplingAndEaseerTestingThroughConstructor,setter,orfieldInjection.2.springfraMefringframeWorkSannotationsLikeLikeLike@component@component,@component,@service,@autowiredwithjava-service和@autowiredwithjava-ligatiredwithjava-lase-lightike

Python Itertools組合示例 Python Itertools組合示例 Jul 31, 2025 am 09:53 AM

itertools.combinations用於生成從可迭代對像中選取指定數(shù)量元素的所有不重複組合(順序無關(guān)),其用法包括:1.從列表中選2個元素組合,如('A','B')、('A','C')等,避免重複順序;2.對字符串取3個字符組合,如"abc"、"abd",適用於子序列生成;3.求兩數(shù)之和等於目標(biāo)值的組合,如1 5=6,簡化雙重循環(huán)邏輯;組合與排列的區(qū)別在於順序是否重要,combinations視AB與BA為相同,而permutations視為不同;

故障排除常見的java`ofmemoryError`場景'' 故障排除常見的java`ofmemoryError`場景'' Jul 31, 2025 am 09:07 AM

java.lang.OutOfMemoryError:Javaheapspace表示堆內(nèi)存不足,需檢查大對象處理、內(nèi)存洩漏及堆設(shè)置,通過堆轉(zhuǎn)儲分析工具定位並優(yōu)化代碼;2.Metaspace錯誤因類元數(shù)據(jù)過多,常見於動態(tài)類生成或熱部署,應(yīng)限制MaxMetaspaceSize並優(yōu)化類加載;3.Unabletocreatenewnativethread因係統(tǒng)線程資源耗盡,需檢查線程數(shù)限制、使用線程池、調(diào)整棧大??;4.GCoverheadlimitexceeded指GC頻繁但回收少,應(yīng)分析GC日誌,優(yōu)化

Python Pytest夾具示例 Python Pytest夾具示例 Jul 31, 2025 am 09:35 AM

fixture是用於為測試提供預(yù)設(shè)環(huán)境或數(shù)據(jù)的函數(shù),1.使用@pytest.fixture裝飾器定義fixture;2.在測試函數(shù)中以參數(shù)形式註入fixture;3.yield之前執(zhí)行setup,之後執(zhí)行teardown;4.通過scope參數(shù)控製作用域,如function、module等;5.將共用fixture放在conftest.py中實(shí)現(xiàn)跨文件共享,從而提升測試的可維護(hù)性和復(fù)用性。

了解Java虛擬機(jī)(JVM)內(nèi)部 了解Java虛擬機(jī)(JVM)內(nèi)部 Aug 01, 2025 am 06:31 AM

TheJVMenablesJava’s"writeonce,runanywhere"capabilitybyexecutingbytecodethroughfourmaincomponents:1.TheClassLoaderSubsystemloads,links,andinitializes.classfilesusingbootstrap,extension,andapplicationclassloaders,ensuringsecureandlazyclassloa

如何使用Java的日曆? 如何使用Java的日曆? Aug 02, 2025 am 02:38 AM

使用java.time包中的類替代舊的Date和Calendar類;2.通過LocalDate、LocalDateTime和LocalTime獲取當(dāng)前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

See all articles