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();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM