JAVA基礎概述(面試題 上)

概述

java語言的特點是什麼?

  1. 面向對象   基本概念:類,對象    三大特性:封裝,繼承,多態
  2. 健壯性  吸收了C/C++的優點,去掉了影響健壯性的(指針,內存申請和釋放)安全的內存管理和訪問機制
  3. 可移植性(跨平臺)使用jvm可以保證在不同平臺上運行 “Write once , Run Anywhere”

 

System.out.println()和System.out.print()什麼區別呢?

Println()輸出會換行   print()不會換行

 

一個".java"源文件中是否可以包括多個類(不是內部類)?有什麼限制?

可以的,但是隻有一個聲明爲public,和文件名相同

 

爲什麼要設置path(或者說,設置path的目的是什麼)

確保再控制檯任何路徑下都可以調用jdk目錄的命令

 

JDK,JRE和JVM的關係是什麼?

JDK(java開發工具包) = JRE + 開發工具集(例如Javac編譯工具等)

JRE(java運行環境) = JVM + Java SE標準類庫

Jvm=java虛擬機

 

GC是什麼? 爲什麼要有GC

GC是垃圾收集的意思(Gabage Collection),內存處理是編程人員容易出現問題的地方,

忘記或者錯誤的內存回收會導致程序或系統的不穩定甚至崩潰,Java提供的GC功能可以自動監測對象是否超過作用域從而達到自動回收內存的目的,Java語言沒有提供釋放已分配內存的顯示操作方法。

 

垃圾回收器的基本原理是什麼?垃圾回收器可以馬上回收內存嗎?有什麼辦法主動通知虛擬機進行垃圾回收

對於GC來說,當程序員創建對象時,GC就開始監控這個對象的地址、大小以及使用情況。通常,GC採用有向圖的方式記錄和管理堆(heap)中的所有對象。通過這種方式確定哪些對象是"可達的",哪些對象是"不可達的"。

當GC確定一些對象爲"不可達"時,GC就有責任回收這些內存空間。可以。程序員可以手動執行System.gc(),通知GC運行,但是Java語言規範並不保證GC一定會執行。

 

數組

Java可以動態分配數組嗎

可以, int i=10;

      Int [] array=new int [i];

數組有沒有length()這個方法? String有沒有length()這個方法

數組沒有length()這個方法,有length的屬性。String有length()這個方法

Java中的任何數據類型都可以使用System.out.pritln方法顯示

對基本數據類型而言,輸出的往往是變量的值;

對於像數組這一類複雜的數據類型,輸出的是其堆空間中存儲位置的hashCode值

操作二維數組的注意點

二維數組不應該使用常數控制維數,array.length表示行數,array[row].length表示row行的列數

顯示輸出

String[] stringArray = new String[3]; // 各元素的值默null
for (int i = 0; i < stringArray.length; i++) { // 對各元素進行初始化,但沒有賦值。
   
stringArray[i] = new String();
   
System.out.println(stringArray[i]);
}

輸出內容是空白的  (不是null)

 

編程題

創建一個長度爲6的int型數組,要求取值爲1-30,同時元素值各不相同

int[] arr = new int[6];

       for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31)

           arr[i] = (int) (Math.random() * 30) + 1;

          

              for (int j = 0; j < i; j++) {

                  if (arr[i] == arr[j]) {

                     i--;

                     break;

                  }

              }

           }

 

       for (int i = 0; i < arr.length; i++) {

           System.out.println(arr[i]);

       }

    }

 

下面數組定義正確的有:

A.String strs[] = { ‘a’ ‘b’ ‘c’}; 

B.String[] strs = {“a”, “b”, “c”};

C.String[] strs = new String{“a” ”b” ”c”};

D.String strs[] = new String[]{“a”, “b”, “c”};

E.String[] strs = new String[3]{“a”, “b”, “c”};

 

答案:

B_D

一維數組a[],用java代碼將數組元素順序顛倒

public static void main(String[] args) {

       int[] a = new int[] { (int) (Math.random() * 1000),

              (int) (Math.random() * 1000), (int) (Math.random() * 1000),

              (int) (Math.random() * 1000), (int) (Math.random() * 1000) };

 

       System.out.println(a);

       System.out.println(Arrays.toString(a));

       swap(a);

       System.out.println(Arrays.toString(a));

    }

 

    public static void swap(int a[]) {

       int len = a.length;

       for (int i = 0; i < len / 2; i++) {

           int tmp = a[i];

           a[i] = a[len - 1 - i];

           a[len - 1 - i] = tmp;

       }

}


面向對象

垃圾回收機制關鍵點

 

 

垃圾回收機制只回收JVM堆內存裏的對象空間。

 

 

對其他物理連接,比如數據庫連接、輸入流輸出流、Socket連接無能爲力

 

 

現在的JVM有多種垃圾回收實現算法,表現各異。

 

 

垃圾回收發生具有不可預知性,程序無法精確控制垃圾回收機制執行。

 

 

可以將對象的引用變量設置爲null,暗示垃圾回收機制可以回收該對象。

 

 

程序員可以通過System.gc()或者Runtime.getRuntime().gc()來通知系統進行垃圾回收,會有

一些效果,但是系統是否進行垃圾回收依然不確定。

 

 

垃圾回收機制回收任何對象之前,總會先調用它的finalize方法(如果覆蓋該方法,讓一

個新的引用變量重新引用該對象,則會重新激活對象)。

 

 

永遠不要主動調用某個對象的finalize方法,應該交給垃圾回收機制調用。

 

 

java類是否可以多繼承,怎麼實現多繼承?

答:java沒有多繼承,但可以通過接口的形式來達到多繼承的目地。

 

重載(overload)和重寫(overried,有的書也叫做“覆蓋”)的區別?

答:方法的重寫Overriding和重載Overloading是Java多態性的不同表現。重寫Overriding是父類與子類之間多態性的一種表現,重載Overloading是一個類中多態性的一種表現。如果在子類中定義某方法與其父類有相同的名稱和參數,我們說該方法被重寫 (Overriding)。子類的對象使用這個方法時,將調用子類中的定義,對它而言,父類中的定義如同被"屏蔽"了。如果在一個類中定義了多個同名的方法,它們或有不同的參數個數或有不同的參數類型,則稱爲方法的重載(Overloading)。

 

寫出“==”和equals的區別

  1. ==是判斷兩個變量或實例是不是指向同一個內存空間,equals是判斷兩個變量或實例所指向的內存空間的值是不是相同 
  2. ==是指對內存地址進行比較 , equals()是對字符串的內容進行比較
  3. ==指引用是否相同, equals()指的是值是否相同

 

int 和 Integer 有什麼區別

答:Java 提供兩種不同的類型:引用類型和原始類型(或內置類型)。

int是java的原始數據類型,Integer是java爲int提供的封裝類。Java爲每個原始類型提供了封裝類。

原始類型封裝類型及其對應的包裝類:boolean Boolean,char Character,byte Byte,short Short,int Integer,long Long,float  Float,doubl  Double

引用類型和原始類型的行爲完全不同,並且它們具有不同的語義。

引用類型和原始類型具有不同的特徵和用法,它們包括:大小和速度問題,這種類型以哪種類型的數據結構存儲,當引用類型和原始類型用作某個類的實例數據時所指定的缺省值。對象引用實例變量的缺省值爲 null,而原始類型實例變量的缺省值與它們的類型有關。

abstract class 和interface 有什麼區別?

答:聲明方法的存在而不去實現它的類被叫做抽象類(abstract class),它用於要創建一個體現某些基本行爲的類,併爲該類聲明方法,但不能在該類中實現該類的情況。不能創建abstract 類的實例。然而可以創建一個變量,其類型是一個抽象類,並讓它指向具體子類的一個實例。不能有抽象構造函數或抽象靜態方法。Abstract 類的子類爲它們父類中的所有抽象方法提供實現,否則它們也是抽象類。取而代之,在子類中實現該方法。知道其行爲的其它類可以在類中實現這些方法

 

接口(interface)是抽象類的變體。在接口中,所有方法都是抽象的。多繼承性可通過實現這樣的接口而獲得。接口中的所有方法都是抽象的,沒有一個有程序體。接口只可以定義static final成員變量。接口的實現與子類相似,除了該實現類不能從接口定義中繼承行爲。當類實現特殊接口時,它定義(即將程序體給予)所有這種接口的方法。然後,它可以在實現了該接口的類的任何對象上調用接口的方法。由於有抽象類,它允許使用接口名作爲引用變量的類型。通常的動態聯編將生效。引用可以轉換到接口類型或從接口類型轉換,instanceof 運算符可以用來決定某對象的類是否實現了接口

 

接口是否可繼承接口? 抽象類是否可實現(implements)接口? 抽象類是否可繼承實體類(concrete class)?

 

答案是:   接口可以繼承接口。抽象類可以實現(implements)接口,

抽象類可繼承實體類,但實體類必須不能是如下兩種情況之一:  

1,final修飾符修飾的類是不能的

2,如果此實體類有且僅有私有的構造函數也是不能的。

Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)

 

答:匿名的內部類是沒有名字的內部類。不能extends(繼承) 其它類,但一個內部類可以作爲一個接口,由另一個內部類實現

Static Nested Class 和 Inner Class的不同

答:Nested Class (一般是C++的說法),Inner Class (一般是JAVA的說法)。

Java內部類與C++嵌套類最大的不同就在於是否有指向外部的引用上。

注: 靜態內部類(Inner Class)意味着

1創建一個static內部類的對象,不需要一個外部類對象,2不能從一個static內部類的一個對象訪問一個外部類對象

 

異常處理

運行時異常與一般異常有何異同

答:異常表示程序運行過程中可能出現的非正常狀態,運行時異常表示虛擬機的通常操作中可能遇到的異常,是一種常見運行錯誤。java編譯器要求方法必須聲明拋出可能發生的非運行時異常,但是並不要求必須聲明拋出未被捕獲的運行時異常。

 

Java中的異常處理機制的簡單原理和應用

答:當JAVA程序違反了JAVA的語義規則時,JAVA虛擬機就會將發生的錯誤表示爲一個異常。

違反語義規則包括2種情況。一種是JAVA類庫內置的語義檢查。例如數組下標越界,會引發IndexOutOfBoundsException;訪問null的對象時會引發NullPointerException。另一種情況就是JAVA允許程序員擴展這種語義檢查,程序員可以創建自己的異常,並自由選擇在何時用throw關鍵字引發異常。所有的異常都是java.lang.Thowable的子類。

垃圾回收的優點和原理。並考慮2種回收機制

答:Java語言中一個顯著的特點就是引入了垃圾回收機制,使c++程序員最頭疼的內存管理的問題迎刃而解,它使得Java程序員在編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制,Java中的對象不再有"作用域"的概念,只有對象的引用纔有"作用域"。

垃圾回收可以有效的防止內存泄露,有效的使用可以使用的內存。垃圾回收器通常是作爲一個單獨的低級別的線程運行,不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對象或所有對象進行垃圾回收。回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。

JAVA語言如何進行異常處理,關鍵字:throws,throw,try,catch,finally分別代表什麼意義?在try塊中可以拋出異常嗎?

答:Java通過面向對象的方法進行異常處理,把各種不同的異常進行分類,並提供了良好的接口。在Java中,每個異常都是一個對象,它是Throwable類或其它子類的實例。當一個方法出現異常後便拋出一個異常對象,該對象中包含有異常信息,調用這個對象的方法可以捕獲到這個異常並進行處理。Java的異常處理是通過5個關鍵詞來實現的:try、catch、throw、throws和finally。一般情況下是用try來執行一段程序,如果出現異常,系統會拋出(throws)一個異常,這時候你可以通過它的類型來捕捉(catch)它,或最後(finally)由缺省處理器來處理。

用try來指定一塊預防所有"異常"的程序。緊跟在try程序後面,應包含一個catch子句來指定你想要捕捉的"異常"的類型。

throw語句用來明確地拋出一個"異常"。

throws用來標明一個成員函數可能拋出的各種"異常"。

Finally爲確保一段代碼不管發生什麼"異常"都被執行一段代碼。

可以在一個成員函數調用的外面寫一個try語句,在這個成員函數內部寫另一個try語句保護其他代碼。每當遇到一個try語句,"異常"的框架就放到堆棧上面,直到所有的try語句都完成。如果下一級的try語句沒有對某種"異常"進行處理,堆棧就會展開,直到遇到有處理這種"異常"的try語句。

 

try {}裏有一個return語句,那麼緊跟在這個try後的finally {}裏的code會不會被執行,什麼時候被執行,在return前還是後?

答:會執行,在return前執行

 

error和exception有什麼區別

答:error 表示恢復不是不可能但很困難的情況下的一種嚴重問題。比如說內存溢出。不可能指望程序能處理這樣的情況

    exception 表示一種設計或實現問題。也就是說,它表示如果程序運行正常,從不會發生的情況

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章