目錄
clone方法的保護機制
Java中由SubString方法是否會引起內存泄漏?
Java中提供了哪兩種用于多態的機制??
程序計數器(線程私有)?
如何判斷對象是否是垃圾??
clone方法的保護機制
clone0方法的保護機制在Object中是被聲明為 protected的。以User類為例,通過聲明為protected就可以保證只有User類里面才能“克隆”User對象。
Java中由SubString方法是否會引起內存泄漏?
在JDKl.6中, String類中存儲了三個重要的屬性: char[]value、offSet和intcount,分別用來表示字符串對應的字符數組、數組的起始位置及String中包含的字符數。由這三個變量就可以唯—決定一個字符串。在調用SubString方法的時候,雖然會創建1個新的字符串,但是新對象的value仍然會使用原來字符串的value屬性。只是count和of fset的值不一樣而已。
雖然字符串在堆中是1個新的對象,但是它與原字符串都指向了相同的字符數組。對于垃圾回收器來說,這個字符數組仍然被使用,因此無法回收。“Helloworld”這個字符串雖然不被使用了, 但是仍然無法被垃圾回收器回收,因此就造成了內存泄漏。
substring() 方法返回字符串的子字符串。
?
public class RunoobTest {public static void main(String args[]) {String Str = new String("This is text");System.out.print("返回值 :" );System.out.println(Str.substring(4) );System.out.print("返回值 :" );System.out.println(Str.substring(4, 10) );} }
Java中提供了哪兩種用于多態的機制??
編譯時多態和運行時多態。編譯時多態是通過方法重載實現的,運行時多態是通過方法重寫(子類覆蓋父類萬法)實現的。
多態成員變量:編譯運行看左邊
? ? ? ? ?Fu f=new Zi();? ? ? ? ?System.out.println(f.num);//f是Fu中的值,只能取到父中的值
多態成員方法:編譯看左邊,運行看右邊
? ? ? ? Fu f1=new Zi();
? ? ? ? System.out.println(f1.show());//f1的門面類型是Fu,但實際類型是Zi,所以調用的是重寫后的方法
程序計數器(線程私有)?
一塊較小的內存空間, 是當前線程所執行的字節碼的行號指示器,每條線程都要有一個獨立的程序計數器,這類內存也稱為“線程私有” 的內存。
正在執行 java 方法的話,計數器記錄的是虛擬機字節碼指令的地址(當前指令的地址) 。如果還是 Native 方法,則為空。
這個內存區域是唯一一個在虛擬機中沒有規定任何 OutOfMemoryError 情況的區域。
如何判斷對象是否是垃圾??
引用計數:在對象中添加一個引用計數器,如果被引用計數器加 1,引用失效時計數器減 1,如果計數器為 0 則被標記為垃圾。原理簡單,效率高,但是在 Java 中很少使用,因為存在對象間循環引用的問題,導致計數器無法清零。
可達性分析:主流語言的內存管理都使用可達性分析判斷對象是否存活。基本思路是通過一系列稱為 GC Roots 的根對象作為起始節點集,從這些節點開始,根據引用關系向下搜索,搜索過程走過的路徑稱為引用鏈,如果某個對象到 GC Roots 沒有任何引用鏈相連,則會被標記為垃圾。可作為 GC Roots 的對象包括虛擬機棧和本地方法棧中引用的對象、類靜態屬性引用的對象、常量引用的對象。