JAVA面試總結

**0、關於JAVA java

  1. ——封裝

封裝性就是把類(對象)的屬性和行爲結合成一個獨立的相同單位,並儘量隱蔽類(對象)的內部細節,對外造成一個邊界,只保留有限的對外接口使之與外部發生聯繫。封裝的特性使得類(對象)之外的部分不能隨意存取類(對象)的內部數據(屬性),保證了程序和數據不受外部干擾且不被誤用。算法

l  經過訪問修飾符來限制對類的屬性和方法的訪問,各修飾符含義以下:設計模式

**Private:**成員變量和方法只能在類內被訪問,具備類可見性 默認: 成員變量和方法只能被同一個包裏的類訪問,具備包可見性。 Protected:能夠被同一個包中的類訪問,被同一個項目中不一樣包中的子類訪問 **Public:**能夠被同一個項目中全部的類訪問,具備項目可見性,這是最大的訪問權 限.數組

  1. ——繼承

1)、繼承是面向對象的三大特徵之一,也是實現代碼複用的重要手段。Java的繼承具備單繼承的特色,即只能繼承自一個父類,每一個子類只有一個直接父類,可是其父類又能夠繼承於另外一個類,從而實現了子類能夠間接繼承多個父類,但其本質上劃分仍然是一個父類和子類的關係。安全

2)、Java的繼承經過extends關鍵字來實現,實現繼承的類被稱爲子類,被繼承的類稱爲父類(有的也稱其爲基類、超類),父類和子類的關係,是一種通常和特殊的關係。就像是水果和蘋果的關係,蘋果繼承了水果,蘋果是水果的子類,水果是蘋果的父類,則蘋果是一種特殊的水果。 值得指出的是:Java的子類不能得到父類的構造器。多線程

注:異步

子類能夠繼承父類的全部特性,但其可見性,由父類成員變量、方法的修飾符決定。對於被private修飾的類成員變量或方法,其子類是不可見的,也即不可訪問;對於定義爲默認訪問(沒有修飾符修飾)的類成員變量或方法,只有與父類同處於一個包中的子類能夠訪問;對於定義爲public或protected 的類成員變量或方法,全部子類均可以訪問。ide

子類中能夠聲明與父類同名的成員變量,這時父類的成員變量就被隱藏起來了,在子類中直接訪問到的是子類中定義的成員變量。 子類中也能夠聲明與父類相同的成員方法,包括返回值類型、方法名、形式參數都應保持一致,稱爲方法的覆蓋。 若是在子類中須要訪問父類中定義的同名成員變量或方法,須要用的關鍵字super。Java中經過super來實現對被隱藏或被覆蓋的父類成員的訪問。函數

super 的使用有三種狀況:ui

l  訪問父類被隱藏的成員變量和成員方法: super.成員變量名;

l  調用父類中被覆蓋的方法,如:super.成員方法名([參數列]);

l  調用父類的構造函數,如:super([參數列表]); super( ):只能在子類的構造函數中出現,而且永遠都是位於子類構造函數中的第 一條語句。

3.——多態


多態性是指在繼承關係中的父類中定義的屬性或方法被子類繼承以後,能夠具備不一樣的數據類型或表現出不一樣的行爲。這使得同一個屬性或方法在父類及其各子類類中具備不一樣的含義。

Java引用變量有兩個類型:一個是編譯時類型,一個是運行時類型。編譯時的類型由聲明該變量時使用的類型決定,運行時的類型由實際賦給該變量的對象決定。若是編譯時類型和運行時類型不一致,就會出現所謂的多態(Polymorphism)

在Java中,多態指如下語法現象:

▲重載(Overload)——方法容許重名

▲覆寫(Override)——容許子類重寫父類的方法

▲泛型

二、給數組排序的方法:

public class sort{
public static void main(String args[]){
int data[] = new int[]{1,2,8,6,4,9,3,7,5};
sort(data);
print(data);
}
//專門給數組排序的方法
public static void sort(int arr[]){
for(int x = 0; x < arr.length; x ++){
	for(int y = 0; y < arr.length - 1; y ++){
		if(arr[ y ] > arr[ y + 1]){
			int t = arr[ y ];
			arr[ y ] = arr[ y +1 ];
			arr[ y + 1 ] = t;	
		}
	}
}
}
public static void print(int temp[]){
	for(int x = 0;x < temp.length; x++){
		System.out.print( temp[ x ]+"、");
	}
	System.out.println();
}

} 三、比較&、&&和|、||的區別:

當&與&&同爲邏輯運算符時,它們都用於鏈接兩個Boolean類型的表達式,當&和&&的兩端表達式同時爲真時,表達式的結果爲真,只要有一端爲假,那麼表達式結果爲假。

邏輯運算符&與&&的區別是:

& 不管左邊結果是什麼,右邊仍是繼續運算;
   &&當左邊爲假,右邊再也不進行運算。

當|和||的兩端表達式同時爲假時,表達式的結果爲假,只要有一端爲真,那麼表達式結果爲真。

邏輯運算符|與||的區別:

| -- 不管左邊結果是什麼,右邊仍是繼續運算;
  ||-- 當左邊爲真,右邊再也不進行運算。

四、利用算法在一個數組裏完成轉置操做:

public class reverse{
public static void main(String args[]){
	int data[] = new int[]{1,2,3,4,5,6,7,8,9};
	reverse(data);
	print(data);
}
//專門給數組轉置操做的方法
public static void reverse(int arr[]){
	int center = arr.length / 2;  //轉置的次數
	int head = 0;                      //頭部索引
	int tail = arr.length - 1;       //尾部索引
	for(int x = 0; x < center; x ++){
		int temp = arr[head];
		arr[head]=arr[tail];
		arr[tail] = temp;
		head++;
		Tail --;	
	}
}
public static void print(int temp[]){
	for(int x = 0;x < temp.length; x++){
		System.out.print( temp[ x ]+"、");
	}
	System.out.println();
}
}

五、請解釋String類對象兩種實例化方式的區別:

**直接賦值(String str = 「字符串」;):**只會開闢一塊堆內存空間,而且會自動保存在對象池之中,以便下次重複使用;

**構造方法(String str = new String(「字符串」);):**會開闢兩塊堆內存空間,其中有一塊空間會成爲垃圾,而且不會自動入池,可是用戶可使用intern()方法手工入池。

六、實現首字母大寫其他字母小寫的方法

public static String initcap(String str){
	return 	str.substring(0,1).toUpperCase()+str.substring(1).toLowerCase();
}

七、請解釋重載與覆寫的區別?(請解釋Overloading與Overrid的區別?)、在使用Overloading的時候方法的返回值可否不一樣?

八、請編寫一個Factory程序(工廠設計模式) --見課程第96課時

九、請編寫一個Proxy程序(代理設計模式)

// 	接口的應用-代理模式(Proxy)
	中心思想:一個對象只關注本身想作的事情,其它事情交給別人去作,也就是說找了個代理去作。
interface Subject {
public void make() ;
}
class RealSubject implements Subject {
public void make() {
	System.out.println("核心主題正在操做!") ;
}
}
class ProxySubject implements Subject {
private Subject subject ;
public ProxySubject(Subject subject) {
	this.subject = subject ;
}
public void prepare() {
	System.out.println("核心主題操做前的準備工做!") ;
}
public void make() {
	this.prepare() ;
	this.subject.make() ;
	this.destory() ;
}
public void destory() {
	System.out.println("核心主題操做後的收尾工做!") ;
}
}
public class TestProxy {
public static void main(String args[]) {
	Subject sub = new ProxySubject(new RealSubject()) ;
	sub.make() ;
}
}

十、抽象類與接口的區別

總結:

抽象類比接口功能要多,只有一點,接口不受單繼承侷限,因此在抽象類和接口所有可使用時,咱們會優先考慮使用接口

參考:

1.在進行公共操做時必需要定義出接口

2.有了接口必須使用子類完善方法 3.若是是你本身所定義的接口,絕對不可使用關鍵字new去建立接口的子類實例化對象,必須使用工廠類去構建這個實例化對象。

掌握的知識點:

1).抽象類和接口的定義區別

2).接口做爲標準用於解耦合以及不一樣層之間的鏈接橋樑

3).必定要將工廠模式和代理模式的結構記下來。

十一、請解釋String、StringBuffer、StringBuilder的區別: String的內容一單生成就不可改變;而StringBuffer、StringBuilder申明的內容能夠改變;

StringBuffer類中提供的方法都是同步方法,屬於安全的線程操做 StringBuilder類中的方法都屬於異步方法,是非線程安全的操做。

十二、Thread與Runnable實現多線程的區別

一、Thread類是Runnable接口的子類,使用Runnable接口實現多線程能夠避免單繼承的限制

二、Runnable接口實現的多線程能夠比Thread類實現的多線程更加清楚的描述數據共享的概念

1三、解釋多個線程訪問同一資源時,須要考慮到哪些狀況?有可能帶來哪些問題?

多個資源訪問同一資源時必定要處理好同步,可使用同步代碼塊或者同步方法來解決:

同步代碼:synchronized(鎖定對象,通常爲當前對象){代碼}
	同步方法:public synchronized 返回值 方法名稱(參數){代碼}

注意:可是過多的使用同步有可能形成死鎖問題。

1四、sleep()與wait()的區別:

sleep()是Thread類定義的方法;
wait()是Object類定義的方法。
sleep()方法能夠設置休眠時間,時間一到自動喚醒;wait()須要等待notify()方法進行喚醒。

1五、請解釋Runnable與Callable的區別:

Runnable是在JDK1.0提出的多線程實現接口;Callable是在JDK1.5以後提出的
java.lang.Runnable接口之中提供有一個run()方法,而且沒有返回值

java.util.concurrent.Callable接口之中提供有call()方法,有返回值

1六、請解釋什麼叫GC?如何處理?

⑴ GC(Garbage Collector)垃圾收集器,指的是釋放無用的內存空間;
⑵ GC會由系統不按期進行自動的回收,或者調用Runtime類中的gc()方法手工回收。

1七、請解釋final、finally、finalize的區別?

final:關鍵字,定義不能被繼承的類、不能被覆寫的方法、變量;
finally:關鍵字,是異常處理語句結構的一部分,表示老是執行。
finalize: 由Object類提供的方法(protected void finalize()throws Throwable),指的是對象回收前的收尾方法,即便出現了異常也不會致使程序中斷執行。

1八、BigDecimal四捨五入

1九、Class類無構造方法,獲取Class類的實例有三種方法

a、 利用對象調用getClass()方法獲取該對象的Class實例。
b、 使用Class類的靜態方法forName(),用類的名字獲取一個Class	 實例:forName()方法定義以下:
 public static Class forName(String name, boolean initialize, 	 ClassLoader loader) throws ClassNotFoundException
c、 運用 .class 的方式來獲取Class實例,對於基本數據類型的封裝類,還能夠採用 .TYPE 來獲取相應的基本數據類型的Class實	例。

後續請小夥伴們自行get...

相關文章
相關標籤/搜索