最近無聊的在逛某 tube 網站,原本想看看你們是怎麼吐槽川普的,結果無心間點進了一個老外面試 Java 的視頻,對於常年面試被吊打的我瑟瑟發抖,因而決定進去一探究竟。java
畢竟不是專業的後臺開發,因此我在面試到後臺知識的時候果斷的退了出來,才讓本身免受了侮辱。面試
不過鑑於我手速出衆,飛速的記錄下了 Java 的基礎題,因此準備貢獻出來,供你們享樂。算法
鑑於題目比較多,會分紅上下 2 篇 來整理,主要是面對 Java 的基礎,看看老外的面試題和咱們有什麼區別。編程
固然問題是老外問的,答案是我編的。數組
Java 中有哪些可用的分配內存數據結構
Java 虛擬機在執行程序時候會將內存劃分爲不一樣的數據區域oracle
-Xmx
和 -Xms
控制),若是堆中沒有完成實例分配,而且堆沒法再擴展時,就會拋出 OutOfMemoryError 異常。若是我寫 static public void main,程序還會運行嗎?dom
剛看到這個題目的時候懵逼了,在國內面試真沒見過這麼問的,因此仍是有些不肯定,因此趕忙搜索。編程語言
在 Java 中的修飾符出如今字段聲明中時的順序與 oracle 規定的 FieldModifier 順序一致,這是習慣順序,造成規範。不遵照這個約定沒有技術影響,可是會下降代碼的可讀性,由於大多數開發人員都習慣於標準順序。函數
因此程序變成 static public void main() 也能夠運行。
下面僅列舉方法修飾符:
局部變量中的默認值是什麼?
在 Java 中的局部變量不會初始化。
public class staticFactory { public static void main(String[] args) { int temp; System.out.println(temp); } } // 打印信息:Error:(10, 28) java: 可能還沒有初始化變量 temp
若是是靜態變量不賦值,會直接默認值爲 0
public class staticFactory { static int temp; public static void main(String[] args) { System.out.println(temp); } } // 打印值爲 0
若是是成員變量
public class staticFactory { public static void main(String[] args) { LocalVariables obj = new LocalVariables(); System.out.println("a="+obj.a); System.out.println("b="+obj.b); System.out.println("c="+obj.c); System.out.println("d="+obj.d); } } class LocalVariables { int a; char b; float c; String d; } /* 打印結果: a=0 int 默認值爲 0 b="" char 默認值爲 "" c=0.0 float 默認值爲 0.0 d=null String 默認值爲 null */
在 Java 中如何拷貝構造函數
Java 中的拷貝構造方法是一種使用該類的一個對象構造另一個對象的構造方法。
如何創造拷貝構造方法
// 要建立拷貝構造方法,首先須要聲明帶有和本類相同類型的參數構造函數: public class Employee { private int id; private String name; public Employee(Employee employee) { } }
// 而後,將參數對象的每一個屬性都複製給新的實例。 public class Employee { private int id; private String name; public Employee(Employee employee) { this.id = employee.id; this.name = employee.name; } }
上面的作法屬於淺拷貝。
上面定義的屬性是基本類型和不可變類型 (int 和 String),所以使用前拷貝就沒問題。
可是若是類中包含可變類型就要經過該構造函數實現深拷貝。
爲了實現深拷貝,咱們須要根據原始可變對象類型構造新的實例。
public class Employee { private int id; private String name; private Date startDate; public Employee(Employee employee) { this.id = employee.id; this.name = employee.name; this.startDate = new Date(employee.startDate.getTime()); } }
什麼是標記接口
標記接口是沒有任何方法和屬性的接口,它僅僅代表它的類屬於一個特定類型,供其餘代碼測試容許作一些事情。而且標記接口不是 Java 這門語言特有的,而是計算機科學中的一種通用化的設計理念。
使用標記接口的惟一目的是使得能夠用 instanceof 進行類型查詢,例如:
if (obj instanceof Cloneable) {………}
在 Java 中,有一個經常使用的標記接口類
爲何 Java 不徹底面向對象
首先什麼纔是純面嚮對象語言?
純面嚮對象語言或徹底面向對象語言是指徹底面向對象的語言,它支持或具備將程序內的全部內容視爲對象的功能。它不支持原始數據類型(如 int,char,float,bool 等)。編程語言知足七種標準能夠就能夠稱爲純粹的面嚮對象語言,他們是:
爲何 Java 不是純面嚮對象語言?
Java 支持屬性 一、二、三、4 和 6 但不支持上面給出的 5 和 7。 Java 語言不是純面嚮對象語言,由於它包含如下屬性:
原始數據類型例如對象:
Smalltalk 是一種 「純粹的」 面向對象的編程語言,與 Java 和 C++ 不一樣,由於做爲對象的值和做爲基本類型的值之間沒有區別。在 Smalltalk 中,原始值,例如整數,布爾值和字符也是對象。在 Java 中,咱們將預約義類型做爲非對象 (基本類型)。
int a = 5; System.out.print(a);
static 關鍵字:
當咱們將一個類聲明爲 static 時,能夠在不使用 Java 中的對象的狀況下使用它。
以上兩點能夠解釋爲何 Java 不是徹底面向對象。
你能在 Java 程序中實現指針嗎
Java 虛擬機隱式地負責內存管理。Java 的主要格言是保持編程簡單。所以,不建議直接經過指針訪問內存。因此,指針在 Java 中被消除了,Java 中並無指針。
解釋一下 Java String 池
在 Java 的堆內存空間中,有一塊區域用來存放 Java 字符串池。當須要建立一個新的字符串的時候,JVM 首先檢查對象是否存在於字符串池中,若是存在,這個引用的對象將指向該變量,若是不存在則建立一個新對象。
因爲String實例對象不可修改,所以,「多個 String 實例對象引用變量引用同一個 String 實例對象」在節省 Java 堆內存的狀況下,並不會帶來任何問題。
直接賦值的方式
使用 new 的方式
當 main() 方法沒有生命成靜態會發生什麼?
main() 方法是 Java 程序的入口,也能夠理解爲一個接口,在 java 編程中,JVM 會查找類中的 public static void main ( String [] args ),若是找不到該方法就拋出錯誤 NoSuchMethodError:main 程序終止。main() 方法必須嚴格遵循它的語法規則,方法簽名必須是 public static void,參數是字符串數組類型。
固然還有其餘一些意義:
以上能夠看的出來,老外的面試的偏向性和咱們仍是有些區別的,這些題有一半在咱們的面試中是不常問到的,因此取長補短。