zoukankan      html  css  js  c++  java
  • Java中newInstance()和new()区别

    一、newInstance()和new()区别:

    • 两者创建对象的方式不同,前者是实用类的加载机制,后者则是直接创建一个类:
    • newInstance创建类是这个类必须已经加载过且已经连接,new创建类是则不需要这个类加载过
    • newInstance: 弱类型(GC是回收对象的限制条件很低,容易被回收)、低效率、只能调用无参构造,new 强类型(GC不会自动回收,只有所有的指向对象的引用被移除是才会被回收,若对象生命周期已经结束,但引用没有被移除,经常会出现内存溢出)

    二、伸缩、扩展性:

      在开发中,我们经常可以看到一些接口的设计,实现接口的类加载一般都会采用newInstance而不会使用new,在这里就涉及到了两者在开发过程中的扩展性和伸缩性,来看一段代码:
    

      定义一个BeanFactory接口,分别让类A、B实现接口:

    package com.main;
    public interface BeanFactory {
        //核心方法getBean
        Object getBean(String name);
    }
    
    public class B implements BeanFactory{
        @Override
        public Object getBean(String name) {
            return null;
        }
    }
    
    public class A implements BeanFactory{
        @Override
        public Object getBean(String name) {
            return null;
        }
    }
    

    测试结果:

    public class Test {
        
        @SuppressWarnings("rawtypes")
        public static void main(String[] args) throws Exception {
           
            Class a1 = Class.forName("A");
            BeanFactory a2 =  (BeanFactory) a1.newInstance();
            System.out.println(a2);
           
            Class b1 = Class.forName("B");
            BeanFactory b2 =  (BeanFactory) b1.newInstance();
            System.out.println(b2);
            }
    
    }
    
    A@15db9742
    B@6d06d69c
    

      通过上面实例我们可以很清楚的看到,如果在接口的设计中很多类实现了该接口,我们只需要使用Class中的forName方法加载一下类就可以了,可以将这一段代码提出来作为一个工具类方法,不管有多少类只要实现了该接口我们只要传入需要实例化的路径名就可以实例化,这样大大节省了我们的代码(注:newInstance实例化对象是只能调用无参构造方法,在A、B类中并没有构造方法,是因为每个创建的类都有一个默认的无参构造方法,如果你重写了一个带参构造方法,想要使用newInstance,则必须指定一个无参构造方法,否则会报初始化错误)

  • 相关阅读:
    extjs使用笔记-21
    如何安装整个linux系统中所需要的mp3播放库插件? 可以在安装rpmfusion仓库后直接通过dnf install进行按照就可以了
    aria2的下载配置
    再谈fedora23下Virutalbox的安装. --问题的关键在于 安装kernel-devel包
    extjs的使用笔记2
    提高迅雷的下载速度
    extjs的使用笔记
    expr的字符串操作 表达式: length, index, match, substr等
    弄懂linux shell对包含$的变量的执行过程?
    从0开始安装fedora23的笔记-- 以及使用fedora的常规问题-3
  • 原文地址:https://www.cnblogs.com/KylinBlog/p/13932075.html
Copyright © 2011-2022 走看看