Java如何创建对象

1 Java如何创建对象

该对象是OOPs语言的基本构建块。在Java中,如果不创建对象,我们将无法执行任何程序。我们将在本节中讨论用Java创建对象的各种方法,并学习如何用Java创建对象。

Java提供了五种创建对象的方法。

  • 使用new关键字
  • 使用clone()方法
  • 使用Class类的newInstance()方法
  • 使用Constructor类的newInstance()方法
  • 使用反序列化

2 使用new关键字

使用new关键字是创建类的对象或实例的最流行的方法。当我们使用new关键字创建该类的实例时,它为新创建的对象分配内存(堆),并且还将该对象的引用返回到该内存。new关键字也用于创建数组。创建对象的语法为:

ClassName object = new ClassName();  

让我们创建一个使用new关键字创建对象的程序。

CreateObjectExample1.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
public class CreateObjectExample1   
{    
void show()    
{    
System.out.println("Welcome to yiidian");    
}    
public static void main(String[] args)   
{    
//creating an object using new keyword   
CreateObjectExample1 obj = new CreateObjectExample1();   
//invoking method using the object  
obj.show();    
}    
}   

输出结果为:

Welcome to yiidian

通过使用new关键字,我们还可以调用类的构造函数(默认或参数化)。

CreateObjectExample2.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
public class CreateObjectExample2  
{  
//constructor of the class    
CreateObjectExample2()    
{    
System.out.println("Welcome to yiidian");    
}    
public static void main(String[] args)   
{    
//creating an object using new keyword   
CreateObjectExample2 obj = new CreateObjectExample2();   
}    
}  

输出结果为:

Welcome to yiidian

3 使用clone()方法

该clone() 方法是的方法Object类。它创建一个对象的副本并返回相同的副本。JVM被调用clone() 方法时将创建一个新的对象。它将先前创建的对象的所有内容复制到新的一个对象中。请注意,它不会调用任何构造函数。使用clone() 方法时,我们必须实现Cloneable接口。如果对象的类不支持Cloneable接口,则该方法将引发CloneNotSupportedException异常。如果无法克隆实例,则覆盖clone() 方法的子类会引发异常。

注意:该方法创建对象的副本,而不是新对象。

语法:

protected Object clone() throws CloneNotSupportedException  

我们使用以下语句创建一个新对象。

ClassName newobject = (ClassName) oldobject.clone();  

CreateObjectExample3.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
public class CreateObjectExample3 implements Cloneable   
{   
@Override  
protected Object clone() throws CloneNotSupportedException   
{   
//invokes the clone() method of the super class      
return super.clone();   
}   
String str = "New Object Created";   
public static void main(String[] args)   
{  
//creating an object of the class     
CreateObjectExample3 obj1 = new CreateObjectExample3();   
//try catch block to catch the exception thrown by the method  
try  
{  
//creating a new object of the obj1 suing the clone() method  
CreateObjectExample3 obj2 = (CreateObjectExample3) obj1.clone();   
System.out.println(obj2.str);   
}   
catch (CloneNotSupportedException e)   
{   
e.printStackTrace();   
}   
}   
}  

输出结果为:

New Object Created

4 使用Class类的newInstance()方法

Class类的newInstance() 方法也用于创建对象。它调用默认的构造函数来创建对象。它返回该对象表示的类的新创建实例。它在内部使用Constructor类的newInstance() 方法。

语法:

public T newInstance() throws InstantiationException, IllegalAccessException 

它引发IllegalAccessException, InstantiationException,ExceptionInInitializerError异常。

我们可以通过以下方式创建对象:

ClassName object = ClassName.class.newInstance();  

或者

ClassName object = (ClassName) Class.forName("fully qualified name of the class").newInstance();  

在上面的语句中,forName() 是Class类的静态方法。它解析String类型的参数className。它返回具有完全限定名称的类的对象。它加载类,但不创建任何对象。如果无法加载类,则抛出ClassNotFoundException;如果链接失败,则抛出LinkageError。

为了创建对象,我们使用Class类的newInstance() 方法。仅当我们知道类的名称并且该类具有公共默认构造函数时,它才起作用。

在以下程序中,我们使用newInstance() 方法创建了一个新对象。

CreateObjectExample4.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
public class CreateObjectExample4  
{   
void show()    
{    
System.out.println("A new object created.");    
}    
public static void main(String[] args)   
{   
try  
{  
//creating an instance of Class class  
Class cls = Class.forName("CreateObjectExample4");   
//creates an instance of the class using the newInstance() method  
CreateObjectExample4 obj = (CreateObjectExample4) cls.newInstance();   
//invoking the show() method  
obj.show();   
}   
catch (ClassNotFoundException e)   
{   
e.printStackTrace();   
}   
catch (InstantiationException e)   
{   
e.printStackTrace();   
}   
catch (IllegalAccessException e)   
{   
e.printStackTrace();   
}   
}   
}  

输出结果为:

A new object created.

5 使用Constructor类的newInstance()方法

它类似于Class类的newInstance() 方法。这是创建对象的一种反射方式。该方法是在Constructor类中定义的,该类是java.lang.reflect包的类。我们还可以使用newInstance() 方法来调用参数化构造函数和私有构造函数。与Class类的newInstance() 方法相比,它是广泛首选的。

语法:

public T newInstance(Object... initargs) throws InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException

该方法将Objects数组解析为参数。包装在适当类型的包装对象中的基本类型的值。它返回通过调用构造函数创建的新对象。它引发IllegalAccessException,IllegalArgumentException,InstantiationException,InvocationTargetException,ExceptionInInitializerError Exceptions。

我们可以通过以下方式创建对象:

Constructor<Employee> constructor = Employee.class.getConstructor();   
Employee emp3 = constructor.newInstance();  

让我们创建一个使用newInstance() 方法创建对象的程序。

CreateObjectExample5.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
import java.lang.reflect.*;   
public class CreateObjectExample5  
{   
private String str;   
CreateObjectExample5()   
{   
}   
public void setName(String str)   
{   
this.str = str;   
}   
public static void main(String[] args)   
{   
try  
{   
Constructor<CreateObjectExample5> constructor = CreateObjectExample5.class.getDeclaredConstructor();   
CreateObjectExample5 r = constructor.newInstance();   
r.setName("yiidian");   
System.out.println(r.str);   
}   
catch (Exception e)   
{   
e.printStackTrace();   
}   
}   
}  

输出结果为:

yiidian

6 使用反序列化

6.1 Java序列化的介绍

在Java中,序列化是将对象转换为字节流序列的过程。序列化的反向过程(从字节流到对象)称为反序列化。当我们序列化或反序列化一个对象时,JVM将创建一个新对象。它不使用构造函数来创建对象。使用反序列化时,必须在该类中实现Serializable接口(标记接口)。

序列化:ObjectOutputStream类的writeObject() 方法用于序列化对象。它将对象发送到输出流。

序列化语法:

public final void writeObject(object x) throws IOException  

反序列化:该方法的readObject() 的ObjectInputStream的类用于反序列化的对象。它从流中引用对象。

public final Object readObject() throws IOException,ClassNotFoundException  

注意:如果我们不想将字段包含为对象的一部分,则将字段设为静态或瞬态。它不会包括在序列化过程中。

Employee.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
import java.io.Serializable;    
public class Employee implements Serializable  
{    
int empid;    
String empname;    
public Empoyee(int empid, String empname)   
{    
this.empid = empid;    
this.empname = empname;    
}    
}  

我们创建了一个名为Employee的类,该对象将被序列化和反序列化。

6.2 Java的序列化

在下面的程序中,我们通过使用ObjectOutputStream类的writeObject() 方法序列化了Employee类的对象。对象的状态保存在employee.txt文件中。

SerializationExample.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
import java.io.*;    
class SerializationExample   
{    
public static void main(String args[])  
{    
Try  
{    
//Creating the object    
Employee emp = new Employee(198054,"Andrew");    
//Creates a stream and writes the object    
FileOutputStream fout=new FileOutputStream("employee.txt");    
ObjectOutputStream out=new ObjectOutputStream(employeeout);    
out.writeObject(emp);    
out.flush();    
//closes the output stream    
out.close();    
System.out.println("Successfully Created");    
}  
catch(Exception e)  
{  
System.out.println(e);  
}    
}    
}    

输出结果为:

Successfully Created

6.3 Java的反序列化

在下面的程序中,我们将反序列化在上述程序中序列化的对象。

DeserializationExample.java:

/**
 * 一点教程网: http://www.yiidian.com
 */
import java.io.*;    
class DeserializationExample   
{    
public static void main(String args[])  
{    
try  
{    
//Creating a stream to read the object    
ObjectInputStream in=new ObjectInputStream(new FileInputStream("employee.txt"));    
Employee e=(Employee)in.readObject();    
//prints the data of the serialized object    
System.out.println(e.empid+" "+e.empname);    
//closing the input stream    
in.close();    
}  
catch(Exception e)  
{  
System.out.println(e);  
}    
}    
}   

输出结果为:

198054 Andrew

在以上五个方法中,我们注意到new关键字和两个newInstance() 方法都使用构造函数创建对象,而其余两个方法不使用构造函数。

热门文章

优秀文章