Java中创建对象的5种方法
作为Java开发者,我们每天都会创建大量的对象,但是,我们总是使用管理依赖系统(如Spring框架)来创建这些对象。其实还有其他方法可以创建对象,那么下文将为大家进行详细介绍,欢迎阅读学习。
1.使用new关键字这是最常见的创建对象的方法,并且也非常简单。通过使用这种方法我们可以调用任何我们需要调用的构造函数。
Employee emp1 = new Employee();
0: new #19 // class org/programming/mitra/exercises/Employee
3: dup
4: invokespecial #21 // Method org/programming/mitra/exercises/Employee."":()V
2.使用class类的newInstance方法我们也可以使用class类的newInstance()方法来创建对象。此newInstance()方法调用无参构造函数以创建对象。
我们可以通过newInstance() 用以下方式创建对象:
Employee emp2 = (Employee) ame("oyee")nstance();
或者
Employee emp2 = nstance();
51: invokevirtual #70 // Method java/lang/nstance:()Ljava/lang/Object;
3.使用构造函数类的 newInstance方法与使用class类的newInstance()方法相似,tructor类中有一个可以用来创建对象的newInstance()函数方法。通过使用这个newInstance()方法我们也可以调用参数化构造函数和私有构造函数。
Constructor constructor = onstructor();
Employee emp3 = nstance();
111: invokevirtual #80 // Method java/lang/reflect/nstance:([Ljava/lang/Object;)Ljava/lang/Object;
这些 newInstance() 方法被认为是创建对象的反射手段。实际上,内部类的nstance()方法使用构造函数类的 newInstance() 方法。这就是为什么后者是首选并且使用不同的框架如Spring, Hibernate, Struts等。
4.使用clone方法实际上无论何时我们调用clone() 方法,JAVA虚拟机都为我们创建了一个新的对象并且复制了之前对象的内容到这个新的对象中。使用 clone()方法创建对象不会调用任何构造函数。
为了在对象中使用clone()方法,我们需要在其中实现可克隆类型并定义clone()方法。
Employee emp4 = (Employee) e();
162: invokevirtual #87 // Method org/programming/mitra/exercises/e ()Ljava/lang/Object;
5.使用反序列化无论何时我们对一个对象进行序列化和反序列化,JAVA虚拟机都会为我们创建一个单独的对象。在反序列化中,JAVA虚拟机不会使用任何构造函数来创建对象。
对一个对象进行序列化需要我们在类中实现可序列化的接口。
ObjectInputStream in = new ObjectInputStream(new FileInputStream(""));
Employee emp5 = (Employee) Object();
261: invokevirtual #118 // Method java/io/Object:()Ljava/lang/Object;
正如我们在以上的字节代码片段中所看到的,除第一种被转换为一个新的函数和一个 invokespecial 指令以外,其它4种方法都被调用并转换为invokevirtual。
示例让我们来看看准备创建对象的 Employee 类:
class Employee implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String name;
public Employee() {
tln("Employee Constructor Called...");
}
public String getName() {
return name;
}
public void setName(String name) {
= name;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : Code());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != lass())
return false;
Employee other = (Employee) obj;
if (name == null) {
if ( != null)
return false;
} else if (!ls())
return false;
return true;
}
@Override
public String toString() {
return "Employee [name=" + name + "]";
}
@Override
public Object clone() {
Object obj = null;
try {
obj = e();
} catch (CloneNotSupportedException e) {
tStackTrace();
}
return obj;
}
}
在下面的Java程序中我们用5种方式来创建 Employee对象。
public class ObjectCreation {
public static void main(String... args) throws Exception {
// By using new keyword
Employee emp1 = new Employee();
ame("Naresh");
tln(emp1 + ", hashcode : " + Code());
// By using Class class's newInstance() method
Employee emp2 = (Employee) ame("oyee")
nstance();
// Or we can simply do this
// Employee emp2 = nstance();
ame("Rishi");
tln(emp2 + ", hashcode : " + Code());
// By using Constructor class's newInstance() method
Constructor constructor = onstructor();
Employee emp3 = nstance();
ame("Yogesh");
tln(emp3 + ", hashcode : " + Code());
// By using clone() method
Employee emp4 = (Employee) e();
ame("Atul");
tln(emp4 + ", hashcode : " + Code());
// By using Deserialization
// Serialization
ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(""));
eObject(emp4);
e();
//Deserialization
ObjectInputStream in = new ObjectInputStream(new FileInputStream(""));
Employee emp5 = (Employee) Object();
e();
ame("Akash");
tln(emp5 + ", hashcode : " + Code());
}
}
此程序输出结果如下:Employee Constructor Called...
Employee [name=Naresh], hashcode : -1968815046
Employee Constructor Called...
Employee [name=Rishi], hashcode : 78970652
Employee Constructor Called...
Employee [name=Yogesh], hashcode : -1641292792
Employee [name=Atul], hashcode : 2051657
Employee [name=Akash], hashcode : 63313419
-
如何实现javascript去除字符串里中文与空格
导语:如何实现javascript去除字符串里中文与空格呢?下面是小编给大家提供的示例代码实现,大家可以参考阅读,更多详情请关注应届毕业生考试网。1.去掉空格:functionmoveSpace(){varstr="abcdefg";alert(ace(/[]/g,""));}moveSpace();2.去掉中文:vartitle="字符串zifuc...
-
Java中的对象与引用知识详解
在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然。今天我们就来一起了解一下对象和对象引用之间的区别和联系。以下仅供参考!1.何谓对象?在Java中有一句比较流行的话,叫...
-
21个java基本知识点
本文主要是一些java基础知识点相关的,所以也希望能分享给刚刚入门的Java程序员和打算入Java开发这个行当的准新手们,希望可以给大家一些经验,能让大家更好学习和使用Java。1.JVM相关(包括了各个版本的特性)对于刚刚接触Java的人来说,JVM相关的知识不一定需要理解很...
-
Java 正则表达式
Java是一门编程语言,那么大家知道Java正则表达式是怎样的呢?下面一起来看看!Java正则表达式正则表达式定义了字符串的模式。正则表达式可以用来搜索、编辑或处理文本。正则表达式并不仅限于某一种语言,但是在每种语言中有细微的差别。正则表达式实例一个字符串其...