📜  用Java创建对象的不同方法

📅  最后修改于: 2020-03-18 14:22:52             🧑  作者: Mango

众所周知,在Java中,类为对象提供了蓝图,您可以从类中创建对象。用Java创建对象的方法有很多。
以下是在Java中创建对象的一些方法:
1)使用new关键字:使用new关键字是创建对象的最基本方法。这是在Java中创建对象的最常见方法。几乎99%的对象都是通过这种方式创建的。通过使用此方法,我们可以调用要调用的任何构造函数(无参数或参数化的构造函数)。

// Java使用new关键之创建对象/实例
public class NewKeywordExample
{
    String name = "芒果For芒果";
    public static void main(String[] args)
    {
        // 用new创建新的对象
        NewKeywordExample obj = new NewKeywordExample();
        System.out.println(obj.name);
    }
}

输出:

芒果For芒果

2)使用new Instance: 如果我们知道类的名称,并且它具有公共默认构造函数,则可以创建一个对象– Class.forName。我们可以使用它来创建类的对象。Class.forName实际上是在Java中加载Class,但不会创建任何Object。要创建该类的对象,您必须使用该类的新实例方法。

// Java展示使用new Instance创造对象
public class NewInstanceExample
{
    String name = "芒果For芒果";
    public static void main(String[] args)
    {
        try
        {
            Class cls = Class.forName("NewInstanceExample");
            NewInstanceExample obj =
                    (NewInstanceExample) cls.newInstance();
            System.out.println(obj.name);
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (InstantiationException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }
}

输出:

芒果For芒果

3)使用clone()方法:每当在任何对象上调用clone()时,JVM实际上都会创建一个新对象,并将先前对象的所有内容复制到其中。使用clone方法创建对象不会调用任何构造函数。
要在对象上使用clone()方法,我们需要实现Cloneable并在其中定义clone()方法。

// Java程序,展示使用clone()方法创建对象
public class CloneExample implements Cloneable
{
    @Override
    protected Object clone() throws CloneNotSupportedException
    {
        return super.clone();
    }
    String name = "芒果For芒果";
    public static void main(String[] args)
    {
        CloneExample obj1 = new CloneExample();
        try
        {
            CloneExample obj2 = (CloneExample) obj1.clone();
            System.out.println(obj2.name);
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
    }
}

输出:

芒果For芒果

注意 :

  • 在这里,我们正在创建现有对象而不是任何新对象的克隆。
  • 类需要实现Cloneable接口,否则它将抛出CloneNotSupportedException

4)使用序列化每当我们序列化然后反序列化一个对象时,JVM都会创建一个单独的对象。在反序列化中,JVM不使用任何构造函数来创建对象。为了反序列化对象,我们需要在类中实现Serializable接口。
序列化对象:

// Java展示序列化对象
import java.io.*;
class DeserializationExample implements Serializable
{
    private String name;
    DeserializationExample(String name)
    {
        this.name = name;
    }
    public static void main(String[] args)
    {
        try
        {
            DeserializationExample d =
                    new DeserializationExample("芒果For芒果");
            FileOutputStream f = new FileOutputStream("file.txt");
            ObjectOutputStream oos = new ObjectOutputStream(f);
            oos.writeObject(d);
            oos.close();
            f.close();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

DeserializationExample类的对象使用writeObject()方法进行序列化,然后写入file.txt文件。
对象的反序列化:

// Java使用反序列化,创建新的对象.
import java.io.*;
public class DeserializationExample
{
    public static void main(String[] args)
    {
        try
        {
            DeserializationExample d;
            FileInputStream f = new FileInputStream("file.txt");
            ObjectInputStream oos = new ObjectInputStream(f);
            d = (DeserializationExample)oos.readObject();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        System.out.println(d.name);
    }
}

输出:

芒果For芒果

5)使用构造方法类的newInstance()方法:这类似于的newInstance()方法。java.lang.reflect.Constructor类中有一个newInstance()方法,可用于创建对象。通过使用此newInstance()方法,它还可以调用参数化构造函数和私有构造函数。

这两种newInstance()方法都被称为创建对象的反射方式。实际上,Class的newInstance()方法在内部使用了Constructor类的newInstance()方法。

// Java使用newInstance()方法创建新对象
import java.lang.reflect.*;
public class ReflectionExample
{
    private String name;
    ReflectionExample()
    {
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public static void main(String[] args)
    {
        try
        {
            Constructor constructor
                = ReflectionExample.class.getDeclaredConstructor();
            ReflectionExample r = constructor.newInstance();
            r.setName("芒果For芒果");
            System.out.println(r.name);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
}

输出:

芒果For芒果