java技术---对象的实例化方法

1.使用New对象实例

(1)最常用的方法是直接使用new,而这是最普通的
(3)必须有构造方法(如果没实现,jvm会默认实现),构造方法必须是public修饰的
(2)直接new对象实例:
Productor productor = new Productor();

2.getInstance()方法创建对象

(1)考虑到其它的需要(如单实例模式,层次间调用等)直接使用new就不能实现好的设计,这时候需要使用间接使用new,
     即getInstance方法
(2)private修饰的构造函数,不能用new来实例化对象,只能调用getInstance方法来得到对象
(3)在主函数开始时调用,返回一个实例化对象,此对象是static的,在内存中保留着它的引用,
     即内存中有一块区域专门用来存放静态方法和变量
(4)getInstance保证了每次调用都返回相同的对象,这是一个设计方式的代表,而不仅仅指代一个方法名
(5)总结:
    <1>一般getInstance()是作为单例模式获取实例或者抽象类获得子类的规范方法名
    <2>getInstance这个方法在单例模式用的甚多
    <3>为了避免对内存造成浪费,直到需要实例化该类的时候才将其实例化,所以用getInstance来获取该对象
    <4>不必一执行这个类就初始化,这样做到不浪费系统资源

3.两者区别对照

(1)大部分类(非抽象类/接口/屏蔽了constructor的类)都可以用new
(2)new 一定要生成一个新对象,或者在栈上声明一个对象,分配内存 ,每部分的调用都是一个新的对象
(3)getInstance() 则不一定要再次创建,它可以把一个已存在的引用给你使用,这在效能上优于new
(3)getInstance是少部分类才有的一个方法,各自的实现也不同
(4)对象使用之前通过getInstance得到而不需要自己定义,用完之后不需要delete;
(5)new创建后只能当次使用
(6)getInstance()可以跨栈区域使用,或者远程跨区域使用,所以getInstance()通常是创建static静态实例方法的

4.newInstance()方法创建对象

(1)Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
(2)对于任意一个对象,都能够调用它的任意方法和属性;
(3)这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制
(4)newInstance()方法创建对象分为两种
      <1>反射机制的Class类的newInstance():只能够调用无参的构造函数,即默认的构造函数
          1.反射机制创建对象,使用的是类加载机制,特点是在调用时才创建对象
          2.首先通过Class.forName(“xxx”)动态的加载类的Class对象
          3.然后通过newInstance()方法获得类的对象
          4.xxx可以从配置文件当中获取实际的值,这样达到了解耦的目的,也是Spring依赖注入的原理
      <2>构造函数的newInstance()方法:可以根据传入的参数,调用任意构造器构造函数
          1.类Constructor也有newInstance方法,这一点和Class有点像
          2.Class是通过类来创建对象,而Constructor则是通过构造器
(5)事实上Class的newInstance方法内部调用Constructor的newInstance方法

5.clone()方法创建对象

(1)clone方法分为浅拷贝和深拷贝
      <1>浅拷贝:
           1.被复制对象的所有变量都含有与原来的对象相同的值
           2.所有的对其他对象的引用仍然指向原来的对象
      <2>深拷贝:
           1.不仅要复制对象的所有非引用成员变量值
           2.还要为引用类型的成员变量创建新的实例,并且初始化为形式参数实例值
(2)浅拷贝的效果就是,对引用对象的操作,会影响到所有引用了该对象的对象
(3)clone()实现的是浅复制,在重载clone方法的时候,需要转为深复制
       <1>即属性存在对象引用的时候,需要对引用属性再进行clone()复制
       <2>直到没有对象引用
(4)Cloneable只是一个标志,想要使用super.clone(),则需要实现Cloneable接口             

6.反序列化创建对象

(1)序列化对象就是对象此刻在内存中的状态转成的字节码
(2)通过实现Serializable接口进行序列化
(3)同Cloneable一样,Serializable也是一个空接口,作为一个标志使用
(4)通过ObjectStream的writeObject()方法和readObject()方法来序列化和反序列化
(5)还有一个Externalizable接口同样可以实现序列化
       <1>Externalizable继承了Serializable,同时增加了writeExternal()和readExternal()两个方法
       <2>可以指定序列化哪些属性,对于需要隐藏的属性,在前面加上transient就可以
(6)序列化和反序列化是深复制,static、transient 后的变量无法序列化      

7.类的生命周期,对象的创建流程(JVM的加载机制)
在这里插入图片描述

(1)JVM加载机制流程:
    <1>在使用一个对象时,JVM首先会检查相关类型是否已经加载并初始化
    <2>如果没有,则JVM立即进行加载并调用类构造器完成类的初始化
    <3>在类初始化过程中或初始化完毕后,根据具体情况才会去对类进行实例化
     3.1.实例化时候,java虚拟机就会为其分配内存来存放自己及其从父类继承过来的实例变量
     3.2.在为这些实例变量分配内存的同时,这些实例变量先会被赋予默认值(零值)
     3.3.在内存分配完成之后,Java虚拟机才会对新创建的对象赋予给定的值。
(2)一个对象的创建过程包含两个过程:初始化和实例化
    <1>类构造器完成类初始化(分配内存、赋予默认值)
    <2>类实例化(赋予给定值)
(3)类的初始化顺序:

在这里插入图片描述
(4)java创建对象的过程详解参考:
https://baijiahao.baidu.com/s?id=1637836912223474691&wfr=spider&for=pc

发布了143 篇原创文章 · 获赞 10 · 访问量 7562

猜你喜欢

转载自blog.csdn.net/qq591009234/article/details/103525893
今日推荐