-
面向對象的特徵
- 抽象
- 繼承
- 多態
-
是否正確:
float f=3.4;
錯誤,3.4爲雙精度(double),將雙精度賦值給浮點型,屬於下轉型,會造成精度損失,需要強制轉化
-
& 和&& 區別
- &:按位與和邏輯與
- &&:短路與運算
在驗證用戶登錄時需判斷用戶名不是null而且不是空字符串時:username != null &&!username.equals(“”),兩者不能交換且只能使用&&不能使用&
-
解釋內存中的棧(stack)、堆(heap)和靜態存儲區的用法
- 棧空間:一個基本數據類型的變量、一個對象的引用還有函數調用的線程保存
- 堆空間:通過new關鍵字和構造器創造的對象
- 靜態存儲區:程序中的字面量:直接書寫的100、“hello”
String str = new String(“hello”);
str放在棧上;new出來的字符串對象放在堆上,而“hello“這個字面量放在靜態存儲區中
但是是創建了兩個對象,一個是靜態存儲區的“xyz”,一個是用new創建在堆上的對象。
-
四捨五入的原理是在參數上+0.5然後向下取整。
-
移位是最有效的計算2次方的操作
-
數組只有length屬性,java有length()方法。
-
構造器不能被繼承,因此不能被重寫,但可以被重載。
-
不能繼承String類
-
當一個對象被當做參數傳遞到另一個方法後,此方法中改變了這個對象的屬性,並且返回了變化後的結果,請問是值傳遞還是引用傳遞
- java中只有值傳遞,當一個對象實例作爲一個參數被傳遞到方法中時,參數的值就是對該對象的引用。對象的屬性可以在被調用的過程中改變,但對象的引用是永遠不會改變的。
-
下面程序的輸出
public static void main(String[] args) { String a="helloworld"; String b=new String("helloworld"); String c="hello"+"world"; System.out.println(a==b); System.out.println(a==c); System.out.println(a.equals(b)); System.out.println(a.equals(c)); System.out.println(a.intern()==b.intern()); }
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-keDKoIno-1583376556401)(https://raw.githubusercontent.com/iszhonghu/Picture-bed/master/img/20200304170505.png)]
intern() 方法返回字符串對象的規範化表示形式。
它遵循以下規則:對於任意兩個字符串 s 和 t,當且僅當 s.equals(t) 爲 true 時,s.intern() == t.intern() 才爲 true。
-
JVM加載class文件的原理機制
- JVM中類的裝載是由類加載器(ClassLoader)和它的子類來實現的,Java中的類加載器是一個重要的Java運行時系統組件,它負責在運行時查找和裝入類文件中的類
當java程序需要使用某個類是,JVM會確保這個類已經被加載、連接(驗證、準備和解析)和初始化。
類加載是值把類的.class文件中的數據讀入到內存中,通常會創建一個字節數組讀入.class文件,然後產生與所加載類對應的Class對象。然後進入連接階段,主要包括驗證、準備和解析。最後JVM對類進行初始化
類的加載器:根加載器、擴展加載器、系統加載器和用戶自定義類加載器
-
靜態嵌套類(Static Nested Class)和內部類(Inner Class)的不同
- 靜態嵌套類是被聲明爲靜態的內部類,它可以不依賴於外部類實例被實例化。
- 內部類:需要在外部類實例化後才能實例化
-
java中會存在內存泄漏嗎
- 存在無用但可達的對象,這些對象不能被GC回收也會發生內存泄漏
- Hibernate的Session(一級緩存)中的對象屬於持久態,垃圾回收器是不會回收這些對象的,然而這些對象中可能存在無用的垃圾對象
- 存在無用但可達的對象,這些對象不能被GC回收也會發生內存泄漏
-
抽象的(abstract)方法是否可同時是靜態的(static),是否可同時是本地方法(native),是否可同時被synchronized修飾
- 都不可以
- 抽象方法需要子類重寫,而靜態方法是無法被重寫的。
- 本地方法是由本地代碼實現的方法,而抽象方法時沒有實現的。
- synchronized和方法的實現細節有關,抽象方法不設計實現細節。
- 都不可以
-
靜態變量和實例變量的區別
- 靜態變量是被static修飾的變量。也稱爲類變量,它屬於類,不屬於類的任何一個對象,一個類不管創建多少個對象,靜態變量在內存中有且只有一個拷貝;實例變量必須依附於某一實例,需要先創建對象然後通過對象才能訪問到它。靜態變量可以實現讓多個對象共享內存。
-
是否可以從一個靜態方法內部發出對非靜態方法的調用?
- 不可以,靜態方法只能訪問靜態成員。因爲非靜態方法的調用要先創建對象,因此在調用講臺方法時可能對象並沒有被初始化
-
如何實現對象克隆
- 實現Cloneable接口並重寫Object類中的clone()方法;
- 實現Serializable接口,通過對象的序列化和反序列化實現克隆,可以實現真正的深度克隆
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream; import java.io.ByteArrayInputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; public abstract class test { private test(){ throw new AssertionError(); } public static <T> T clone(T obj)throws Exception{ ByteOutputStream bout = new ByteOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bout); oos.writeObject(obj); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject(); } }
基於序列化和反序列化實現的克隆不僅僅是深度克隆,更中套的是通過泛型限定,可以檢查出要克隆的對象是否支持序列化。
這項檢查是編譯器完成的,不是在運行時拋出異常
-
Error和Exception有什麼區別
- Error:表示系統級的錯誤和程序不必處理的異常,是恢復不是不可能但是很困難的情況下的一種嚴重問題:內存溢出不可能指望程序能處理這種情況
- Exception:表示需要捕捉或者需要程序進行處理的異常,是一種設計或現實問題
Java面試過過過
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.