国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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

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

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

相信大家都有這種感覺:抽象類別與介面這兩者有太多相似的地方,又有太多不同的地方。往往這二者可以讓初學者摸不著頭腦,無論是在實際程式設(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)方法但不能用來直接建立物件實例
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();
    }

}

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

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

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

4、掌握抽象類別

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

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

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

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

我所理解的介面

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

1、介面特性

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

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ù)?,直接看個簡單程式吧

package InterfaceDemo;

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

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

public class InterfaceDesign {

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

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

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

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

1、語法區(qū)別

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

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

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

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

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

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

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

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

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

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

怎么理解上面這段話呢?

理解二者設(shè)計思想的區(qū)別從程序員宜春和花姑娘(一頭可愛的小母豬)的故事開始,程序員宜春每天過著三點一線的生活,不是吃就是睡覺,閑暇之余還會敲敲代碼,而花姑娘就厲害了,每天都是一點一線的生活,不是吃就是睡覺,閑暇之余不是吃就是睡覺。程序員宜春和花姑娘都過著幸福安逸的生活,突然有一天,風起云涌,天射大便~天色大變~,萬惡的產(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();
  }

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

從上面可以看出,eat、sleep對于qiaoDaiMa方法不是同一范疇內(nèi)的行為(方法)。實際上我們可以這樣設(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() {

          }
      }

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

同樣的,這樣講述是很不負責的,為啥捏?因為你會發(fā)現(xiàn),這樣設(shè)計不管是抽象類還是接口好像沒有什么區(qū)別,剛才的抽象類換成接口,接口換成抽象類,實現(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)理永遠不會知道他一味逼程序員,程序員自己都不知道自己有多優(yōu)秀!

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

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

那么這個時候,我們都知道,抽象類和接口都是可以有成員變量的,只不過接口比較苛刻只能是public static final正是因為這一點!抽象類和接口的設(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這個屬性可以是不理睬的,可以當做不存在,除非宜春不嫌棄自己也是一只紅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屬性默認是red了...

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

本文來自?java入門?欄目,歡迎學習!

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

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

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

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

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

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

Dreamweaver CS6

Dreamweaver CS6

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

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Laravel 教程
1600
29
PHP教程
1502
276
如何使用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è)置保存點實現(xiàn)部分回滾,並保持事務(wù)盡可能短以提升性能。

了解Java虛擬機(JVM)內(nèi)部 了解Java虛擬機(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獲取當前日期時間;3.使用of()方法創(chuàng)建特定日期時間;4.利用plus/minus方法不可變地增減時間;5.使用ZonedDateTime和ZoneId處理時區(qū);6.通過DateTimeFormatter格式化和解析日期字符串;7.必要時通過Instant與舊日期類型兼容;現(xiàn)代Java中日期處理應(yīng)優(yōu)先使用java.timeAPI,它提供了清晰、不可變且線

比較Java框架:Spring Boot vs Quarkus vs Micronaut 比較Java框架:Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

前形式攝取,quarkusandmicronautleaddueTocile timeProcessingandGraalvSupport,withquarkusoftenpernperforminglightbetterine nosserless notelless centarios.2。

垃圾收集如何在Java工作? 垃圾收集如何在Java工作? Aug 02, 2025 pm 01:55 PM

Java的垃圾回收(GC)是自動管理內(nèi)存的機制,通過回收不可達對象釋放堆內(nèi)存,減少內(nèi)存洩漏風險。 1.GC從根對象(如棧變量、活動線程、靜態(tài)字段等)出發(fā)判斷對象可達性,無法到達的對像被標記為垃圾。 2.基於標記-清除算法,標記所有可達對象,清除未標記對象。 3.採用分代收集策略:新生代(Eden、S0、S1)頻繁執(zhí)行MinorGC;老年代執(zhí)行較少但耗時較長的MajorGC;Metaspace存儲類元數(shù)據(jù)。 4.JVM提供多種GC器:SerialGC適用於小型應(yīng)用;ParallelGC提升吞吐量;CMS降

了解網(wǎng)絡(luò)端口和防火牆 了解網(wǎng)絡(luò)端口和防火牆 Aug 01, 2025 am 06:40 AM

NetworkPortSandFireWallsworkTogetHertoEnableCommunication whereSeringSecurity.1.NetWorkPortSareVirtualendPointSnumbered0-655 35,with-Well-with-Newonportslike80(HTTP),443(https),22(SSH)和25(smtp)sindiessingspefificservices.2.portsoperateervertcp(可靠,c

以身作則,解釋說明 以身作則,解釋說明 Aug 02, 2025 am 06:26 AM

defer用於在函數(shù)返回前執(zhí)行指定操作,如清理資源;參數(shù)在defer時立即求值,函數(shù)按後進先出(LIFO)順序執(zhí)行;1.多個defer按聲明逆序執(zhí)行;2.常用於文件關(guān)閉等安全清理;3.可修改命名返回值;4.即使發(fā)生panic也會執(zhí)行,適合用於recover;5.避免在循環(huán)中濫用defer,防止資源洩漏;正確使用可提升代碼安全性和可讀性。

比較Java構(gòu)建工具:Maven vs. Gradle 比較Java構(gòu)建工具:Maven vs. Gradle Aug 03, 2025 pm 01:36 PM

Gradleisthebetterchoiceformostnewprojectsduetoitssuperiorflexibility,performance,andmoderntoolingsupport.1.Gradle’sGroovy/KotlinDSLismoreconciseandexpressivethanMaven’sverboseXML.2.GradleoutperformsMaveninbuildspeedwithincrementalcompilation,buildcac

See all articles