1. 程式人生 > >2017年9月16日 new Class()和getInstance()的區別

2017年9月16日 new Class()和getInstance()的區別

iat -1 turn string ont 報錯 靜態 end 單例

new class

new關鍵字實際上是在heap(堆中)開辟了一塊內存,而等號右邊的這個對象實際上就是一個內存地址

getInstance()

getInstance()主要是調用類中的static靜態方法而獲得的對象,屬於單例對象,比如Calendar類的

public static Calendar getInstance()
{
return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT));
}

區別:

1、getInstance()比new節約開銷,new()必定要在內存上開辟空間,而getInstance()則是可以把已經存在的一個引用給你

2、new ClassName()主要是普通類,而getInstance()是少部分類,多為抽象類,因為抽象類無法實例化對象

3、因為是靜態方法創建,能使用的範圍也不同

 1 package day12.am;
 2 
 3 import java.io.Serializable;
 4 import java.util.Calendar;
 5 import java.util.Date;
 6 import java.util.GregorianCalendar;
 7 import java.util.Locale;
 8 import java.util.TimeZone;
 9 
10
import org.omg.Messaging.SyncScopeHelper; 11 12 abstract class A{ 13 public A(){ 14 } 15 16 abstract void aa(); 17 public static A getInstance() { 18 System.out.println("我被創建了"); 19 return null; 20 } 21 }; 22 public class ClassLoader { 23 public
static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException { 24 25 /*Date類可以直接new() 26 * public class Date implements java.io.Serializable, Cloneable, Comparable<Date>{} 27 * */ 28 Date date =new Date(); 29 System.out.println(date); 30 /* Calendar類只能用getInstance()方法來實現創建對象 31 * 查看底層發現public abstract class Calendar implements Serializable, Cloneable, Comparable<Calendar>(); 32 * Calendar類屬於抽象類,是不能被直接創建的,而Calendar的底層有getInstance()的靜態方法: 33 * public static Calendar getInstance(){ 34 return createCalendar(TimeZone.getDefault(), Locale.getDefault(Locale.Category.FORMAT)); } 35 * */ 36 Calendar c =Calendar.getInstance(); 37 //Calendar c2 =new Calendar(); 38 System.out.println(c); 39 System.out.println(c.getClass()); 40 //子類 GregorianCalendar()去實現 父類Calendar()也是可以的 41 Calendar c2= new GregorianCalendar(); 42 System.out.println(c2); 43 //因為newInstance()就是實例化對象,相當於還是new(),而get是寫的一個方法,不屬於new 對象,通過發射創建還是會報錯 44 // Calendar c2=(Calendar) Class.forName("java.util.Calendar").newInstance(); 45 // System.out.println(c2); 46 47 //抽象類A,用getInstance()實例化 48 A a1=A.getInstance(); 49 System.out.println(a1); 50 //通過反射然後用newInstance() 51 // A a2=(A) Class.forName("day12.am.A").newInstance(); 52 // System.out.println(a2); 53 54 } 55 }

技術分享

2017年9月16日 new Class()和getInstance()的區別