溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

02.Java面向對象問題

發(fā)布時間:2020-06-10 08:29:50 來源:網(wǎng)絡 閱讀:203 作者:楊充 欄目:移動開發(fā)
目錄介紹
  • 2.0.0.1 重載和重寫的區(qū)別?重載和重寫綁定機制有何區(qū)別?父類的靜態(tài)方法能否被子類重寫?
  • 2.0.0.2 封裝、繼承、多態(tài)分別是什么?
  • 2.0.0.3 接口和抽象類的區(qū)別是什么?接口的意義是什么?抽象類的意義是什么?如何選擇抽象類和接口?
  • 2.0.0.4 什么是內(nèi)部類,有哪些?有什么作用?靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類的區(qū)別?
  • 2.0.0.5 為什么內(nèi)部類調(diào)用的外部變量必須是final修飾的?
  • 2.0.0.6 Java實現(xiàn)多態(tài)有哪些必要條件?具體怎么實現(xiàn)?多態(tài)的實現(xiàn)原理?多態(tài)的作用?
  • 2.0.0.7 什么是多態(tài)?多態(tài)的實現(xiàn)方式有哪些?多態(tài)有哪些弊端?
  • 2.0.0.9 靜態(tài)變量和成員變量的區(qū)別?代碼塊有哪些?構造代碼塊和構造方法哪一個先執(zhí)行?
  • 2.0.1.0 抽象類具有什么特點?抽象類和普通類有何區(qū)別?抽象類可以new嗎?會出現(xiàn)什么問題?

好消息

  • 博客筆記大匯總【15年10月到至今】,包括Java基礎及深入知識點,Android技術博客,Python學習筆記等等,還包括平時開發(fā)中遇到的bug匯總,當然也在工作之余收集了大量的面試題,長期更新維護并且修正,持續(xù)完善……開源的文件是markdown格式的!同時也開源了生活博客,從12年起,積累共計500篇[近100萬字],將會陸續(xù)發(fā)表到網(wǎng)上,轉載請注明出處,謝謝!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺得好,可以star一下,謝謝!當然也歡迎提出建議,萬事起于忽微,量變引起質變!所有博客將陸續(xù)開源到GitHub!
2.0.0.1 重載和重寫的區(qū)別?重載和重寫綁定機制有何區(qū)別?父類的靜態(tài)方法能否被子類重寫?
  • 重載
    • 發(fā)生在同一個類中,方法名必須相同,參數(shù)類型不同、個數(shù)不同、順序不同,方法返回值和訪問修飾符可以不同,發(fā)生在編譯時。   
  • 重寫
    • 重寫表示子類重寫父類的方法
    • 發(fā)生在父子類中,方法名、參數(shù)列表必須相同,返回值范圍小于等于父類,拋出的異常范圍小于等于父類,訪問修飾符范圍大于等于父類;如果父類方法訪問修飾符為 private 則子類就不能重寫該方法。
  • 重載和重寫綁定機制有何區(qū)別?
    • 重載:類內(nèi)多態(tài),靜態(tài)綁定機制(編譯時已經(jīng)知道具體執(zhí)行哪個方法),方法同名,參數(shù)不同
    • 重寫:類間多態(tài),動態(tài)綁定機制(運行時確定),實例方法,兩小兩同一大(方法簽名相同,子類的方法所拋出的異常、返回值的范圍不大于父類的對應方法,子類的方法可見性不小于父類的對應方法)方法簽名相同,子類的方法所拋出的異常、返回值的范圍不大于父類的對應方法,子類的方法可見性不小于父類的對應方法
  • 父類的靜態(tài)方法能否被子類重寫
    • 父類的靜態(tài)方法是不能被子類重寫的,其實重寫只能適用于實例方法,不能用于靜態(tài)方法,對于上面這種靜態(tài)方法而言,我們應該稱之為隱藏。
    • 技術博客大總結
    • Java靜態(tài)方法形式上可以重寫,但從本質上來說不是Java的重寫。因為靜態(tài)方法只與類相關,不與具體實現(xiàn)相關。聲明的是什么類,則引用相應類的靜態(tài)方法(本來靜態(tài)無需聲明,可以直接引用)。并且static方法不是后期綁定的,它在編譯期就綁定了。換句話說,這個方法不會進行多態(tài)的判斷,只與聲明的類有關。
2.0.0.2 面向對象編程的四大特性及其含義?封裝、繼承、多態(tài)分別是什么?
  • 封裝
    • 將某事物的屬性和行為包裝到對象中,構成一個不可分割的獨立實體。
    • 封裝把一個對象的屬性私有化,同時提供一些可以被外界訪問的屬性的方法,如果屬性不想被外界訪問,我們大可不必提供方法給外界訪問。但是如果一個類沒有提供給外界訪問的方法,那么這個類也沒有什么意義了。
  • 繼承
    • 繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的數(shù)據(jù)或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用繼承我們能夠非常方便地復用以前的代碼。
    • 注意
      • 子類擁有父類非 private 的屬性和方法。
      • 子類可以擁有自己屬性和方法,即子類可以對父類進行擴展。
      • 子類可以用自己的方式實現(xiàn)父類的方法。
  • 多態(tài)
    • 所謂多態(tài)就是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定。
    • 在Java中有兩種形式可以實現(xiàn)多態(tài):繼承(多個子類對同一方法的重寫)和接口(實現(xiàn)接口并覆蓋接口中同一方法)。
  • 抽象
    • 對現(xiàn)實世界的事物進行概括,抽象為在計算機虛擬世界中有意義的實體
2.0.0.3 接口和抽象類的區(qū)別是什么?接口的意義是什么?抽象類的意義是什么?如何選擇抽象類和接口?
  • 接口和抽象類的區(qū)別是什么
    • 接口的方法默認是 public,所有方法在接口中不能有實現(xiàn)(Java 8 開始接口方法可以有默認實現(xiàn)),抽象類可以有非抽象的方法
    • 接口中的實例變量默認是 final 類型的,而抽象類中則不一定
    • 一個類可以實現(xiàn)多個接口,但最多只能實現(xiàn)一個抽象類
    • 一個類實現(xiàn)接口的話要實現(xiàn)接口的所有方法,而抽象類不一定
    • 接口不能用 new 實例化,但可以聲明,但是必須引用一個實現(xiàn)該接口的對象 從設計層面來說,抽象是對類的抽象,是一種模板設計,接口是行為的抽象,是一種行為的規(guī)范。
  • 接口的作用是什么
    • 技術博客大總結
    • 1、重要性:在Java語言中, abstract class 和interface 是支持抽象類定義的兩種機制。正是由于這兩種機制的存在,才賦予了Java強大的 面向對象能力。
    • 2、簡單、規(guī)范性:如果一個項目比較龐大,那么就需要一個能理清所有業(yè)務的架構師來定義一些主要的接口,這些接口不僅告訴開發(fā)人員你需要實現(xiàn)那些業(yè)務,而且也將命名規(guī)范限制住了(防止一些開發(fā)人員隨便命名導致別的程序員無法看明白)。
    • 3、維護、拓展性:比如你要做一個畫板程序,其中里面有一個面板類,主要負責繪畫功能,然后你就這樣定義了這個類??墒窃诓痪脤?,你突然發(fā)現(xiàn)這個類滿足不了你了,然后你又要重新設計這個類,更糟糕是你可能要放棄這個類,那么其他地方可能有引用他,這樣修改起來很麻煩。
    • 如果你一開始定義一個接口,把繪制功能放在接口里,然后定義類時實現(xiàn)這個接口,然后你只要用這個接口去引用實現(xiàn)它的類就行了,以后要換的話只不過是引用另一個類而已,這樣就達到維護、拓展的方便性。
    • 4、安全、嚴密性:接口是實現(xiàn)軟件松耦合的重要手段,它描敘了系統(tǒng)對外的所有服務,而不涉及任何具體的實現(xiàn)細節(jié)。這樣就比較安全、嚴密一些(一般軟件服務商考慮的比較多)。
  • 抽象類的意義是什么
    • 1.因為抽象類不能實例化對象,所以必須要有子類來實現(xiàn)它之后才能使用。這樣就可以把一些具有相同屬性和方法的組件進行抽象,這樣更有利于代碼和程序的維護。
    • 2.當又有一個具有相似的組件產(chǎn)生時,只需要實現(xiàn)該抽象類就可以獲得該抽象類的那些屬性和方法。
  • 如何選擇抽象類和接口?
    • 使用接口:
      • 需要讓不相關的類都實現(xiàn)一個方法,例如不相關的類都可以實現(xiàn) Compareable 接口中的 compareTo() 方法;
      • 需要使用多重繼承。
    • 使用抽象類:
      • 需要在幾個相關的類中共享代碼。
      • 需要能控制繼承來的成員的訪問權限,而不是都為 public。
      • 需要繼承非靜態(tài)和非常量字段。
2.0.0.4 什么是內(nèi)部類,有哪些?有什么作用?靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類的區(qū)別?
  • 什么是內(nèi)部類
    • 內(nèi)部類就是定義在另外一個類里面的類。它隱藏在外部類中,封裝性更強,不允許除外部類外的其他類訪問它;但它可直接訪問外部類的成員。
  • 內(nèi)部類有哪些
    • 成員內(nèi)部類:成員內(nèi)部類是外圍類的一個成員,是依附于外圍類的,所以,只有先創(chuàng)建了外圍類對象才能夠創(chuàng)建內(nèi)部類對象。也正是由于這個原因,成員內(nèi)部類也不能含有 static 的變量和方法;
    • 靜態(tài)內(nèi)部類:靜態(tài)內(nèi)部類,就是修飾為static的內(nèi)部類,該內(nèi)部類對象不依賴于外部類對象,就是說我們可以直接創(chuàng)建內(nèi)部類對象,但其只可以直接訪問外部類的所有靜態(tài)成員和靜態(tài)方法;
    • 局部內(nèi)部類:局部內(nèi)部類和成員內(nèi)部類一樣被編譯,只是它的作用域發(fā)生了改變,它只能在該方法和屬性中被使用,出了該方法和屬性就會失效;
    • 匿名內(nèi)部類:定義匿名內(nèi)部類的前提是,內(nèi)部類必須要繼承一個類或者實現(xiàn)接口,格式為 new 父類或者接口(){定義子類的內(nèi)容(如函數(shù)等)}。也就是說,匿名內(nèi)部類最終提供給我們的是一個 匿名子類的對象。
  • 靜態(tài)內(nèi)部類和非靜態(tài)內(nèi)部類的區(qū)別有:
    • 靜態(tài)內(nèi)部類是指被聲明為static的內(nèi)部類,可不依賴外部類實例化;而非靜態(tài)內(nèi)部類需要通過生成外部類來間接生成。
    • 靜態(tài)內(nèi)部類只能訪問外部類的靜態(tài)成員變量和靜態(tài)方法,而非靜態(tài)內(nèi)部類由于持有對外部類的引用,可以訪問外部類的所用成員
2.0.0.5 為什么內(nèi)部類調(diào)用的外部變量必須是final修飾的?
  • 為什么內(nèi)部類調(diào)用的外部變量必須是final修飾的?
    • 簡單解答:一方面,由于方法中的局部變量的生命周期很短,一旦方法結束變量就要被銷毀,為了保證在內(nèi)部類中能找到外部局部變量,通過final關鍵字可得到一個外部變量的引用;另一方面,通過final關鍵字也不會在內(nèi)部類去做修改該變量的值,保護了數(shù)據(jù)的一致性。
    • 詳細一點可以這樣說:因為生命周期的原因。方法中的局部變量,方法結束后這個變量就要釋放掉,final保證這個變量始終指向一個對象。首先,內(nèi)部類和外部類其實是處于同一個級別,內(nèi)部類不會因為定義在方法中就會隨著方法的執(zhí)行完畢而跟隨者被銷毀。問題就來了,如果外部類的方法中的變量不定義final,那么當外部類方法執(zhí)行完畢的時候,這個局部變量肯定也就被GC了,然而內(nèi)部類的某個方法還沒有執(zhí)行完,這個時候他所引用的外部變量已經(jīng)找不到了。如果定義為final,java會將這個變量復制一份作為成員變量內(nèi)置于內(nèi)部類中,這樣的話,由于final所修飾的值始終無法改變,所以這個變量所指向的內(nèi)存區(qū)域就不會變。為了解決:局部變量的生命周期與局部內(nèi)部類的對象的生命周期的不一致性問題
2.0.0.7 什么是多態(tài)?多態(tài)實現(xiàn)條件?多態(tài)的實現(xiàn)方式有哪些?
  • 什么是多態(tài)?
    • 多態(tài)是指程序中定義的引用變量所指向的具體類型和通過該引用變量發(fā)出的方法調(diào)用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發(fā)出的方法調(diào)用到底是哪個類中實現(xiàn)的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現(xiàn)上,從而導致該引用調(diào)用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態(tài),這就是多態(tài)性。
  • 多態(tài)實現(xiàn)條件?
    • Java實現(xiàn)多態(tài)有三個必要條件:繼承、重寫、向上轉型。
    • 繼承:在多態(tài)中必須存在有繼承關系的子類和父類。
    • 重寫:子類對父類中某些方法進行重新定義,在調(diào)用這些方法時就會調(diào)用子類的方法。
    • 向上轉型:在多態(tài)中需要將子類的引用賦給父類對象,只有這樣該引用才能夠具備技能調(diào)用父類的方法和子類的方法。
  • 多態(tài)的實現(xiàn)方式有哪些?

    • 多態(tài)作用:多態(tài)性就是相同的消息使得不同的類做出不同的響應。
    • 第一種實現(xiàn)方式:基于繼承實現(xiàn)的多態(tài)

      • 基于繼承的實現(xiàn)機制主要表現(xiàn)在父類和繼承該父類的一個或多個子類對某些方法的重寫,多個子類對同一方法的重寫可以表現(xiàn)出不同的行為。多態(tài)的表現(xiàn)就是不同的對象可以執(zhí)行相同的行為,但是他們都需要通過自己的實現(xiàn)方式來執(zhí)行,這就要得益于向上轉型了。

        public class MainJava {
        public static void main(String[] args) {
            //定義父類數(shù)組
            Wine[] wines = new Wine[2];
            //定義兩個子類
            Test1 test1 = new Test1();
            Test2 test2 = new Test2();
            Wine win e = new Wine();
            //父類引用子類對象
            wines[0] = test1;
            wines[1] = test2;
            for(int i = 0 ; i < 2 ; i++){
                System.out.println(wines[i].toString() + "--" + wines[i].drink());
            }
            System.out.println("-------------------------------");
            System.out.println(test1.toString() + "--" + test1.drink());
            System.out.println(test2.toString() + "--" + test2.drink());
        }
        public static class Wine {
            private String name;
            public String getName() {
                return name;
            }
            public void setName(String name) {
                this.name = name;
            }
            public String drink(){
                return "喝的是 " + getName();
            }
            public String toString(){
                return null;
            }
        }
        
        public static class Test1 extends Wine{
            public Test1(){
                setName("Test1");
            }
            public String drink(){
                return "喝的是 " + getName();
            }
            public String toString(){
                return "Wine : " + getName();
            }
        }
        
        public static class Test2 extends Wine{
            public Test2(){
                setName("Test2");
            }
            public String drink(){
                return "喝的是 " + getName();
            }
            public String toString(){
                return "Wine : " + getName();
            }
        }
        }
    • 第二種實現(xiàn)多態(tài)的方式:基于接口實現(xiàn)的多態(tài)
      • 繼承是通過重寫父類的同一方法的幾個不同子類來體現(xiàn)的,那么就可就是通過實現(xiàn)接口并覆蓋接口中同一方法的幾不同的類體現(xiàn)的。
      • 在接口的多態(tài)中,指向接口的引用必須是指定這實現(xiàn)了該接口的一個類的實例程序,在運行時,根據(jù)對象引用的實際類型來執(zhí)行對應的方法。
      • 繼承都是單繼承,只能為一組相關的類提供一致的服務接口。但是接口可以是多繼承多實現(xiàn),它能夠利用一組相關或者不相關的接口進行組合與擴充,能夠對外提供一致的服務接口。所以它相對于繼承來說有更好的靈活性。
  • 多態(tài)有哪些弊端?
2.0.0.9 靜態(tài)變量和成員變量的區(qū)別?代碼塊有哪些?構造代碼塊和構造方法哪一個先執(zhí)行?
  • 靜態(tài)變量和成員變量的區(qū)別
    • A:所屬不同
      • 靜態(tài)變量屬于類,所以也稱為類變量
      • 成員變量屬于對象,所以也稱為實例變量(對象變量)
    • B:內(nèi)存中位置不同
      • 靜態(tài)變量存儲于方法區(qū)的靜態(tài)區(qū)
      • 成員變量存儲于堆內(nèi)存
    • C:內(nèi)存出現(xiàn)時間不同
      • 靜態(tài)變量隨著類的加載而加載,隨著類的消失而消失
      • 成員變量隨著對象的創(chuàng)建而存在,隨著對象的消失而消失
    • D:調(diào)用不同
      • 靜態(tài)變量可以通過類名調(diào)用,也可以通過對象調(diào)用
      • 成員變量只能通過對象名調(diào)用
  • 代碼塊有哪些
    • A:代碼塊概述
      • 在Java中,使用{}括起來的代碼被稱為代碼塊。
    • B:代碼塊分類
      • 根據(jù)其位置和聲明的不同,可以分為局部代碼塊,構造代碼塊,靜態(tài)代碼塊,同步代碼塊。
    • C:常見代碼塊的應用
      • a:局部代碼塊
        • 在方法中出現(xiàn);限定變量生命周期,及早釋放,提高內(nèi)存利用率
      • b:構造代碼塊
        • 在類中方法外出現(xiàn);多個構造方法方法中相同的代碼存放到一起,每次調(diào)用構造都執(zhí)行,并且在構造方法前執(zhí)行
      • c:靜態(tài)代碼塊
        • 在類中方法外出現(xiàn),加了static修飾
        • 在類中方法外出現(xiàn),并加上static修飾;用于給類進行初始化,在加載的時候就執(zhí)行,并且只執(zhí)行一次。
  • 構造代碼塊和構造方法哪一個先執(zhí)行?
2.0.1.0 抽象類具有什么特點?抽象類和普通類有何區(qū)別?抽象類可以new嗎?會出現(xiàn)什么問題?
  • 抽象類具有什么特點
    • 抽象類和抽象方法都使用 abstract 關鍵字進行聲明。抽象類一般會包含抽象方法,抽象方法一定位于抽象類中。
  • 抽象類和普通類有何區(qū)別

    • 抽象類和普通類最大的區(qū)別是,抽象類不能被實例化,需要繼承抽象類才能實例化其子類。

      
      public abstract class AbstractClassExample {
      protected int x;
      private int y;
      public abstract void func1();
      
      public void func2() {
          System.out.println("func2");
      }
      }

    public class AbstractExtendClassExample extends AbstractClassExample {@Override
    br/>@Override
    System.out.println("func1");
    }
    }

  • 抽象類可以new嗎?會出現(xiàn)什么問題?
    • 注意抽象類是不能被實例化的,也就是不能new出來的!
    • 如果執(zhí)意需要new,則會提示
    • 02.Java面向對象問題

其他介紹

01.關于博客匯總鏈接
  • 1.技術博客匯總
  • 2.開源項目匯總
  • 3.生活博客匯總
  • 4.喜馬拉雅音頻匯總
  • 5.其他匯總
02.關于我的博客
  • 我的個人站點:www.yczbj.org,www.ycbjie.cn
  • github:https://github.com/yangchong211
  • 知乎:https://www.zhihu.com/people/yang-chong-69-24/pins/posts
  • 簡書:http://www.jianshu.com/u/b7b2c6ed9284
  • csdn:http://my.csdn.net/m0_37700275
  • 喜馬拉雅聽書:http://www.ximalaya.com/zhubo/71989305/
  • 開源中國:https://my.oschina.net/zbj1618/blog
  • 泡在網(wǎng)上的日子:http://www.jcodecraeer.com/member/content_list.php?channelid=1
  • 郵箱:yangchong211@163.com
  • 阿里云博客:https://yq.aliyun.com/users/article?spm=5176.100- 239.headeruserinfo.3.dT4bcV
  • segmentfault頭條:https://segmentfault.com/u/xiangjianyu/articles
  • 掘金:https://juejin.im/user/5939433efe88c2006afa0c6e
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI