亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

02.Java面向對象問題

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

好消息

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

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

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

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

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

      
      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嗎?會出現什么問題?
    • 注意抽象類是不能被實例化的,也就是不能new出來的!
    • 如果執意需要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
  • 泡在網上的日子: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問一下細節

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

AI

胶州市| 三原县| 黔江区| 调兵山市| 鸡东县| 屏南县| 扬中市| 灌云县| 庆元县| 如皋市| 富川| 广南县| 辰溪县| 永清县| 东安县| 遵化市| 奉新县| 临武县| 紫阳县| 科技| 宣城市| 高唐县| 石棉县| 顺义区| 娱乐| 固原市| 昆明市| 黔西县| 怀集县| 崇阳县| 亳州市| 清流县| 满洲里市| 中西区| 宾川县| 遂平县| 永泰县| 东丽区| 凤冈县| 绍兴市| 江油市|