Java面试面向对象三大特征,Java面试经典基础问答三
1. 寫clone()方法時,通常都有一行代碼,是什么?
在實際編程過程中,我們常常要遇到這種情況:有一個對象A,在某一時刻A中已經包含了一些有效值,此時可能會需要一個和A完全相同新對象B,并且此后對B任何改動都不會影響到A中的值,也就是說,A與B是兩個獨立的對象,但B的初始值是由A對象確定的。Clone 有缺省行為,super.clone();他負責產生正確大小的空間,并逐位復制。使用clone()來復制一個對象,clone()從Object類繼承。所有具有clone功能的類都有一個特性,那就是它直接或間接地實現了Cloneable接口。
protected native Object clone() throws CloneNotSupportedException;
可以看出它是一個protected方法,所以我們不能簡單地調用它;關鍵字native,表明這個方法使用java以外的語言實現。
2. 面向對象的特征有哪些方面?
封裝、抽象、繼承、多態。
封裝是保證軟件部件具有優良的模塊性的基礎,封裝的目標就是要實現軟件部件的“高內聚、低耦合”,防止程序相互依賴性而帶來的變動影響。在面向對象的編程語言中,對象是封裝的最基本單位,面向對象的封裝比傳統語言的封裝更為清晰、更為有力。
抽象就是找出一些事物的相似和共性之處,然后將這些事物歸為一個類,這個類只考慮這些事物的相似和共性之處,并且會忽略與當前主題和目標無關的那些方面,將注意力集中在與當前目標有關的方面。
在定義和實現一個類的時候,可以在一個已經存在的類的基礎之上來進行,把這個已經存在的類所定義的內容作為自己的內容,并可以加入若干新的內容,或修改原來的方法使之更適合特殊的需要,這就是繼承。繼承是子類自動共享父類數據和方法的機制,這是類之間的一種關系,提高了軟件的可重用性和可擴展性。
多態是指程序中定義的引用變量所指向的具體類型和通過該引用變量發出的方法調用在編程時并不確定,而是在程序運行期間才確定,即一個引用變量倒底會指向哪個類的實例對象,該引用變量發出的方法調用到底是哪個類中實現的方法,必須在由程序運行期間才能決定。因為在程序運行時才確定具體的類,這樣,不用修改源程序代碼,就可以讓引用變量綁定到各種不同的類實現上,從而導致該引用調用的具體方法隨之改變,即不修改程序代碼就可以改變程序運行時所綁定的具體代碼,讓程序可以選擇多個運行狀態,這就是多態性。
3. java中實現多態的機制是什么?
多態分為編譯時多態和運行時多態。其中編輯時多態是靜態的,主要是指方法的重載,它是根據參數列表的不同來區分不同的函數,通過編輯之后會變成兩個不同的函數,在運行時談不上多態。而運行時多態是動態的,它是通過動態綁定來實現的,也就是我們所說的多態性。
父類或接口定義的引用變量可以指向子類或具體實現類的實例對象,而程序調用的方法在運行期才動態綁定,就是引用變量所指向的具體實例對象的方法,也就是內存里正在運行的那個對象的方法,而不是引用變量的類型中定義的方法。
當超類對象引用變量引用子類對象時,被引用對象的類型而不是引用變量的類型決定了調用誰的成員方法,但是這個被調用的方法必須是在超類中定義過的,也就是說被子類覆蓋的方法,但是它仍然要根據繼承鏈中方法調用的優先級來確認方法。
4. abstract class和interface有什么區別?
含有abstract修飾符的class即為抽象類,abstract類不能創建實例對象。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,那么子類也必須定義為abstract類型。
接口(interface)可以說成是抽象類的一種特例,接口中的所有方法都必須是抽象的。接口中的方法定義默認為public abstract類型,接口中的成員變量類型默認為public static final。
下面比較一下兩者的語法區別:
(1)抽象類可以有構造方法,接口中不能有構造方法。
(2)抽象類中可以有普通成員變量,接口中沒有普通成員變量。
(3)抽象類中可以包含非抽象的普通方法,接口中的所有方法必須都是抽象的,不能有非抽象的普通方法。
(4)抽象類中的抽象方法的訪問類型可以是public,protected和(默認類型,雖然
eclipse下不報錯,但應該也不行),但接口中的抽象方法只能是public類型的,并且默認即為public abstract類型。
(5)抽象類中可以包含靜態方法,接口中不能包含靜態方法
(6)抽象類和接口中都可以包含靜態成員變量,抽象類中的靜態成員變量的訪問類型可以任意,但接口中定義的變量只能是public static final類型,并且默認即為public static final類型。
(7)一個類可以實現多個接口,但只能繼承一個抽象類。
兩者在應用上的區別:
接口更多的是在系統架構設計方法發揮作用,主要用于定義模塊之間的通信契約。而抽象類在代碼實現方面發揮作用,可以實現代碼的重用,例如,模板方法設計模式(父類方法中間的某段代碼不確定,留給子類干,就用模板方法設計模式)是抽象類的一個典型應用,假設某個項目的所有Servlet類都要用相同的方式進行權限判斷、記錄訪問日志和處理異常,那么就可以定義一個抽象的基類,讓所有的Servlet都繼承這個抽象基類,在抽象基類的service方法中完成權限判斷、記錄訪問日志和處理異常的代碼,在各個子類中只是完成各自的業務邏輯代碼。
5. abstract的method是否可同時是static,是否可同時是native,是否可同時是synchronized?
都不可以,因為abstract申明的方法是要求子類去實現的,abstract只是告訴你有這樣一個接口,你要去實現,至于你的具體實現可以是native和synchronized,也可以不是,抽象方法是不關心這些事的,所以寫這兩個是沒有意義的。然后,static方法是不會被覆蓋的,而abstract方法正是要子類去覆蓋它,所以也是沒有意義的。
abstract需要重載,static為類方法,沒有重載一說;abstract為沒有實現的方法,native為本機實現的方法,自相矛盾;abstract方法沒有實現,也不可能實際調用抽象方法,沒有必要synchronized修飾,當然子類可以根據需要同步該方法。
6. 什么是內部類?Static Nested Class和Inner Class的不同。
Inner Class就是內部類,內部類就是在一個類的內部定義的類,內部類中不能定義靜態成員。內部類可以直接訪問外部類中的成員變量,內部類可以定義在外部類的方法外面,也可以定義在外部類的方法體中。Static Nested Class是被聲明為靜態(static)的內部類,它可以不依賴于外部類實例被實例化。而通常的內部類需要在外部類實例化后才能實例化。
7. 內部類可以引用它的包含類的成員嗎?有沒有什么限制?
完全可以。如果不是靜態內部類,那沒有什么限制!如果你把靜態嵌套類當作內部類的一種特例,那在這種情況下不可以訪問外部類的普通成員變量,而只能訪問外部類中的靜態成員。
8. Anonymous Inner Class (匿名內部類)是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?
可以繼承其他類或實現其他接口。不僅是可以,而是必須!但若是通過extends 或implements等關鍵字那是不可能的.
9. super.getClass()方法調用,下面程序的輸出結果是多少?
在test方法中,直接調用getClass().getName()方法,返回的是Test類名。由于getClass()在Object類中定義成了final,子類不能覆蓋該方法,所以,在test方法中調用getClass().getName()方法,其實就是在調用從父類繼承的getClass()方法,等效于調用super.getClass().getName()方法,所以,super.getClass().getName()方法返回的也應該是Test。如果想得到父類的名稱,應該用如下代碼:getClass().getSuperClass().getName()。
10. String是最基本的數據類型嗎?
基本數據類型包括byte、int、char、long、float、double、boolean和short。java.lang.String類是final類型的,因此不可以繼承這個類、不能修改這個類。為了提高效率節省空間,我們應該用StringBuffer(線程安全,建議多線程使用)類或StringBuilder(線程不安全,建議單線程使用)類。
總結
以上是生活随笔為你收集整理的Java面试面向对象三大特征,Java面试经典基础问答三的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文学作品中的汗血宝马在现实中真的存在吗?
- 下一篇: java中launch方法,Java A