java基礎--常見簡答題
一、包的作用:1、將功能相近的類放到同一個包中,可以方便查詢和使用。2、在一定程度上避免命名衝突。3、在java中,訪問許可權是可以是以包為單位的。
二、簡述方法的重寫和過載
override(重寫)
1.方法名、引數、返回值相同。
2、重寫方法的訪問修飾符一定要大於或等於被重寫的方法。
3、重寫方法不能丟擲新的異常或者丟擲比被重寫方法更寬泛的異常
4、存在於父類和子類之間。
5、被final修飾的方法不能重寫
overload(過載)
1、引數型別、個數、順序至少有一個不相同。
2、不能過載只有返回值不同的方法名。
3、存在於同類中。
三、java實現多型的機制是什麼?
多型可分為:
1.編譯多型:主要是體現在過載,系統在編譯時就能確定呼叫過載函式的哪個版本。
2.執行多型:主要體現在OO設計的繼承性上,子類的物件也是父類的物件,即上溯造型,所以子類物件可以作為父類物件使用,父類的物件變數可以指向子類物件。因此通過一個父類發出的方法呼叫可能執行的是方法在父類中的實現,也可能是某個子類中的實現,它是由執行時刻具體的物件型別決定的。
靠的是父類或介面定義的引用變數可以指向子類或具體實現類的例項物件,而程式呼叫的方法在執行期才動態繫結,就是引用變數所指向的具體例項物件的方法,也就是記憶體里正在執行的那個物件的方法,而不是引用變數的型別中定義的方法。
四、簡述this關鍵字的用法
1、this呼叫本類中的屬性,也就是類中的成員變數;
2、this呼叫本類中的其他方法;
3、this呼叫本類中的其他構造方法,呼叫時要放在構造方法的首行。
五、什麼是抽象類?什麼是抽象方法?有什麼特點?
使用abstract關鍵字修飾的類
特點:
1、不能建立例項,即不能new一個抽象類
2、可以不包含抽象方法,若一旦包含,該類必須作為抽象類
3、若子類沒有實現父類所有的抽象方法,那麼子類也得作為抽象類(抽象派生類)
4、構造方法不能都定義成私有的,否則不能有子類(建立子類物件前先呼叫父類構造方法)
5、抽象類不能使用final修飾,因為必須有子類,抽象方法才能得以實現
使用abstract修飾且沒有方法體的方法,稱為“抽象方法”。
特點:
1、使用abstract修飾,方法沒有方法體,留給子類去實現。
2、抽象方法修飾符不能是private、final和static
3、抽象方法必須定義在抽象類或介面中
六、請說出作用域public,private,protected,以及不寫時的區別
private修飾的成員變數和函式只能在類本身和內部類中被訪問。
protected 修飾的成員變數和函式能被類本身、子類及同一個包中的類訪問。
public修飾的成員變數和函式可以被類、子類、同一個包中的類以及任意其他類訪問。
預設情況(不寫)下,屬於一種包訪問,即能被類本身以及同一個包中的類訪問。
畫出作用域圖
七、&和&&的區別?
&,&&:(與,短路與):一樣的地方就是二者執行最後的結果是一樣的,但是執行的過程有區別,
對於&:無論&左邊是否為false,他都會繼續檢驗右邊的boolean值。
對於&&:只要檢測到左邊Boolean值為false時,就會直接判斷結果,不會在檢驗右邊的值(因為”與”有一個false最後結果就是false了)
所以&&的執行效率更高,所以一般都是使用&&.
|與||之間也是同樣的道理,|:無論左邊是否為ture,都會檢驗右邊 ,||:則不會。|| 的執行效率會更高
八、抽象類(abstract class)和介面(interface)有什麼異同?
相同點:
1、都不能被例項化
2、介面的實現類或者抽象類的子類都必須實現了介面或抽象類中的方法後才可以被例項化
不同點:
1、抽象類可以包含非抽象的方法,而介面中的方法必須是抽象的。
2、繼承抽象類在Java語言體系中體現一種繼承關係,在合理的繼承關係中,父類和派生類比如按存在is-a關係。而實現介面則體現一種has-a關係,實現者僅僅是實現了interface定義的契約而已。
3、抽象類中可以有成員變數,而介面中不能有成員變數。
4、抽象類和介面中都可以包含靜態成員變數,抽象類中的靜態成員變數的屬性可以是任意的,而介面中的靜態成員變數預設且必須是public static final。
5、介面中的抽象方法預設且必須都是public的,而抽象類中的抽象方法可以是public、protect或預設。
6、抽象類中可以有構造方法,但是不能例項化。
7、抽象類中可以有靜態方法(非抽象的),而介面中不能有靜態方法。
8、抽象類中的抽象方法不能用static、synchronized和native連用
九、什麼是Java虛擬機器?為什麼Java被稱作是“平臺無關的程式語言”?
Java虛擬機器是一個可以執行Java位元組碼的虛擬機器程序。Java原始檔被編譯成能被Java虛擬機器執行的位元組碼檔案。
在不同平臺編寫的Java源程式(.java檔案)被編譯器‘翻譯’成一個位元組碼檔案(.class檔案,是一種中間檔案、通用檔案、可被所有平臺的JVM所識別的檔案。 ),而這個位元組碼檔案可被不同平臺的JVM所識別,在不同平臺對.class檔案進行與平臺相對應的處理方式。 所以JVM相當於一個翻譯官: 由不同平臺的.java檔案解釋生成統一的.class檔案,再由對應平臺的JVM執行這個.class檔案,由此實現Java語言的一大特性:一次編寫,處處執行(Write once and run anywhere)。
十、是否可以從一個static方法內部發出對非static方法的呼叫?
不可以。因為非static方法是要與物件關聯在一起的,必須建立一個物件後,才可以在該物件上進行方法呼叫,而static方法是靜態方法,是屬於類的方法,呼叫時不需要建立物件,可以直接呼叫。也就是說,當一個static方法被呼叫時,可能還沒有建立任何例項物件,如果從一個static方法中發出對非static方法的呼叫,那個非static方法關聯到那個物件上的呢?這個邏輯無法成立,所以,一個static方法內部不能發出對非static方法的呼叫。
十一、Integer與int的區別
1、Integer是int的包裝類;int是基本資料型別;
2、Integer變數必須例項化後才能使用;int變數不需要;
3、Integer實際是物件的引用,指向此new的Integer物件;int是直接儲存資料值 ;
4、Integer的預設值是null;int的預設值是0。
十二、構造器Constructor是否可被override?
構造器Constructor不能被繼承,因此不能被重寫(Override),但是可以被過載(Overload)
十三、一個”.java”原始檔中是否可以包括多個類(不是內部類)?有什麼限制?
一個.java類中是可以有多個類。
但是,在多個類中,有且只有一個public類,且public類的類名必須與*.java的檔名相一致
JVM虛擬機器例項通過呼叫某個類的main()來執行程式,這個main()必須是public static void 並接受一個字串作為引數,但是該類不一定是public類。
十四、String,StringBuffer與StringBuilder的區別??
String 字串常量
StringBuffer 字串變數(執行緒安全)
StringBuilder 字串變數(非執行緒安全)
String是物件不是原始型別為不可變物件,一旦建立就不能修改它的值
對於已經存在的String的物件的修改都是重新建立一個新的物件,然後把值儲存進去(舊的值會被回收)。String是final類,不能被繼承
StringBuffer和StringBuilder是一個可變物件,它只能通過建構函式來建立。
1.如果要操作少量的資料用 = String
2.單執行緒操作字串緩衝區 下操作大量資料 = StringBuilder
3.多執行緒操作字串緩衝區 下操作大量資料 = StringBuffer
十五、String s = new String(“xyz”);建立了幾個String Object?二者之間有什麼區別?
兩個。第一個物件是字串常量”xyz” 第二個物件是new String(“xyz”)的時候產生的,在堆中分配記憶體給這個物件,只不過這個物件的內容是指向字串常量”xyz” 另外還有一個引用s,指向第二個物件。這是一個變數,在棧中分配記憶體。
十六、 面向物件的特徵有哪些方面
面向物件的三大特徵:1.繼承 2.封裝 3.多型性
(1)繼承:就是保留父類的屬性,開擴新的東西。通過子類可以實現繼承,子類繼承父類的所有狀態和行為,同時新增自身的狀態和行為。
(2)封裝:就是類的私有化。將程式碼及處理資料繫結在一起的一種程式設計機制,該機制保證程式和資料不受外部干擾。
(3)多型:是允許將父物件設定成為和一個和多個它的子物件相等的技術。包括過載和重寫。過載為編譯時多型,重寫是執行時多型。
十七、介面是否可繼承介面?抽象類是否可實現(implements)介面?抽象類是否可繼承具體類?
介面可以繼承介面。抽象類可以實現(implements)介面,抽象類可繼承(extends)實體類,(但前提是實體類必須有明確的建構函式)。
十八、 類和物件的關係?
1、類是抽象概念,物件是類具體的例項。
2、一個類可以有多個物件,而一個物件只能屬於一個類
3、建立物件是類的主要使用方式
十九、 類體中的方法包含哪些分類?
構造方法
普通方法
靜態方法
二十、類變數與例項變數的區別?
類變數也叫靜態變數,也就是在變數前加了static 的變數;
例項變數也叫物件變數,即沒加static 的變數;
區別在於:類變數是所有物件共有,其中一個物件將它值改變,其他物件得到的就是改變後的結果;而例項變數則屬物件私有,某一個物件將其值改變,不影響其他物件
二十一:建構函式的作用和特點
作用:用來建立物件
特點:
1、使用new空格方法建立(例項化)一個新物件。
2、構造方法方法名必須與類名同名,並且沒有返回值。
3、一個類可以有多個構造方法(形參,列表不同)
4、如果一個類中,沒有定義任何構造方法,編譯器會自動新增無參構造。
二十二、 Java中,請說明final關鍵字的使用
1.用來修飾資料,包括成員變數和區域性變數,該變數只能被賦值一次且它的值無法被改變。對於成員變數來講,我們必須在宣告時或者構造方法中對它賦值;
2.用來修飾方法引數,表示在變數的生存期中它的值不能被改變;
3.修飾方法,表示該方法無法被重寫;
4.修飾類,表示該類無法被繼承。
二十三、2. 在java中,宣告一個數組過程中,是如何分配記憶體的?
靜態初始化://只是指定初始值,並沒有指定陣列的長度,但是系統為自動決定該陣列的長度為4
初始化時由程式設計師顯式指定每個陣列元素的初始值,由系統決定陣列長度,程式設計師雖然沒有指定陣列長度,但是系統已經自動幫我們給分配了,
2 String[] computers = {"Dell", "Lenovo", "Apple", "Acer"}; //①
3 //只是指定初始值,並沒有指定陣列的長度,但是系統為自動決定該陣列的長度為3
4 String[] names = new String[]{"多啦A夢", "大雄", "靜香"}; //②
動態初始化:初始化時由程式設計師顯示的指定陣列的長度,由系統為資料每個元素分配初始值,如://只是指定了陣列的長度,並沒有顯示的為陣列指定初始值,但是系統會預設給陣列陣列元素分配初始值為null
動態初始化方式,程式設計師雖然沒有顯示的指定初始化值,但是因為Java陣列是引用型別的變數,所以系統也為每個元素分配了初始化值null,當然不同型別的初始化值也是不一樣的,如果是基本型別的話,假設是int型別,那麼為他分配的初始化值也是對應的0。
String[] cars = new String[4];
二十四、簡述值型別引數與引用型別引數在傳遞時的不同?
值型別引數在傳遞時直接傳遞的是資料值本身,在方法體中對形參的修改不會影響到實參的數值 ;引用型別引數傳遞時傳遞的是地址,若在方法體中修改形參指向的資料內容,則會對實參變數的數值產生影響,因為形參變數和實參變數共享同一塊堆區。當使用引用資料型別作為方法的形參時,若在方法體中修改形參變數的指向,此時不會對實參變數的數值產生影響,因為形參變數和實參變數分別指向不同的堆區;
二十五、Java記憶體管理
在java中,有java程式、虛擬機器、作業系統三個層次,其中java程式與虛擬機器互動,而虛擬機器與作業系統互動。這也就保證了java的與平臺無關性
1.程式執行前:JVM向作業系統請求一定的記憶體空間,成為初始記憶體空間!程式執行過程中所需的記憶體都是由java虛擬機器從這片記憶體空間中劃分的
2.程式執行中:java程式一直向java虛擬機器申請記憶體,當程式所需要的記憶體空間超出初始記憶體空間時,java虛擬機器會再次向作業系統申請更多的記憶體供程式使用!
3.記憶體溢位:程式接著執行,當java虛擬機器已申請的記憶體達到了規定的最大記憶體空間,但程式還需要跟多的記憶體,這時會出現記憶體溢位的錯誤!
由此,我們知道java程式所用的記憶體是有java虛擬機器進行管理、分配的