從畢業到如今,筆試過好多場 也面了好多場, 一直想寫一些東西給找工做的朋友,這篇文章結合我的經歷講解面試中的面向對象.裏邊有些實例我的以面試題的形式寫出來,從程序角度去b幫助你們瞭解學習,最後但願你們找個好工做.
html
Java面向對象的特徵: 抽象、封裝、繼承、多態.程序員
抽象:抽象就是忽略一個主題中與當前目標無關的那些方面,以便更充分地注意與當前目標有關的方面。抽象並不打算了解所有問題,而只是選擇其中的一部分,暫時不用部分細節。抽象包括兩個方面:數據抽象和過程抽象.
面試
封裝:封裝就是對屬性和方法的載體類,只能經過其提供的接口(方法)來訪問,而把實現細節隱藏起來.也就是說,具體實現對程序員來講是透明的,封裝的好處在於對類內部的改變,不會影響到其餘代碼.函數
封裝的作法:學習
1.私有屬性(private修飾符修飾屬性)。spa
2.提供public的讀(getXX)寫(setXX)方法。code
3.在構造中調用方法.全部的很是量屬性基本都須要封裝.htm
封裝的好處:對象
1.隱藏類的實現細節blog
2.對全部用戶提供統一的接口
3.加強執行效果.
4.易於維護和擴展
繼承:繼承是一種關係,邏輯上知足子類is a 父類的關係才使用繼承.
子類繼承父類的屬性和非私有方法.不能繼承父類的構造,繼承關鍵字extends,類單繼承,接口多繼承.
在構造子類對象時,依次調用父類的構造(子類默認調用父類的無參構造.可使用super(參數列表)來調用指定的父類的含參構造)到Object爲止.再調用子類自身的.
子類調用父類的構造時,父類的構造只能調用一個且必須寫在子類構造的第一句.
【筆試題】: 類加載時的順序問題:說出下面程序的執行結果
public class Test { public static void main(String[] args) { new B(); System.out.println("--------"); new B(); } } class A{ //靜態代碼塊
static{ System.out.println("static code block in father"); } //代碼塊
{ System.out.println("code block in father"); } //構造
public A(){ System.out.println("construction of father"); } } class B extends A{ //靜態代碼塊
static{ System.out.println("static code block in son"); } //代碼塊
{ System.out.println("code block in son"); } //構造
public B(){ System.out.println("construction of son"); } }
程序執行結構
static code block in father static code block in son code block in father construction of father code block in son construction of son -------- code block in father construction of father code block in son construction of son
多態:多態性是指容許不一樣類的對象對同一消息做出響應。多態性包括參數化多態性和包含多態性。多態性語言具備靈活、抽象、行爲共享、代碼共享的優點,很好的解決了應用程序函數同名問題。
多態的類型
1.基本類型的多態(本質上是基本類型之間的自動類型轉換)
Java語言中將8種數據類型都分別封裝了一個類,這些類中封裝了各基本數據類型的屬性和基本運算.
基本類型自動轉換爲對應的封裝類的操做叫作自動裝箱操做,反之叫自動拆箱操做,自動裝箱操做有一個自動裝箱池(範圍爲-128~127).只要自動裝箱的數在自動裝箱池範圍內,則直接去池中找數據.
public class TestAutoPool { public static void main(String[] args) { Integer num1 = 127; Integer num2 = 127; System.out.println(num1==num2);//true
Integer num3 = 128; Integer num4 = 128; System.out.println(num3==num4);//false
} }
Charater在5.0沒有該自動裝箱池,在6.0有自動裝箱池.
byte、short、int、long有本身的自動裝箱池,其餘基本類型都沒有該自動裝箱池.
自動裝箱不會出現錯誤,自動解箱在下面狀況下會出錯
Integer num = null; int i = num;//null不能自動解箱
【筆試題】:說出下面程序的執行結果
public class Test { public static void main(String[] args) { short a = 128; byte b = (byte)a; System.out.println("a=" + a + ",b=" + b); } }
程序運行結果:
a=128,b=-128
2.方法的多態(方法的重載、重寫)
a)覆蓋
父類繼承過來的方法對子類不合適時子類能夠改變該方法的實現,這種操做叫作方法的重寫/覆蓋(繼承是重寫的前提條件)
重寫的要求:
<1>.方法名、參數列表和返回類型必須相同(5.0之後容許返回子類類型).
<2>.訪問權限能夠改可是不容許更小.(即子類的訪問權限要麼大於父類的要麼相同,不容許小於父類的訪問權限)
<3>.拋出的異常不能更大.
b)重載
方法的重載要求方法名必須相同,參數必須不一樣(參數個數不一樣、類型不一樣、順序不一樣<(int,String)和(String,int)是不同的>).返回值類型能夠相同能夠不相同.
3.類或者接口的多態(父類的引用指向子類的對象):Person p = new Student();
父類的引用指向子類的對象就發生了多態.後果:
<1>.只能使用父類中方定義的屬性和方法
<2>.子類中定義的不能直接使用
<3>.子類複寫了父類的方法,此時調用狀況根據方法是否static而不一樣 [static(調用父類),非static(調用子類)].
<4>.若是想使用子類中定義的方法,能夠強制類型轉換(判斷是否能夠轉換,用instanceof運算符來判斷對象的類型)
【筆試題】:說出下面程序的執行結果
class A { int a = 1; static int b = 20; int c = 3; double d = 2.0; void show() { System.out.println("Class A: a=" + a + "\td=" + d + "\tc=" + c + "\tb=" + b); } void common(){ System.out.println("Class A: method common()"); } static void execute(){ System.out.println("Class A: method excute()"); } } class B extends A { float a = 3.0f; static int b = 30; int c = 5; String d = "Java program."; void show() { super.show(); System.out.println("Class B: a=" + a + "\td=" + d + "\tc=" + c + "\tb=" +b); } void common(){ System.out.println("Class B: method common()"); } static void execute(){ System.out.println("Class B: method execute()"); } public static void main(String[] args) { A a = new B(); a.show(); System.out.println("----------------------"); a.common(); System.out.println("----------------------"); a.execute(); } }
程序運行結果
Class A: a=1 d=2.0 c=3 b=20 Class B: a=3.0 d=Java program. c=5 b=30
---------------------- Class B: method common() ---------------------- Class A: method excute()
4.傳參時的多態(基本類型的多態與類類型的多態混合使用)
轉載請註明出處:[http://www.cnblogs.com/dennisit/p/3590664.html]