面試官問我Java的三大特性(繼承),五分鐘後我讓他喜笑顏開!

2021-02-20 JAVA成神寶典

前言


社會中就有繼承的概念(百度百科):繼承是指一個對象直接使用另一對象的屬性和方法。也指按照法律或遵照遺囑接受死者的財產、職務、頭銜、地位等。這個解釋中的前一句正說明了我們要今天要講的對象(繼承)的大體特性。              

在寫Java時用到繼承的情況有?

當我們準備編寫一個類時,發現某個類已有我們所需要的成員變量和方法,假如我們想復用這個類的成員變量和方法,即在所編寫類中不用聲明成員變量就相當於有了這個成員變量,不用定義方法就相當於有了這個方法,那麼我們可以將編寫的類聲明為這個類的子類即繼承。

小知識:

源類,基類,超類或者父類都是一個概念

導出類,繼承類,子類也都是同一個概念

繼承的語法

在類聲明中,使用關鍵字extends來聲明一個類的子類:

class 子類名 extends 父類名 {  …}

注意:如類聲明語句中沒有extends子句,則該類為java.lang包中的Object的子類。這就說明了java中的代碼其實都有一個繼承的關係,只不過是繼承Object這個java中最根本的父類。

繼承的特點

子類擁有父類非private的屬性和方法,子類繼承的父類方法和成員變量可以當作自己的方法和成員變量一樣被子類的實例方法使用。

子類可以有自己屬性和方法,即子類可以在父類的基礎上對父類進行擴展。

子類可以用自己的方式實現父類的方法。(重寫或者覆蓋)

 

訪問權限和繼承之間的關係

訪問限制修飾符限制對象對成員變量操作和方法調用,也限制繼承性

               

         

構造器對繼承的影響


什麼是構造器: 

構造器的特性:

與一般方法名不同的是,構造方法名必須和類名保持一致,並且沒有返回值。

Java編譯器會自動創建無參構造函數,因此在類中,無參構造即使沒有,我們也可省略不寫。實例化對象時無需賦值。

倘若類中已存在有參構造函數,則編譯器不再提供默認無參構造。實例化對象時需賦值,不然報錯。

當類實例化一個對象時會自動調用構造方法。


構造器在Java的繼承中會產生什麼影響呢?

我們雖然繼承了父類但是父類的構造器是我們子類繼承不了的,我們只能去調用父類的構造器。

那麼在繼承並且編寫子類的構造方法的時候就要注意兩種情況了:

父類使用默認構造器


package Extends; public class Father {         Father(){                                                                       System.out.println("This is Father Constrctor");    }}

package Extends; public class Nosuper extends Father{  Nosuper(){                                      System.out.println("This is Nosuper Constrctor");  }   public static void main(String[] args) {        Nosuper no=new Nosuper();  } }

OUTPUT:This is Father ConstrctorThis is Nosuper Constrctor

父類不使用默認構造器

package Extends; public class Father {         Father(String name){           System.out.println("This is Father Constrctor,name is "+name);    }}

package Extends; public class Nosuper extends Father{  Nosuper(){     super("YYH");                       System.out.println("This is Nosuper Constrctor");  }  public static void main(String[] args) {        Nosuper no=new Nosuper();  }}

OUTPUT:This is Father Constrctor,name is YYHThis is Nosuper Constrctor

總結:對於繼承來說,子類會默認調用父類的構造器,但是如果沒有默認的父類構造器,子類必須要調用父類的構造器,而且必須是在子類構造器中做的第一件事(第一行代碼)。

                                   

繼承中的向上轉型


當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法,但是它仍然要根據繼承鏈中方法調用的優先級來確認方法,該優先級為:this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)。

package _4_8; class A {    public String show(D obj) {        return ("A and D");    }    public String show(A obj) {        return ("A and A");    }  }  class B extends A{        public String show(B obj){        return ("B and B");    }      public String show(A obj){        return ("B and A");    }  }  class C extends B{}class D extends B{}public class t {    public static void main(String[] args) {        A a1 = new A();        A a2 = new B();                                                                                         B b = new B();        C c = new C();        D d = new D();        System.out.println("1--" + a1.show(b));        System.out.println("2--" + a1.show(c));        System.out.println("3--" + a1.show(d));        System.out.println("---");        System.out.println("4--" + a2.show(b));        System.out.println("5--" + a2.show(c));        System.out.println("6--" + a2.show(d));        System.out.println("6--" + a2.show(a1));        System.out.println("*");        System.out.println("7--" + b.show(b));        System.out.println("8--" + b.show(c));        System.out.println("9--" + b.show(d));          }}

OUTPUT:1--A and A2--A and A3--A and D---4--B and A5--B and A6--A and D6--B and A*7--B and B8--B and B9--A and D

仔細理解一下其中的代碼不難理解其中向上轉型在繼承中的作用。

按照this.show(O)、super.show(O)、this.show((super)O)、super.show((super)O)這個順序一步一步的執行就會得到結果。

將子類轉換成父類,在繼承關係上面是向上移動的,所以一般稱之為向上轉型。由於向上轉型是從一個叫專用類型向較通用類型轉換,所以它總是安全的,唯一發生變化的可能就是屬性和方法的丟失。

繼承慎用


你會感覺當你在編寫三四個程序的時候用繼承解決了他們公共的部分是很方便的,但是如果你程序很大,class很多而且都繼承於一個類中,當你想通過改變父類的一些信息來改變一個子類的信息的時候就會發現其他的子類也會隨之改變,有時候會對其他的子類產生不必要的結果。

父類變了其他的子類就會隨之全部改變。

繼承破壞了封裝,對於父類而言,它的實現細節對與子類來說都是透明的。

繼承是一種強耦合關係。

「問一問自己是否需要從子類向父類進行向上轉型。如果必須向上轉型,則繼承是必要的,但是如果不需要,則應當好好考慮自己是否需要繼承」

                           

相關焦點

  • 阿里面試官問我Java線程和作業系統線程什麼關係
    這個問題是安琪拉之前面試被問到的一個問題,正好順著上一篇文章介紹完線程調用時的用戶態和內核態的切換,後續把Java 並發的都一起講了。面試官:聽前一個面試官說你Java並發這塊掌握的不錯,我們深入的交流一下;我:  看了看面試官頭部稀疏的結締組織,已然覺得這場面試不簡單,不過好在事前把安琪拉的博客看了個遍,有所準備,我回答說:咳咳,掌握的還算可以。
  • Java面試總結之Java基礎
    無論是工作多年的高級開發人員還是剛入職場的新人,在換工作面試的過程中,Java基礎是必不可少的面試題之一。能不能順利通過面試,拿到自己理想的offer,在準備面試的過程中,Java基礎也是很關鍵的。對於工作多年的開發人員來說,Java基礎往往是會被大家所忽略的,但在面試的過程中,確是必不可少的問題。在這篇文章裡就來為大家總結一下經常會被問到的Java基礎題。
  • 我和面試官的博弈:Java 並發編程篇
    還請大家置頂(標星)本公眾號:Java後端,第一時間接收優質博面試中問的頻率很高的一個是分布式,一個就是並發。而JUC(java.util.concurrent)裡的東西是並發編程的基石。上次的面試已經過去一段時間,在一邊努力工作的同時,我也一邊抽出時間準備 Java 並發編程的部分。今天懷著輕鬆愉快的心情,再次踏上我的大廠面試之旅。
  • 面試官問了一個奇葩的問題,大學生回答後,面試官:你給我滾出去
    有的小規模的公司面試就沒有那么正規了,有時候要求也挺高的,更奇葩的是,有時候還會遇到面試官問一些很奇怪的問題,讓你不懂該怎麼回答的那種!在找工作高峰的時候,有一個男生遇到了一個這樣的面試官,這是一個剛大學畢業的學生。
  • 面試話癆(二)C:JAVA String,別以為你穿個馬甲我就不認識你了
    面試話癆系列是從技術廣度的角度去回答面試官提的問題,適合萌新觀看!面試官,別再問我火箭怎麼造了,我知道螺絲的四種擰法,你想聽嗎?
  • 面試官問我的缺點是什麼,我應該如何回答?
    >聽完這些所謂的缺點後,老王想問,這是在說自己缺點,還是在表演自己呢?總之,給面試官的的感覺肯定是你不夠坦誠,太虛太假。這樣,你被拒絕的概率非常大,或者因為這個回答,你已經被拒絕了。如果面試官問你的優點,你又該如何回答呢?我們先看兩個真實的案例:
  • 上兩個月,15家面試,幾個offer , 我的面試歷程!
    答(其實dubbo自帶了一個管理頁面,直接可以看)我們項目中是運維配置檢測接口,發現5分鐘斷連接,會發送簡訊郵寄提醒(答的有問題)問:面試官說你的dubbo只停留在使用階段答:是的,這部分的原理還沒有去研究問:你用過那些緩存
  • 碼農:簡歷千萬別寫精通java,我都被問到字節碼內容上去了!
    比如「精通」,「熟悉」,「熟練掌握」,「了解」等,通過這些詞就能大致了解候選人對該技能掌握的程度如何了,既然是這樣,那好多人就會想那就寫精通不就行了,其實這樣的話可能並不是什麼好處,近期就有一名碼農朋友去阿里面試,他的簡歷上寫到精通java, 結果當被問到java部分時,他尷尬了,用他的話說就是已經問到字節碼上去了,說明問到的問題比較有深度了,他實在是接不住了,可見這個「精通」二字也不能隨便寫啊
  • Java面試的的時候你被提過哪些問題?
    同學們在踏出校園那一刻起,邊開始進入了社會,面臨著找工作、面試,那麼,當你被面試的時候,哪些Java題被面試官提問過?下面這些是常被問到的面試題,如果你覺得還有一些經常提到的,我沒有寫出來的,歡迎補充。J2SE基礎:1. 九種基本數據類型的大小,以及他們的封裝類。2. Switch能否用string做參數?3. equals與==的區別。4. Object有哪些公用方法?
  • 面試官:Java 反射是什麼?我回答不上來!
    反射是java語言的一個特性,它允程序在運行時(注意不是編譯的時候)來進行自我檢查並且對內部的成員進行操作。例如它允許一個java的類獲取他所有的成員變量和方法並且顯示出來。Java 的這一能力在實際應用中也許用得不是很多,但是在其它的程序設計語言中根本就不存在這一特性。例如,Pascal、C 或者 C++ 中就沒有辦法在程序中獲得函數定義相關的信息。
  • 一位Java後臺工程師的面試經歷
    技術方面:之前的技術團隊人數較少,面試的時候也比較偏重業務,相對對技術的考察不是很多。 旅遊網站主要是做自己的旅遊產品,去的部門是做後臺數據的,因為去的時候沒有帶簡歷而他們也沒有列印簡歷,整個面試就持續了十幾分鐘就結束了,這一面給我最大的教訓就是不要在周五的晚上去參加面試,而且一定要帶簡歷。
  • 去面試,面試官問倒我了,他問「我為什麼僱傭你」,該怎麼回答?
    有網友提問,題目:今天去面試,面試官一句話問倒了我,他說:「我為什麼僱傭你」,我該怎麼回答呢?其實這個很簡單,你就將面試的目的、特長、優勢等說出來就行。下面就來說說。三、優勢你取得這份工作的優勢,如經驗、能力、吃苦耐勞等,將自己的優點全部說出來,讓面試官知曉,僱傭你,對應聘單位有利無害,比僱傭別人更好,你的優勢和特長,在應聘單位可以盡情發揮,有利於應聘單位的工作和發展。
  • 2017年網友京東Java面試經驗:感覺問的比較基礎,大家都是這樣?
    面試官比較好,說你不能來也很正常,我們來進行一個20分鐘的面試吧。0.HTTP TCP UDP 的區別,具體用在哪些場景。1.說一下 java中的隊列 set map 區別,java裡的數據結構。講講它們的實現。
  • 面試官說我的簡歷像包裝的,面試後面試官向我道歉了
    小編的一個朋友入職現公司一年半了,領導絲毫沒有要給他漲工資的想法。這不,馬上趕上金三銀四的黃金跳槽階段,小編的朋友就去試了試水,結果鎩羽而歸,找我一頓吐槽。下面小編就給大家分享一段面試官與我朋友的面試內容 ▼面試官:你剛才提到的xxx項目,能講一下具體細節以及你負責的模塊嗎
  • 知名網際網路公司校招 Java 開發崗面試知識點解析
    有時候,你報的是後臺開發崗,並且熟悉的是 Java 語言,但是面試官卻是 C++ 開發方向的,就是這麼無奈~好了,閒話少說,讓我們開始分類講解常見面試知識點。(一) Java 基礎知識點 1)面向對象的特性有哪些?答:封裝、繼承和多態。 2)Java 中覆蓋和重載是什麼意思?
  • 面試官問:「你最想問我什麼問題?」90後精彩提問被當場錄用!
    過不了面試,什麼都是白談,接下裡小編和大家來分享一則面試,面試官讓面試者轉被動為主動,看看面試者是如果應對的。面試的第一位求職者是來自北方的,之前做小吃的生意,也賺了一點錢,由於工作的原因來到了南方,原來的事業也不幹了,就想找一份工作,面試官翻開簡歷,隨便問了幾個問題,這位求職者回答得不錯,最後,面試官突然問:「你想問我什麼問題?」面試官這一問可把這位求職者給問懵了,一下子說不出話來,由於面試變現欠佳,面試官當場就把他給淘汰了。
  • JAVA面試題及答案一百道(SE篇上)——老面試官的經驗之談
    上篇請看這裡-->JAVA面試題及答案一百道(SE篇上)——老面試官的經驗之談本文的面試題裡有部分關於設計模式的題目,但是阿偉要在這裡提醒各位一句話,找工作時面試官的水平可以清晰地反映出這個公司的水平,如果你的面試官抓住設計模式死摳死問,想讓你一成不變的把網上的面試答案背下來
  • FB面試官:問我這個問題必掛!
    這樣的情況並不是個例,即便現在秋招已經基本結束,每天還是有很多同學反饋「我掛了」「我又掛了」「我還是掛了」··· ··· 更糟的是,除了自己心知肚明的錯誤外,很多同學並不知道自己為什麼會掛掉,因為大多數情況下,面試官在發拒信時不會明確指出你在面試時踩了哪些「雷區」。掛掉面試並不可怕,不知道自己為什麼掛掉才最可怕!
  • 面試官揭秘:我如何在5分鐘之內,淘汰了80%的求職者?
    建議自我介紹,按1—3分鐘準備,切記千萬要好好準備,因為大部分初面被淘汰的原因都在自我介紹,在面試的時候,實際介紹要看面試官給你的時間,他讓你講多久你就講多久,然後把自己的自我介紹進行的壓縮或是擴展。
  • 面試官:「我為什麼僱傭你?」一句話把我問倒,聰明人該這麼回答
    面試官在面試時經常會問求職者:「我為什麼要僱用你?」在這個問題的背後實際上並非面試官真的傻到不知道為何要僱傭求職者,而是希望對方能分析自己的優勢或者崗位匹配度,給幾個理由能打工企業僱主方。要答好這個問題,首先就得明白面試官的用意何在,知己知彼,方能提高自己被錄用的機率。