zoukankan      html  css  js  c++  java
  • 《Java基础知识》 Java创建对象的5种方法

    前言

    学习的过程,遇到很多情况需要通过非“new”的方式创建对象。

    第一种(new)

    public class Test {
    
        @Override
        public String toString() {
            return "===== Test =====";
        }
    }
    public class TestDemo {
    
        public static void main(String[] args) {
            Test test = new Test();   // 创建对象
            test.toString();
        }
    }

    第二种(class.newInstance)

    public class TestDemo {
    
        public static void main(String[] args) {
            Test test = null;
            try {
                test = (Test) Class.forName("demo.knowledgepoints.createobject.Test").newInstance();  // 创建对象
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(test.toString());
        }
    }

    第三种(Constructor.newInstance)

    public class Test {
    
        public Test(String str){
            System.out.println(str);
        }
    
        @Override
        public String toString() {
            return "===== Test =====";
        }
    }
    public class TestDemo {
    
        public static void main(String[] args) {
            try {
                Constructor<Test> constructor = Test.class.getConstructor(String.class);
                Test test = constructor.newInstance("通过构造有参构造函数创建对象");
                System.out.println(test.toString());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    运行结果:

    第四种(clone)

    需要实现Cloneable接口

    public class Test implements Cloneable {
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    
        @Override
        public String toString() {
            return "===== Test =====";
        }
    }
    public class TestDemo {
    
        public static void main(String[] args) {
            Test test = new Test();
            try {
                Test test1 = (Test)test.clone();
                System.out.println(test1.toString());
            } catch (CloneNotSupportedException e) {
                e.printStackTrace();
            }
    
        }
    }

    运行结果:

    第五种(反序列化)

    public class Test implements Serializable {
    
        private static final long serialVersionUID = 1L;
    
        @Override
        public String toString() {
            return "===== Test =====";
        }
    }
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public class TestDemo {
    
        public static void main(String[] args) {
            try {
                Test test = new Test();
                ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("demo.knowledgepoints.createobject.obj"));
                out.writeObject(test);
                out.close();
    
                ObjectInputStream in = new ObjectInputStream(new FileInputStream("demo.knowledgepoints.createobject.obj"));
                Test test1 = (Test) in.readObject();
                System.out.println(test1.toString());
                in.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    运行结果:

    序列化和反序列化详情参考:https://www.cnblogs.com/jssj/p/11766027.html

    总结

    不同的创建对象有不同的应用场景,了解这些场景对阅读源码很有帮助。

    This moment will nap, you will have a dream; But this moment study,you will interpret a dream.
  • 相关阅读:
    SoundTouch
    80211
    netsh wlan
    jest--cmd
    必须精通nuxt了,不可变,to thi
    bili实际的ssr
    vscode 调试vuetify
    【Java】 第四章 异常处理 Notes learn Ma
    Windows 下的符号链接 小示例
    Java 第一二章 配置基础 与 java 数据类型
  • 原文地址:https://www.cnblogs.com/jssj/p/14730361.html
Copyright © 2011-2022 走看看