• java创建对象的几种常用方法


    java几种常见的创建对象的方法:

    1、使用new关键字创建对象

    2、利用java的反射机制,通过java.lang.Class或者java.lang.reflect.Constructor创建对象

    3、实现Cloneable接口,然后重写Object.clone()方法创建对象

    4、实现序列化serialiable接口,通过反序列化,ObjectInputStream的readObject()方法创建对象

    5、String str="abc" 直接由jvm创建 或者使用 字符串操作符"+"  String str1 = "a"+"bc"由jvm创建

    创建对象类TestBean.java

    package test.createObj;
    
    import java.io.Serializable;
    
    public class TestBean implements Cloneable,Serializable{
        /**
         * 
         */
        private static final long serialVersionUID = -6896355094290356656L;
        private String id;
        private String name;
        
        public TestBean(String id, String name) {
            this.id = id;
            this.name = name;
        }
        public void setName(String name) {
            this.name = name;
        }
        public String getName() {
            return name;
        }
        public void setId(String id) {
            this.id = id;
        }
        public String getId() {
            return id;
        }
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
        
        @Override
        public String toString() {
            return super.toString()+"  "+id+"  "+name;
        }
    }

    创建测试类CreateObjTest.java

    package test.createObj;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.lang.reflect.Constructor;
    
    public class CreateObjTest {
    
        /**
         * @param args
         */
        @SuppressWarnings("rawtypes")
        public static void main(String[] args) {
            //一、new关键词新建一个对象
            TestBean testbean1 = new TestBean("1","张三哈哈");
            
            //二、反射机制
            TestBean testbean2 = null;
            try {
                Class<?> clazz = Class.forName("test.createObj.TestBean");
                //当类中含有参数的构造函数 而没有无参构造函数时 会报java.lang.InstantiationException异常
                //则类里需要添加无参构造函数
    //            testbean2 = (TestBean) clazz.newInstance();
                
                //或者用反射获取类的有参构造函数   通过有参构造函数实例化对象
                Class[] paramTypes = {String.class,String.class};
                Constructor constor = clazz.getConstructor(paramTypes);
                testbean2 = (TestBean) constor.newInstance("2","李四");
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            //三、克隆   但类必须要实现Cloneable接口     并且要在类里重写clone方法
            //jdl1.6中文api是这样说的:
            //如果在没有实现 Cloneable 接口的实例上调用 Object 的 clone 方法,则会导致抛出 CloneNotSupportedException 异常。 
            //按照惯例,实现此接口的类应该使用公共方法重写 Object.clone(它是受保护的)。
            //请参阅 Object.clone(),以获得有关重写此方法的详细信息。 
            //注意,此接口不 包含 clone 方法。因此,因为某个对象实现了此接口就克隆它是不可能的。即使 clone 方法是反射性调用的,也无法保证它将获得成功。 
            TestBean testbean3 = null;
            try {
                testbean3 = (TestBean) testbean1.clone();
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
            
            //四、反序列化  但类要实现序列化接口
            ObjectOutputStream objOutStream = null;
            ObjectInputStream objInStream = null;
            TestBean testbean4 = null;
            try {
                File file = new File("C:\testbean.txt");
                if(!file.exists()){
                    file.createNewFile();
                }
    //            objOutStream = new ObjectOutputStream(new FileOutputStream(file));
    //            objOutStream.writeObject(testbean1);
                objInStream = new ObjectInputStream(new FileInputStream(file));
                testbean4 = (TestBean) objInStream.readObject();
            } catch (Exception e) {
                e.printStackTrace();
            }finally{
                if(objOutStream!=null){
                    try {
                        objOutStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(objInStream!=null){
                    try {
                        objInStream.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            
            System.out.println("testbean1:"+testbean1);
            System.out.println("testbean2:"+testbean2);
            System.out.println("testbean3:"+testbean3);
            System.out.println("testbean4:"+testbean4);
        }
    
    }

    运行结果:

  • 相关阅读:
    Maven安装
    Linux登录欢迎图案
    GC的性能指标和内存容量配置原则
    java堆结构和垃圾回收
    框架设计知识点纵览(笔记)
    .net core在Linux本地化Localization的一次填坑
    .Net Identity OAuth 2.0 SecurityStamp 使用
    CentOS 7 安装. Net Core SDK 2.0
    Docker基本命令与使用 —— Docker容器的网络连接(四)
    Docker基本命令与使用 —— Dockerfile指令与构建(三)
  • 原文地址:https://www.cnblogs.com/yinwutuan/p/4226673.html
Copyright © 2020-2023  润新知