[Java常考面試題-牛客網] 第1-10題
轉載請註明出處
第1題:什麼是Java虛擬機器?為什麼Java被稱作是“平臺無關的程式語言”?
Java虛擬機器JVM(java virtual machine)是一個執行位元組碼的程式。Java寫的程式碼儲存為字尾為.java的檔案,它會被特定的程式(javac.exe)編譯,編譯之後稱為位元組碼檔案(bytecode,字尾為.class),位元組碼在CPU上不能直接執行,需要另一個程式讀取並執行,這個程式就是JVM。
同一個.java源程式 生成的位元組碼檔案(.class)都是一樣的。而對於同一條指令,不同機器上面的機器碼是不一樣的。比如,讀命令在A機器上是001,而B機器上面是010。JVM做的事情就是把位元組碼檔案翻譯成當前機器能夠正確執行的機器碼。
不同機器用它所相容的JVM,所以實現了所謂的“與平臺無關”。
第2題:JDK和JRE的區別是什麼?
JRE(Java Runtime Environment):Java執行環境。只包含了Java虛擬機器、Java核心類庫 和 支援檔案。
JDK(Java Development Kit):Java開發工具包 是 完整的Java軟體開發包,包含了JRE,編譯器(javac.exe) 和 其他的工具(比如:JavaDoc, Java偵錯程式)。
第3題:”static”關鍵字是什麼意思?Java中是否可以覆蓋(override)一個private或者是static的方法?
static表示靜態的意思。它可以修飾一個成員變數或者成員方法,這樣的話,該變數或方法可以在沒有類的例項變數之下
static方法不能被覆蓋。static方法是編譯時靜態繫結的,而方法覆蓋是執行時動態繫結的。
private方法也不能被覆蓋。private描述的方法只能在當前類中使用。
第4題:是否可以在static環境中訪問非static變數?
否。因為static環境比非static變數更早初始化,所以static環境開始使用的時候,非static變數還沒被創建出來,所以不能訪問,編譯器會報錯。
第5題:Java支援的資料型別有哪些?什麼是自動拆裝箱?
Java支援2種資料型別:
1. 基本資料型別(8種)。byte, short, int, long, float, double, boolean, char
2. 引用型別。 Byte,Short,Integer,Long,Float,Double,Boolean,Character
引用型別是 儲存的物件的地址,然後通過地址找到堆中的物件。String等也是引用型別。
自動拆裝箱:在特定情況下,例如給某個方法傳遞引數時,基本資料 和 引用型別能夠相互轉換(如int-->Integer)
例如:
Integer value = 10;//java5之後可以這樣自動裝箱。把10這個int型別的值複製為引用型別的Integer物件。
//相當於java5之前的 Integer value = new Integer(10);
int i = value;//這樣就是自動拆箱。
第6題:Java中的方法覆蓋(Overriding)和方法過載(Overloading)是什麼意思?
覆蓋是 子類對父類的允許訪問的方法的實現過程進行重新編寫,返回值和形參都不能改變。(加上@override可以讓編譯器驗證當前方法是否也存在於父類中,寫錯方法名,編譯器就會報錯)
過載是在同一個類裡面的方法,這些方法的名字相同,但引數不同,返回型別可以相同也可以不同。每個過載的方法都要有一個獨一無二的引數型別列表(根據引數列表來區分的)。
第7題:Java中,什麼是構造方法?什麼是構造方法過載?什麼是複製構造方法?
構造方法:用於新物件建立時構造這個物件的方法(方法名和類名相同)。如果程式設計師沒有提供這個類的構造方法,Java編譯器會給這個類建立一個預設的構造方法。
構造方法過載:當前過載的方法是構造方法(也就是和類名相同的方法,不同的構造方法通過引數列表來區分)。
複製構造方法:用一個已經例項化的物件來初始化(new)一個物件。(Java不像C++那樣提供預設的複製構造方法)
例如,
public class Time{
private int hour;
private int minute;
private int second;
public Time(){ //構造方法
}
public Time(int h, int m, int s){//構造方法過載
this.hour = h;
this.minute = m;
this.second = s;
}
public Time(Time t){ //複製構造方法
this.hour = t.hour;
this.minute = t.m;
this.second = t.s;
}
}
第8題:Java支援多繼承嗎?
Java不支援多繼承,只有單繼承。但可以通過實現多個介面來拓展相應的功能。
第9題:介面和抽象類的區別是什麼?
介面 | 抽象類 |
隱含的方法都是抽象的 | 可以同時包含抽象方法和非抽象方法 |
類可以實現多個介面 | 類只能繼承一個抽象類 |
宣告的變數預設是final的 | 可以包含final的變數 |
成員函式預設是public的 | 成員函式可以是private, protected, 或者public |
類可以不實現抽象類和介面宣告的所有方法,但類必須得宣告成是抽象的。
介面和抽象類都不能被例項化。
第10題:什麼是值傳遞和引用傳遞?
值傳遞是對基本型變數而言的。傳遞的是變數的副本,改變副本不會改變原變數的值。
引用傳遞是對 物件型變數而言的。傳遞的是物件的地址的副本,改變這個副本(地址)的對應的物件(就是原來的物件) 會改變原來物件 的值。
關於java一切都是值傳遞的理解:引用傳遞 傳遞 的值是物件的地址的值 的 副本。