聲明:以下內容為個人期末對JAVA基礎知識的總結,來源於各種資料搜索和個人理解整理而出,也許有不妥的地方,歡迎學習指教
1.Java語言具有可移植性、可跨平台運行特點的原因是什么?
Java——編譯器——jvm——平台
Java用編譯器編譯成.class的字節碼文件,字節碼類似於機器指令,同一字節碼可以在任何帶jvm虛擬機的平台運行,從而實現java的跨平台性。所謂語言的跨平台性並不是說是源文件的跨平台性(如果要這么定義那么任何的語言都是跨平台性的),而是指源文件編譯生成的文件的跨平台性。因為Java字節碼是結構中立的,所以Java 的程序是可移植的。他們可以不經過重新編譯而在任何一個機器上運行。
2.為什么說Java語言具有健壯、安全的特性?
Java 編譯器檢測出許多別的語言只有在首次執行的時候才會指出的問題。
Java 已經清除了幾種在其它語言中被發現易於出錯的編程結構。
Java具有運行時異常處理特性,垃圾回收機制,它為健壯性提供了編程支持。
Java 實現了幾種安全機制以保護你的系統遭受危險程序的破壞 。
3.簡述Java虛擬機(JVM)的作用是什么?
JVM就是Java虛擬機,它是一個虛構出來的計算機,可在實際的計算機上模擬各種計算機的功能。JVM有自己完善的硬件結構,例如處理器、堆棧和寄存器等,還具有相應的指令系統。JVM是java字節碼執行的引擎,還能優化java字節碼,使之轉化成效率更高的機器指令。Java程序的跨平台特性主要就是因為JVM實現的。在編譯java程序時會將寫好的源程序通過編譯器編譯生成.class文件(又稱為字節碼文件),不同的平台對應着不同的JVM,之后就是通過JVM內部的解釋器將字節碼文件解釋成為具體平台上的機器指令執行,所以就可以實現java程序的跨平台特性。
4.簡述JVM的垃圾回收機制。
確保被引用對象的內存不被錯誤的回收。當一個對象不再有任何一個引用變量指向它時,這個對象就被應用拋棄。Jvm會自動回收那些不再被引用的對象的內存空間,這就是jvm回收機制。
如果你認為不再需要某個對象時,可以顯式地給該對象的引用變量賦null值,如果該對象沒有被任何引用變量所引用,java虛擬機將自動回收它所占的空間。
5.簡述軟件開發的過程。
軟件開發過程包括:需求規范、系統分析、系統設計、實現、測試、部署、維護。
6.什么是短路運算符“(short-circuit operator)?試舉例說明。
短路運算符就是我們常用的“&&”、“||”,一般稱為“條件操作”。
“&&”運算符檢查第一個表達式是否返回“false”,如果是“false”則結果必為“false”,不再檢查其他內容。
“||”運算符檢查第一個表達式是否返回“true”,如果是“true”則結果必為“true”,不再檢查其他內容。
7.簡述使用JDK中的調試工具jdb時,可以使用的調試方法。
略..........
8.什么是Unicode編碼?
Unicode(統一碼、萬國碼、單一碼)是計算機科學領域里的一項業界標准,包括字符集、編碼方案等。Unicode 是為了解決傳統的字符編碼方案的局限而產生的,它為每種語言中的每個字符設定了統一並且唯一的二進制編碼,以滿足跨語言、跨平台進行文本轉換、處理的要求。
Unicode碼是由Unicode協會建立的一種編碼方案。它支持使用世界各種語言所書寫的文本的交換、處理和顯示。Unicode碼一開始 被設計為16位的字符編碼。基本數據類型char試圖通過提供一種能夠存放任意字符的簡單數據類型來利用這個設計。但是,一個16位的編碼所能產生的字符只有65 536個,它是不足以表示全世界所有字符的。因此,Unicode標准被擴展為1112 064個字符。這些字符都遠遠超過了原來16位的限制,它們稱為補充字符(supplementary character)。
9.什么是函數簽名(Method signature)?試舉例說明。
函數簽名(或者類型簽名,抑或方法簽名)定義了函數或方法的輸入與輸出。
簽名可包含以下內容:參數及參數的類型,一個的返回值及其類型,可能會拋出或傳回的異常,該方法在面向對象程序中的可用性方面的信息(如public、static或prototype)。
在Java中,方法簽名包括方法名和參數列表,返回值和函數上聲明的異常並不屬於函數簽名的構成部分。下兩個函數簽名不同:
doSomething(String[] y);
doSomething(String y)
10.Java語言中,函數的參數傳遞有哪幾種?不同類型參數傳傳遞的區別是什么。試舉例說明。
java的方法參數傳遞方式有兩種,按值傳遞和引用傳遞。值傳遞的時候,將實參的值copy一份給形參,在方法內部改變參數的值,外部數據不會跟着發生改變。引用傳遞的時候,將實參的地址值copy一份給形參,在方法內部修改對象的內容,外部數據也會跟着發生改變。
值傳遞:
int i = 10;
add(i);
void add(int temp){
temp +=5; }
引用傳遞:
class Person {
String name = "java";
public void setName(String name){
this.name = name; }
}
void changeName (Person p1){
p1.setName("javascript");
}
public static void main (String[] args){
Person p = new Person(); changeName(p);
}
11.什么是局部變量?什么是局部變量的作用域?可不可以在一個函數聲明名字相同的變量多次?局部變量的初始化與實例變量的初始化有什么異同?
在方法中定義的變量成為局部變量。
局部變量作用域:從聲明該變量的地方開始,直到包含該變量的塊結束為止。局部變量都必須在使用之前進行聲明。可以在一個方法的不同塊里聲明相同的變量多次, 但是不能在嵌套塊或同一塊中兩次聲明同一變量。
成員變量無需初始化,只要為一個類定義了類變量或實例變量,系統就會在這個類的准備階段或創建該類的實例時進行默認初始化。局部變量必須經過初始化之后才能使用,系統不會為局部變量執行初始化。
12.如何聲明一個數組引用變量,如何創建一個數組?什么時候為數組分配內存?什么是數組的越界訪問?怎樣避免下標越界?
元素類型[] 數組引用變量;
舉例:double[] myList;
數組引用變量 = new 元素類型[數組大小];
舉例:myList = new double[10];
元素類型[] 數組引用變量 = new 元素類型[數組大小];
可簡化為:double[] myList =new double[10];
Java在聲明數組時並不為數組元素分配內存,除非數組已經創建,否則不能給它分配任何元素。當創建時用到運算符new時才在堆中為數組分配內存。
如果一個數組定義為有n個元素,那么,對這n個元素(下標為0 到 n-1的元素)的訪問都合法,如果對這n個元素之外的訪問,就是非法的,稱為“越界。當訪問超過數組下標時,數組越界訪問。
解決方法:可以用傳遞數組元素個數的方法即:用兩個實參,一個是數組名,一個是數組的長度。
13.什么是不規則數組(ragged array,鋸齒數組),試舉例說明。
二維數組中的每一行本身就是一個數組,因此,各行的長度就可以不同。這樣的數組稱為鋸齒數組(ragged array)。使用語法new int[5][]創建數組時,必須指定第一個下標。語法new int[][]是錯誤的。
int[][] jagged = new int[3][];
jagged[0] = new int[2] {1,2 };
jagged[1] = new int[6] { 3,4,5,6,7,8};
jagged[2] = new int[3] { 9,10,11};
14.什么是構造函數?構造函數有返回值嗎?構造函數如何命名?構造函數可以重載嗎?什么是缺省構造函數(default constructor,默認構造函數)?什么情況下,系統才會自動給一個類提供缺省構造函數?
構造函數是一種特殊的方法。主要用來在創建對象時初始化對象,沒有返回值。構造函數的名字必須與類型同名。構造函數可以重載,一個類可定義多個構造函數,具有相同的名字,參數個數或參數類型不同。在建立對象時不必給出實參的構造函數,成為缺省構造函數。
一個類可以不定義構造方法,在這種情況下,類中隱含定義一個方法體為空的無參構造方法,這個構造方法稱為缺省構造方法。每個類都有構造函數,如果沒有定義,則系統自動生成一個缺省的構造函數。在對多個對象進行相同的初始化時,運用缺省構造函數較為方便。
Class T{
Public int a;
T(){
a=1;}
}
15.操作符new的作用是什么?構造函數的作用是什么?什么時候會被調用?構造函數的執行順序是什么(父類與子類的構造函數)?
new操作符通過為新對象分配內存並返回對該內存的引用來實例化類。new運算符也調用對象構造函數。
構造函數用來處理對象的初始化,不需要用戶來調用,建立對象時自動執行。在父類與子類的構造函數執行中,先父類后子類,在類自身與其數據成員的構造函數執行中,先自身后數據成員。
構造方法的執行順序:①如果子類沒有定義構造方法,則調用父類的無參構造方法,再調用子類的缺省構造方法;②如果子類定義了構造方法,且其第一行沒有super,則不論子類構造方法是有參數還是無參數,在創建子類對象時,首先執行父類的無參構造方法,然后執行子類的構造方法。若子類第一行是有參數或無參數的super,則直接轉到對應的有參或無參父類構造方法中,且該語句作為子類構造方法的第一條語句;③如果子類調用父類有殘構造方法,可以通過super(參數)調用所需的父類構造方法,且該語句作為子類構造方法的第一條語句。
16.什么是引用類型?試舉例畫圖說明基本類型變量和引用類型變量的區別。試舉例說明基本類型變量的復制操作(=)和對象類型變量的復制操作(=)有何不同。
(1)引用類型:引用是一種數據類型(保存在棧中),保存了對象在內存(heap,堆空間)中的地址,這種類型既不是我們平時所說的簡單數據類型也不是類實例(對象);
(2)基本類型變量和引用類型變量的區別:對於基本變量來說,對應內存所存儲的值是基本類型值。對引用類型變量來說,對應內存所存儲的值是一個引用,是對象的存儲地址。
(3)基本類型變量的復制操作(=)和對象類型變量的復制操作(=)的區別:對基本變量而言,就是將一個變量的實際值賦給另一個變量。對引用類型變量而言,就是將一個變量的引用賦給另一個變量。
17.什么是實例變量、實例函數、靜態變量、靜態函數。調用實例函數與靜態函數有何異同。靜態變量的作用域是什么?
實例變量:也叫做對象變量,是在類聲明的內部但是在類的其他成員方法之外聲明的。屬於一種特定的實例。
實例方法:也叫做對象方法,被類的實例調用,是屬於類的某個對象的。
靜態變量:由關鍵字static修飾的變量,被類的所有實例所共享
靜態方法:由關鍵字static修飾的方法,不綁定到某個特定的對象,即不需要創建對象就可以直接用類名.方法名(參數列表);進行使用。
實例函數可以調用實例函數,靜態函數,以及訪問實例數據域或靜態數據域。靜態函數可以調用靜態函數及訪問靜態數據域。然而靜態方法不能調用實例方法或者訪問實例數據域。
靜態變量:被類中的所有對象共享,無論變量在哪里聲明。
18.java中,當類的成員前用private、protected、public、默認(成員前無任何修飾符)修飾時,成員的可訪問性分別是什么?
public:類、數據或方法對在任何包中的任何類都是可見的。
private:數據或方法可以被聲明它的類訪問。
protected:允許子類訪問定義在父類中的數據域或方法,不允許非子類訪問這些數據域和方法。
默認:同一個包內可訪問。
19.什么是不可變類(Immutable Classes)、不可變對象(Immutable Objects)?以String為例,說明不可變類的優點?
(1)一旦創建其內容就不能再改變的對象稱為不可變對象,它的類被稱為不可變類。如果一個類是不可變的,那么它所有的數據域必須都是私有的,而且沒有對任何一個數據域提供公共的set方法。一個類的所有數據域都是私有的且沒有修改器並不意味着它一定是不可變類。(為了防止用戶修改,可把類定義為不可變類)
要使一個類稱為不可變的,它必須滿足以下的要求:所有數據域都是私有的;沒有修改器方法;沒有一個返回指向可變數據域的引用的訪問器方法。
(2)String:String為不可變類,保證了String類的安全和效率。從安全上講,因為不可變類的對象不能被改變,他們可以在多個線程之間進行自由共享;從效率上講,設計成final,JVM可以直接定位到String類的相關方法上,提高執行效率。
對於String不可變類來說,不可變類更加的安全,效率更好;
1.因為對象的內容不能被改變,所以在多個線程同時讀一個資源的時候,不會引發競態條件的,並且在寫資源的時候,String不能寫,所以線程安全;
2.便於實現String緩沖池,對於相同字符串的String引用變量,他們都指向池中的同一個內存地址,對於大量使用字符串的情況下,可以節約空間,提高效率
3.因為String類是不可變類,所以可以防止程序員錯誤的修改變量的值,使得程序更加的安全。
20.簡述類的下述設計原則:內聚性、分擔責任、重用、一致性、清晰性、封裝性。
內聚性:類應該描述一個單一的實體,而所有的類操作應該在邏輯上相互配合,支持一個一致的目的。
分擔責任:如果一個實體擔負太多的職責,就應該按各自職責將它分為幾個類。如:String類、StringBuffer類和StringBuilder類都用於處理字符串,但是它們的職責各有不同。String類處理不可變字符串,StringBuilder類創建可變字符串,StringBuffer和StringBuilder類似,只是StringBuffer類還包括更新字符串的同步方法。
重用:類是為了重用而設計的,用戶可以以不同的組合和順序,在不同環境中合並多個類。因此,應該設計一個類,這個類應該沒有對用戶使用它的目的及使用時間的限制,設計屬性以確保用戶可以按值的任何順序和任何組合來設置屬性,所設計的方法實現的功能應該與它們出現的順序無關。
一致性:遵循標准Java程序設計風格和命名習慣,為類、數據域和方法選取具有信息的名字
封裝性:一個類應該使用 private 修飾符隱藏其數據,以免用戶直接訪問它。這使得類更易於維護。
清晰性:為使設計清晰 ,內聚性 、一致性和封裝性都是很好的設計原則。除此之外,類應該有一個很清晰的合約,從而易於解釋和理解。
完整性:類是為許多不同用戶的使用而設計的。為了能在一個廣泛的應用中使用,一個類應該通過 屬性和方法 提供多種方案以適應用戶的不同需求。例如:為滿足不同的應用需求,String 類包含了 40 多種很實用的方法。
21.什么是關聯?什么是聚集?什么是組合?聚集和組合的UML圖標識是什么?
(1)關聯:是一種常見的二元關系,描述兩個類之間的活動。例如:學生選取課程是Student類和Course類之間的一種關聯,而教師教授課程是Faculty類和Couese類之間的關聯。關聯由兩個類之間的實線表示,可以有一個可選的標簽描述關系。
(2)聚集:是關聯的一種特殊形式,代表兩個類之間的歸屬關系。聚集建模has-a關系。所有者對象被稱為聚集對象,它的類稱為聚集類。而從屬對象被稱為被聚集對象,它的類稱為被聚集類。
(3)組合:一個對象可以被多個其他的聚集對象所擁有,如果一個對象只歸屬於一個聚集對象,那么他和聚集對象之間的關系就稱為組合。例如:“一個學生有一個名字”就是學生類Student和名字類Name之間的一個組合關系,而“一個學生有一個地址”是學生類Student和地址類Address之間的一個聚集關系,因為一個地址可以被幾個學生所共享。
在UML中,附加在聚集類上的實心菱形表示他和被聚集類之間具有組合關系,而附加在聚集類上的空心菱形表他和被聚集類之間具有聚集關系。
關系的強弱:組合 > 聚集 > 關聯 > 依賴
22.簡述生成子類對象時,如何調用父類的構造函數?
在子類構造方法中,用關鍵字super調用。
若沒有顯式使用關鍵字super,將自動調用父類無參構造方法。
構造方法用於構建一個類的實例。不同於屬性和普通方法,父類的構造方法不會被子類繼承。它們只能使用關鍵字super從子類的構造方法中調用。語句super()調用父類的無參構造方法,而語句super(parameters)調用與參數匹配的父類構造方法。語句super()和super(parameters)必須出現在子類構造方法的第一行,這是顯式調用父類構造方法的唯一方式。如果沒有顯式使用關鍵字super,那么將自動調用父類的無參構造方法。
23.什么是構造函數鏈?關鍵字super的作用是什么?使用super時應注意什么?
構造一個類的實例時,將會調用沿着繼承鏈的所有父類的構造函數。這就被稱為構造函數鏈(constructor chaining)。
關鍵字super代指父類,可以用於調用父類的普通方法和構造方法。
super訪問構造方法必須出現第一句。this 和 super 訪問構造方法不能同時存在一個構造函數中。super()指的是對象,均不可以在static環境中使用。包括:static變量,static方法,static語句塊。
24.java中,什么是函數覆蓋?什么是函數重載?試比較覆蓋與重載?java中的重載與C++的重載有何不同。試舉例說明。
方法覆蓋:子類從父類中繼承方法。有時,子類需要修改父類中定義的方法的實現,這個操作被稱作覆蓋(method overriding)。僅當實例方法是可訪問時,它才能被覆蓋。因為私有方法在它的類本身以外是不能訪問的,所以不能覆蓋它。如果子類中定義的方法在父類中是私有的,那么這兩個方法完全沒有關系。
方法重載:方法重載是指在一個類中定義多個同名的方法,但要求每個方法具有不同的參數的類型或參數的個數。
比較:
重載意味着使用同樣的名字但是不同的簽名來定義多個方法,重寫意味着在子類中提供一個對方法的新的實現。
方法重寫發生在通過繼承而相關的不同類中,方法重載可以發生在同一個類中,也可以發生在由於繼承而相關的不同類中。
方法重寫具有同樣的簽名和返回值類型,方法重載具有同樣的名字,但是不同的參數列表。
Java中一個類的函數重載可以在本類中的函數和來自父類中的函數之間進行,而C++類中的函數重載只能是本類中的(即不包括來自父類的函數)
25.簡述多態的概念和多態的意義。
多態的概念:根據實際的對象類型決定函數調用的具體目標,同樣的調用語句在實際運行時有多種不同的表現形態
多態的定義:指允許不同類的對象對同一消息做出響應。即同一消息可以根據發送對象的不同而采用多種不同的行為方式。(發送消息就是函數調用)
Java多態必要條件:必須有繼承關系,必須有方法覆蓋,必須有父類引用指向子類對象。
多態意味着父類的變量可以指向子類對象,降低了代碼的耦合性,簡化了書寫,從某種程度上來說,提高了效率,也提高程序的可復用性,擴充性和可維護性
1.可替換性(substitutability)。多態對已存在代碼具有可替換性。例如,多態對圓Circle類工作,對其他任何圓形幾何體,如圓環,也同樣工作。
2.可擴充性(extensibility)。多態對代碼具有可擴充性。增加新的子類不影響已存在類的多態性、繼承性,以及其他特性的運行和操作。實際上新加子類更容易獲得多態功能。例如,在實現了圓錐、半圓錐以及半球體的多態基礎上,很容易增添球體類的多態性。
3.接口性(interface-ability)。多態是超類通過方法簽名,向子類提供了一個共同接口,由子類來完善或者覆蓋它而實現的。
4.靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。
5.簡化性(simplicity)。多態簡化對應用軟件的代碼編寫和修改過程,尤其在處理大量對象的運算和操作時,這個特點尤為突出和重要。
26.什么是引用變量的聲明類型?什么是引用變量的實際類型?什么是動態綁定?
Object o = new GeometricObject(); System.out.println(o.toString());
一個變量必須被聲明為某種類型。變量的這個類型稱為它的聲明類型。這里,o的聲明類型Object。一個引用類型變量可以是一個null值或者是一個對聲明類型實例的引用。變量的實際類型是被變量引用的對象的實際類。這里o的實際類型是GeometricObject,因為o指向使用new GeometricObject()創建的對象。o調用哪個toString()方法由o的實際類型決定,這稱為動態綁定。當從引用變量調用實例方法時,該變量的實際類型在運行時決定使用該方法的哪個實現,這稱為動態綁定。
27.父類與子類的引用變量之間,在互相轉換時,轉換規則是什么?instanceof運算符的作用是什么?試舉例說明。
(1)對象的引用可以類型轉換為對另外一種對象的引用,這稱為對象轉換。
總是可以將一個子類的實例轉化為一個父類的變量,稱為向上轉換,因為子類的實例永遠是它父類的實例。
當把一個父類的實例轉換為它的子類變量時(稱為向下轉換),必須使用轉換記號“(子類名)”進行顯式轉換,向編譯器表明你的意圖。
如:Apple x = (Apple)fruit;
(2)使用instanceof運算符來檢測一個對象是否是另一個對象的實例:
Object myObject = new Circle();
... // Some lines of code
if (myObject instanceof Circle) {
System.out.println("The circle diameter is " + ((Circle)myObject).getDiameter());
……
}
28.試比較equals函數和比較操作符“==”。
equals()函數比較兩個對象的內容。如果想讓equals函數能夠判斷兩個對象是否具有相同的內容,可以在定義這些對象的類時,覆蓋equals函數。
比較運算符= =用來比較兩個基本數據類型的值是否相等,或者判斷兩個對象是否具有相同的引用。
29.什么是this引用變量,其作用是什么?通過this調用同一個類的構造主法時,此語句是否可以出現在構造函數的任意位置上?
This是指向調用對象本身的引用名。它可以在構造方法內部用於調用同一類的其他構造方法,也可以引用對象的實例成員。
This在構造函數中應出現在任何可執行語句之前。
30.簡述final修飾類、變量、函數時,其作用是什么。
final修飾類是不能被繼承
fianl修飾方法不能在子類中被覆蓋,可直接使用
final修飾變量,稱為常量,初始化以后不能改變值。
31.定義一個子類時,使用哪一個關鍵字表示繼承?什么是單一繼承?什么是多重繼承?Java支持多重繼承嗎?為了實現類似多重繼承的功能,在java中應該如何做?
Extends
一個java類只可能直接繼承自一個父類,這種限制稱為單一繼承。
允許從幾個類中派生出一個子類的的能力稱為多重繼承。
Java中通過接口來實現多重繼承。
32.簡述與使用if語句處理異常相比,使用throw-try-catch-finally語句處理異常有什么優點。
可以拋出一個異常並被catch塊捕捉,並且強制執行finally語句塊;將檢測錯誤從處理錯誤中分離出來。
33.異常處理的優點和缺點分別是什么?
異常處理的優點:它能使方法拋出一個異常給它的調用者。這個調用者可以處理該異常。
如果沒有這個能力,那么被調用的方法就必須自己處理異常或終止該程序。異常處理將錯誤處理代碼從正常的程序設計任務中分離開,這樣,程序會更易閱讀和修改。
缺點:由於異常處理需要初始化新的異常對象,需要從調用棧返回而且還需要沿着方法調用鏈來傳播異常以便找到它的異常處理器,所以,異常處理通常需要更多的時間和資源
34.簡述異常處理的過程。如何定義一個自定義異常類?關鍵字throw和throws的作用分別是什么?
聲明、拋出和捕獲異常。
Java提供相當多的異常類,盡量使用API中的異常類。如果預定義的類不夠則定義自定義的異常類。通過擴展Exception類或其子類定義自定義的異常類。
throw和throws的作用:
throw關鍵字作用是拋出一個異常,拋出的時候是拋出的是一個異常類的實例化對象
throws關鍵字聲明的方法表示此方法不處理異常,而交給方法調用處進行處理。(聲明異常)
35.簡述try{…}catch(….){….}catch(….){….}結構的工作過程。
工作過程:如果在執行try塊的過程中沒有出現異常,則跳過catch子句。如果try塊中的某條語句拋出一個異常,Java就會跳過try塊中的剩余語句,然后開始查找處理這個異常的代碼過程。從第一個到最后一個逐個檢查catch塊,判斷在catch塊中的異常類實例是否是該異常對象的類型。如果是,就將該異常對象賦值給所聲明的變量,然后執行catch塊中的代碼。如果沒有,Java會退出這個方法,把異常傳遞給調用這個方法的方法,繼續同樣的過程來查找處理器。如果在調用的方法鏈中找不到處理器,程序就會終止並在控制台上打印出錯誤信息。
36.什么是是檢查型異常(checked exceptions)?什么是非檢查型異常(unchecked exceptions)?
RuntimeException、Error以及它們的子類都被稱為非檢查型異常。
所有其它異常都被稱為檢查型異常(checked exceptions),意思是編譯器會強制程序員檢查並處理它們。
37.什么是抽象類型?抽象類的作用是什么?抽象類是否可實例化?
Java中可以定義沒有方法體的方法,該方法由其子類來具體的實現。該沒有方法體的方法我們稱之為抽象方法,含有抽象方法的類我們稱之為抽象類。
作用:通過繼承它實現多態,后期綁定,可以為將來要實現的東西做好接口,更利於代碼的維護和重用。接口就是更純粹的抽象類。
*不能使用new操作符來實例化抽象類。可以定義它的構造方法,這個構造方法被它子類的構造方法中調用。
38.接口是什么?接口的作用是什么?如何定義一個接口?如何使用一個接口?接口可不可以實例化?
接口(interface)是一種與類相似的結構,它只包含常量和抽象方法。
接口在許多方面都與抽象類很相似,但是它的目的是指明多個對象的共同行為。
為了區分接口和類,Java采用下面的語法來定義接口:
(1)定義一個接口:
修飾符 interface 接口名{
/常量聲明/
/方法簽名/
}
(2)使用接口:使用implements實現接口繼承
...implements 接口名稱[, 其他接口名稱, 其他接口名稱..., ...] ...
class A implements B{
}//通過A來實現這個接口B
*由於接口中所有的數據域都是public final static而且所有方法都是public abstract ,所以Java允許忽略這些修飾符。
*不能使用new操作符創建接口的實例。
39.什么是淺復制(Shallow Copy)和深復制(Deep Copy)?如何實現深復制?
淺拷貝,並不拷貝對象本身,僅僅是拷貝指向對象的指針;深拷貝是直接拷貝整個對象內存到另一塊內存中。
(1)淺復制:被復制對象的所有變量都含有與原來的對象相同的值,而所有的對其他對象的引用仍然指向原來的對象。換言之,淺復制僅僅復制所考慮的對象,而不復制它所引用的對象。
(2)深復制:被復制對象的所有變量都含有與原來的對象相同的值,除去那些引用其他對象的變量。那些引用其他對象的變量將指向被復制過的新對象,而不再是原有的那些被引用的對象。換言之,深復制把要復制的對象所引用的對象都復制了一遍。
實現深復制:
- 通過在調用構造函數進行深復制
- 重載clone()方法
40.從數據成員、構造函數、成員函數三方面對比一下接口與抽象類。
|
變量(數據成員) |
構造方法 |
成員方法 |
抽象類 |
無限制 |
子類通過構造方法連調用構造方法,不能用new操作符實例化 |
無限制 |
接口 |
所有的變量必須是public static final |
沒有構造方法,接口不能用new操作符實例化 |
所有的方法必須是公共的抽象實例方法 |
41.JavaFX中,什么是舞台(Stage), 場景 (Scene), 節點(Nodes)?三者之間的關系是什么?面板(pane)作用是什么?
舞台(Stage):是JavaFX用戶接口的頂級容器,用Stage類表示。在Windows中,它通常就是一個窗口。當JavaFX啟動時,一個舞台被自動創建,並通過參數傳遞給start方法。
場景:用以管理控件和其他節點。
節點:節點是可視化組件。比如一個形狀、一個圖像視圖、一個UI組件或者一個面板。
三者之間的關系:舞台是用於顯示一個場景的窗體,可以將一個節點加入到一個場景中(節點置於場景中,場景設置於舞台中。)
面板作用:將節點放入其中,並自動的將節點布局在一個希望的位置和大小,將節點布局在一個面板中,再將面板布局在一個場景中。
42.JavaFX中,什么是屬性綁定?有哪兩種屬性綁定?
屬性綁定:可以將一個目標對象綁定到源對象中。源對象的修改將自動反映到目標對象中。
將一個目標對象和一個源對象綁定。如果源對象中的值改變了,目標對象也將自動改變。目標對象稱為綁定對象或者綁定屬性,源對象稱為可綁定對象或可觀察對象。
單向綁定:一個屬性的改變將反映到另一個對象上,反之不行。
雙向綁定:一個屬性的改變將反映到另一個對象上,反過來也一樣,這稱為雙向綁定。
43.描述面板StackPane、FlowPane、GridPane、Borderpane、HBox、VBox的布局特點是什么。
44.簡述JavaFX中一個事件從觸發到被處理的過程。
一個源對象觸發一個事件,然后一個對該事件感興趣的對象(事件處理器/事件監聽者)來處理它。
45.什么是事件源對象?什么是事件對象?描述兩者之間的關系。
產生一個事件並觸發它的組件稱為事件源事件。
一個事件對象包含與事件相關的任何屬性,是從一個事件源上產生的對象。
事件是從一個事件源上產生的對象。觸發一個事件意味着產生一個事件並委派處理器處理該事件。
46.文本IO與二進制IO有何區別?
二進制IO不涉及編碼和解碼,因此比文本IO更高效。文本IO是建立在二進制IO的基礎上,它能提供一層抽象,用於字符層的編碼與解碼。對於文本I/O而言,編碼和解碼是自動進行的。
(1)文本IO需要進行編碼和解碼。寫入字符是,JVM將Unicode轉化為特定文件編碼,而讀取時,反之;
(2)二進制IO不需要轉化。如果文件寫入字節,就是將原始的字節復制到文件中。當從文件讀取字節時,就會返回文件的確切字節。
47.什么是內部類?什么是匿名內部類?
內部類:或稱嵌套類。是定義在另一個類范圍中的類,內部類對於定義處理器類非常有用。
匿名內部類:沒有名字的內部類,將進一步實現定義一個內部類以及創建一個內部類的實例。
48.什么是UTF-8?為什么使用UTF-8?
UTF-8:是一種針對Unicode的可變長度字符編碼,又稱為萬國碼
UTF-8是一種編碼方案,它允許系統和Unicode及ASCII碼一起高效操作。由於有些語言的字符一個字節可以顯示,而有些需要兩個字節可以顯示,因為UTF-8采用可變長度的字符編碼,所以可以正常顯示各種語言。
49.什么可序列化的(serializable)對象?一個對象如何實現可序列化。
可以寫到輸出流中的對象稱為可序列化對象。
可序列化對象必須實現Serializable接口,實現這個接口可以啟動java的序列化機制,自動完成存儲對象的數組的過程。
50.JVM(java虛擬機)中有幾個比較重要的內存區域:函數區、常量池、堆區、棧區,這幾個區域在java類的生命周期中扮演着比較重要的角色,他們的作用分別是什么?
方法區:在java的虛擬機中有一塊專門用來存放已經加載的類信息、常量、靜態變量以及方法代碼的內存區域,叫做方法區。
常量池:常量池是方法區的一部分,用於存放編譯期生成的各種字面量與符號引用,如String類型常量就存放在常量池。
堆區:用於存放類的對象實例。
棧區:也叫java虛擬機棧,是由一個一個的棧幀組成的后進先出的棧式結構,棧楨中存放方法運行時產生的局部變量、方法出口等信息。當調用一個方法時,虛擬機棧中就會創建一個棧幀存放這些數據,當方法調用完成時,棧幀消失,如果方法中調用了其他方法,則繼續在棧頂創建新的棧楨。用於存放編譯期可知的各種 基本數據類型、對象引用類型