首页 > 试题广场 >

下面的对象创建方法中哪些会调用构造方法 ()?

[不定项选择题]
下面的对象创建方法中哪些会调用构造方法 ()?
  • new语句创建对象
  • 调用Java.io.ObjectInputStream的readObject方法
  • java反射机制使用java.lang.Class或java.lang.reflect.Constructor的newInstance()方法
  • 调用对象的clone()方法
构造函数的作用是完成对象的初始化。当程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化。而选项B、D中,对象的初始化并不是通过构造函数完成的,而是读取别的内存区域中的对象的各个域来完成。
发表于 2018-05-03 15:37:25 回复(12)
题目的四个选项是构造方法new,序列化对象,反射,克隆分别创建一个对象的方法,,只有new和反射用到了构造方法
发表于 2017-09-05 00:43:27 回复(4)
readObject方法只是从文件中还原对象,clone只是一种复制拷贝对象。
发表于 2017-08-19 19:45:17 回复(4)
其他人都说了这么多,我说一点大家都没说到的内容。
1.new和反射都可以创建对象,但需要注意的是他们创建对象时执行构造函数的类型不一样。
2.new方式创建对象,其初始化过程中可以执行带参的构造器,也可以执行无参的构造器,也就是说其初始化数值可选。
3.反射,如果你采用的是静态的newInstance()方法,其执行的构造器一定是无参的构造器,反射执行不了带参的构造器,切记。
综上所述,如果题目问题为下面的对象创建方法中哪些只调用无参构造方法 ()?那么答案为C
发表于 2019-08-25 15:25:40 回复(11)
虚拟机中严格规定有且只有5中情况必须对类进行初始化
1.使用new生成对象时,读取或者设置静态属性,调用静态方法
2.对类使用反射调用的时候
3.初始化一个类的时候,如果发现父类没有被调用,泽需要先触发其父类进行初始化
4.当虚拟机启动时,用户需要制定一个要执行的朱磊(包含main方法的那个类),虚拟机会先初始化这个主类
5.使用jdk1.7的动态预约支持时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果REF_getStatic、REF_puttStatic、REF_invokeStatic的方法句柄,并且这个方法句柄所对应的类没有进行初始化,泽需要先触发其初始化(最后这种情况,我也没看懂,好像也是通过反射获取或设置静态属性,以及通过反射调用静态方法的时候,欢迎大佬指正)
发表于 2018-08-28 10:16:46 回复(2)
选项B。
“序列化”是一种把对象的状态转化成字节流的机制,“反序列”是其相反的过程,把序列化成的字节流用来在内存中重新创建一个实际的Java对象。这个机制被用来“持久化”对象。
通过对象序列化,可以方便的实现对象的持久化储存以及在网络上的传输。

选项D。
为什么需要克隆对象?直接new一个对象不行吗?因为克隆的对象可能包含一些已经修改过的属性,而new出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠clone方法了。那么我把这个对象的临时属性一个一个的赋值给我新new的对象不也行嘛?可以是可以,但是一来麻烦不说,二来,大家通过上面的源码都发现了clone是一个native方法,是在底层实现的,运行效率特别高特别快。
常见的Object a=new Object();Object b;b=a;这种形式的代码复制的是引用,即对象在内存中的地址,a和b对象仍然指向了同一个对象。
通过clone方法赋值的对象跟原来的对象时同时独立存在的
发表于 2020-05-03 11:16:34 回复(0)
lk9头像 lk9
盗用一下网络上的图片,创建对象的几种方式
发表于 2019-07-29 20:18:18 回复(0)
使用clone方法创建的新对象的构造函数是不会被执行的,也就是说会绕过任何构造函数(有参和无参),因为clone方法的原理是从堆内存中以二进制流的方式进行拷贝,直接分配一块新内存。
发表于 2019-06-04 15:47:31 回复(0)
readObject ()对象反序列化
clone()只是拷贝而已
发表于 2017-09-09 22:58:41 回复(0)
A:new
B:反序列化
C:反射
D:clone
补充:
        使用 Clone 方法创建对象:用 clone 方法创建对象的过程中并不会调用任何构造函数,要想使用
clone 方法,我们就必须先实现 Cloneable 接口并实现其定义的 clone 方法。
        使用(反)序列化机制创建对象:当反序列化一个对象时,JVM 会创建一个单独的对象,在此过
程中,JVM 并不会调用任何构造函数,为了反序列化一个对象,需要让类实现 Serializable 接口。
发表于 2022-02-03 12:24:53 回复(0)
readObject():从文件中还原对象
clone():复制,拷贝对象(设计深浅拷贝)

发表于 2017-08-18 17:39:13 回复(0)
初始化会在某个类被首次主动使用的时候触发,主动使用分为6类: 1.new 一个类的对象; 2.访问类或者接口的静态变量,或者进行赋值; 3.调用类的静态方法; 4.反射; 5.初始化某个子类,其父类也会初始化; 6.在jvm启动时被标明为启动类的类。 构造函数的作用是完成对象的初始化。当程序执行到new操作符时, 首先去看new操作符后面的类型,因为知道了类型,才能知道要分配多大的内存空间。分配完内存之后,再调用构造函数,填充对象的各个域,这一步叫做对象的初始化。而选项B、D中,对象的初始化并不是通过构造函数完成的,而是读取别的内存区域中的对象的各个域来完成。
编辑于 2021-11-02 20:51:09 回复(0)
这道题的考察其实很简单,就是在考察类加载时的初始化过程发生在什么情况下。一般而言,初始化为类变量赋予正确的初始值。初始化会在某个类被首次主动使用的时候触发,主动使用分为6类:
1.new 一个类的对象;
2.访问类或者接口的静态变量,或者进行赋值;
3.调用类的静态方法;
4.反射;
5.初始化某个子类,其父类也会初始化;
6.在jvm启动时被标明为启动类的类。
发表于 2020-04-14 09:19:50 回复(1)
对此,对于readObject方法稍微有点不同的看法 ,在readObject()的执行过程,最终调用的是readOrdinaryObject方法,在这个方法中有一句
 try {
            obj = desc.isInstantiable() ? desc.newInstance() : null;
        } catch (Exception ex) {
            throw (IOException) new InvalidClassException(
                desc.forClass().getName(),
                "unable to create instance").initCause(ex);
        }
obj = desc.isInstantiable() ? desc.newInstance() : null;
// 判断她是否可实例化  可以的话 那么通过反射实例化他  那么也就调用到了无参构造函数

发表于 2019-09-03 09:37:34 回复(0)
B.还原被序列化的对象
D.克隆拷贝对象
发表于 2022-05-01 14:50:44 回复(0)

深克隆 实际上是序列化和反序列化  

发表于 2018-10-31 00:25:17 回复(0)
readObject方法可以理解为从文件中还原一个对象,并没有创建

clone方法是拷贝一个对象,也没有涉及到构造方法
发表于 2018-05-14 20:49:49 回复(0)
题目的四个选项是构造方法new,序列化对象,反射,克隆分别创建一个对象的方法,,只有new和反射用到了构造方法
发表于 2017-10-23 12:38:35 回复(0)
反射机制破坏了java的封装特性,java对象的所有信息
包括private属性、构造方法全都拿到,所以反射会调用构造方法
发表于 2017-08-18 23:09:09 回复(1)
clone只是一种复制拷贝没有用到构造方法
发表于 2018-09-28 21:01:52 回复(0)