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月16日

快速阅读实践总结第一期:2017年9月11日——2017年9月24日

16年9月27日上午

2017年3月9日上午考研日志

2017年7月9日 星期日 --出埃及记 Exodus 27:21

2017年8月16日 星期三 --出埃及记 Exodus 28:38