《深入java虚拟机》书里的java面试题-详解获取类的四种方法

 2019-12-22 11:24  阅读(1418)
文章分类:JVM

1 通过new关键字获取对象
假设我们在函数中写了如下这个简单的语句:
  StringBuffer str = new StringBuffer(”Hello world”);
  别看这个语句简单,其实包含了如下三个步骤:
 首先,newStringBuffer(”Helloworld”)在堆里申请了一坨内存,把创建好的StringBuffer对象放进去。
  其次,StringBufferstr声明了一个指针。这个指针本身是存储在栈上的(因为语句写在函数中),可以用来指向某个StringBuffer类型的对象。或者换一种说法,这个指针可以用来保存某个StringBuffer对象的地址。
  最后,当中这个等于号(赋值符号)把两者关联起来,也就是把刚申请的那一坨内存的地址保存成str的值。
  
2019120001691\_1.png

new 关键字使用时,现在堆内存 种申请内存,存放对象 同时声明了一个指针指向该对象,指针本身存储在栈上。指针保存了引用对象的地址。

2使用newInstance()方法创建对象 即通过反射
1、通过Class对象的newInstance()方法,这种方法的局限是只能取调用默认的构造函数

Class<?> demo1=Class.forName("Demo");
           Class<?> demo2=new Demo().getClass();
           Class<?> demo3=Demo.class;

2、通过取得Class对象的getConstructor方法取得Construtor对象,然后再通过调用Constructor类的newInstance的两个方法

3、通过Array.newInstance方法来创建对象,但这种只适用于数组,数组也是一种对象

3 使用clone()方法创建对象
在实际编程过程中,我们常常要遇到这种情况:有一个对象A,在某一时刻A中已经包含了一些有效值,此时可能 会需要一个和A完全相同新对象B,并且此后对B任何改动都不会影响到A中的值,也就是说,A与B是两个独立的对象,但B的初始值是由A对象确定的。在 Java语言中,用简单的赋值语句是不能满足这种需求的。要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单,也是最高效的手段。

   Java的所有类都默认继承java.lang.Object类,在java.lang.Object类中有一个方法clone()。JDK API的说明文档解释这个方法将返回Object对象的一个拷贝。
   要说明的有两点:一是 拷贝对象返回的是一个新对象,而不是一个引用。二是 拷贝对象与用 new操作符返回的新对象的区别就是这个拷贝已经包含了一些原来对象的信息,而不是对象的初始信息。

4对以前序列化的对象解除序列化

  把对象转换为字节序列的过程称为 对象的序列化
  把字节序列恢复为对象的过程称为对象的反序列化
 
  对象的序列化主要有两种用途:
  1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

 在很多应用中,需要对某些对象进行序列化,让它们离开内存空间,入住物理硬盘,以便长期保存。比如最常见的是Web服务器中的Session对象,当有 10万用户并发访问,就有可能出现10万个Session对象,内存可能吃不消,于是Web容器就会把一些seesion先序列化到硬盘中,等要用了,再把保存在硬盘中的对象还原到内存中。

  当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。
java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。
  **只有实现了Serializable和Externalizable接口的类的对象才能被序列化。**Externalizable接口继承自 Serializable接口,实现Externalizable接口的类完全由自身来控制序列化的行为,而仅实现Serializable接口的类可以 采用默认的序列化方式 。
  对象序列化包括如下步骤:
  1) 创建一个对象输出流,它可以包装一个其他类型的目标输出流,如文件输出流;
  2) 通过对象输出流的writeObject()方法写对象。

  对象反序列化的步骤如下:
  1) 创建一个对象输入流,它可以包装一个其他类型的源输入流,如文件输入流;
  2) 通过对象输入流的readObject()方法读取对象。

点赞(1)
版权归原创作者所有,任何形式转载请联系作者; Java 技术驿站 >> 《深入java虚拟机》书里的java面试题-详解获取类的四种方法

相关推荐