• 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();
            }
        }
    }
  • 相关阅读:
    天阳科技宁波银行面试题【杭州多测师】【杭州多测师_王sir】
    Python题目:给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标【杭州多测师】【杭州多测师_王sir】
    经典面试题:负责的模块,针对这些功能点你是怎么设计测试用例的?【杭州多测师】【杭州多测师_王sir】
    贷款知识面试题【杭州多测师】【杭州多测师_王sir】
    保险知识面试题【杭州多测师】【杭州多测师_王sir】
    Python笔试题:比较数组a和b 并返回相同和不同元素个数【杭州多测师】【杭州多测师_王sir】
    python笔试题:找出两个列表中相同和不同的元素(使用推导式)【杭州多测师】【杭州多测师_王sir】
    经典Python题目:一个列表或者数组去重【杭州多测师】【杭州多测师_王sir】
    想iframe嵌入页面注入css
    Pandas:删除最后一行
  • 原文地址:https://www.cnblogs.com/yunche/p/9530927.html
Copyright © 2020-2023  润新知