2017年9月16日 new Class()和getInstance()的区别
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017年9月16日 new Class()和getInstance()的区别相关的知识,希望对你有一定的参考价值。
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()的区别的主要内容,如果未能解决你的问题,请参考以下文章
快速阅读实践总结第一期:2017年9月11日——2017年9月24日