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 后的变量无法序列化
上一篇: 求一颗二叉树的镜像
下一篇: docker镜像加速