欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-12 12:00:14
...

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>不必一执行这个类就初始化,这样做到不浪费系统资源

3.两者区别对照

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

4.反射机制创建对象

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

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 后的变量无法序列化      
相关标签: java技术基础专栏