java创建对象的四种方式有哪些?具体方式详解

阳光 2021-01-06 21:03:34 java常见问答 7359

java是一种面向对象的语言,万事万物皆对象,在创建对象的时候,有四种方式方式可以创建它,但是大家对这些还不是太了解,那么今天我们就给大家分享一下java创建对象的四种方式。

1.使用new创建对象

使用new关键字创建对象应该是最常见的一种方式,但我们应该知道,使用new创建对象会增加耦合度。无论使用什么框架,都要减少new的使用以降低耦合度。

package yunche.test;
/**
* @ClassName: Hello
* @Description: 待创建的类
* @author: yunche
* @date: 2018/08/24
*/
public class Hello
{
    public void sayWorld()
    {
        System.out.println("Hello world!");
    }
}
package yunche.test;
/**
* @ClassName: NewClass
* @Description: 使用new关键字创建对象
* @author: yunche
* @date: 2018/08/24
*/
public class NewClass
{
    public static void main(String[] args)
    {
        Hello h = new Hello();
        h.sayWorld();
    }
}

2.使用反射的机制创建对象

使用Class类的newInstance方法

Hello类的代码不变,NewClass类的代码如下:

package yunche.test;
/**
* @ClassName: NewClass
* @Description: 使用Class类的newInstance方法
* @author: yunche
* @date: 2018/08/24
*/
public class NewClass
{
    public static void main(String[] args)
    {
        try
        {
            Class heroClass = Class.forName("yunche.test.Hello");
            Hello h = (Hello) heroClass.newInstance();
            h.sayWorld();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
        catch (InstantiationException e)
        {
            e.printStackTrace();
        }
    }
}

使用Constructor类的newInstance方法

package yunche.test;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
/**
* @ClassName: NewClass
* @Description: 使用Constructor类的newInstance方法
* @author: yunche
* @date: 2018/08/24
*/
public class NewClass
{
    public static void main(String[] args)
    {
        try
        {
            //获取类对象
            Class heroClass = Class.forName("yunche.test.Hello");
            //获取构造器
            Constructor constructor = heroClass.getConstructor();
            Hello h = (Hello) constructor.newInstance();
            h.sayWorld();
        }
        catch (NoSuchMethodException e)
        {
            e.printStackTrace();
        }
        catch (InvocationTargetException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
        catch (InstantiationException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
}

3.采用clone

clone时,需要已经有一个分配了内存的源对象,创建新对象时,首先应该分配一个和源对象一样大的内存空间。

要调用clone方法需要实现Cloneable接口,由于clone方法是protected的,所以修改Hello类。

package yunche.test;
/**
* @ClassName: Hello
* @Description: 待创建的类
* @author: yunche
* @date: 2018/08/24
*/
public class Hello implements Cloneable
{
    public void sayWorld()
    {
        System.out.println("Hello world!");
    }
    public static void main(String[] args)
    {
        Hello h1 = new Hello();
        try
        {
            Hello h2 = (Hello) h1.clone();
            h2.sayWorld();
        }
        catch (CloneNotSupportedException e)
        {
            e.printStackTrace();
        }
    }
}

4.采用序列化机制

使用序列化时,要实现实现Serializable接口,将一个对象序列化到磁盘上,而采用反序列化可以将磁盘上的对象信息转化到内存中。

package yunche.test;
import java.io.*;
/**
* @ClassName: Serialize
* @Description: 序列化与反序列化对象
* @author: yunche
* @date: 2018/08/24
*/
public class Serialize
{
    public static void main(String[] args)
    {
        Hello h = new Hello();
        //准备一个文件用于存储该对象的信息
        File f = new File("hello.obj");
        try (FileOutputStream fos = new FileOutputStream(f); ObjectOutputStream oos = new ObjectOutputStream(fos); FileInputStream fis = new FileInputStream(f); ObjectInputStream ois = new ObjectInputStream(fis))
        {
            //序列化对象,写入到磁盘中
            oos.writeObject(h);
            //反序列化对象
            Hello newHello = (Hello) ois.readObject();
            //测试方法
            newHello.sayWorld();
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        }
    }
}

这些就是java创建对象的四种方式了,对这些方式还不了解的小伙伴可以参考这些方法,并在以后的编写程序的过程中熟练运用,最后大家如果想要了解更多java实例知识,敬请关注奇Q工具网。

推荐阅读:

java如何避免线程阻塞?相关方法解析

editplus怎么设置中文?设置方法讲解

java有多少个函数?什么是java函数?