JAVA创建对象的五种方式

最近在学习JAVA知识,通过网上翻看资料,发现原先有的理解不深的东西,渐渐明白了些。对象的使用,在编写软件过程中是必不可少的,不知道大家有没和我一样,几乎都是使用new来创建。那么,问题来了,JAVA有几种创建对象 的方式呢?

  • 使用new关键字创建。
  • 使用Class的newInstance()方法,比如Person类,创建对象可以使用,但是下面的两种方式不能调用private构造函数,且构造对象的类中必须包含无参构造函数,否则会报错。

    public class person  {
        /**
         *
         */
        private static final long serialVersionUID = 10L;
        String name = "Jack";
        public person(){
            this.name = name + " ma";
            System.out.println("construct Person");
        }
    
        private person(int a,int b) {
            System.out.println("a:"+a+ " b:" + b);
        }
        @Override
        public String toString() {
            return name;
        }
    
    }
    
    方法一
    //这里的testReflect为包名,Person类在此包下
    Class clazz = Class.forName("testReflect.person ");
    person p = (person ) clazz.newInstance();
    
    方法二
    person p =person .class.newInstance();
  • 使用Constructor类的newInstance方法,此方法属于反射,可以调用任何作用域的构造函数,private也可以,且创建对象的类构造函数可以任意。

    //调用无参构造函数 ,方式一
    person p = person.class.getDeclaredConstructor().newInstance();
    //调用无参构造函数 ,方式二
    Constructor c1=person.class.getDeclaredConstructor();
    c1.setAccessible(true);
    person p=(person)c1.newInstance();  

    这里大家思考下,在调用无参构造函数时,方式一和方式二有什么区别? 大家应该看到了c1.setAccessible(true); 这句代码吧,查看方法的定义包含如下:A value of true indicates that the reflected object should suppress Java language access checking when it is used,意思是为true的时候禁止验证授权,换句话的理解就是,private的无参构造也可以调用。这就是方式一和方式二的区别,方式一若private作用域修饰,则会报错。

    //调用有参构造函数
    Constructor c1=person.class.getDeclaredConstructor(new Class[] {int.class,int.class});
    或
    Constructor  c1=person.class.getDeclaredConstructor(int.class,int.class);
    • public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes)
                                            throws NoSuchMethodException,
                                                   SecurityException
      • Parameters:
        parameterTypes - the parameter array
        Returns:
        The Constructor object for the constructor with the specified parameter list 
        传入参数为数组。
  • 使用Clone的方法:无论何时我们调用一个对象的clone方法,JVM就会创建一个新的对象,将前面的对象的内容全部拷贝进去,用clone方法创建对象并不会调用任何构造函数。要使用clone方法,创建对象的类必须实现Cloneable接口并实现其定义的clone方法。关于clone可参考我转载的JAVA深复制与浅复制
  • 使用反序列化:当我们序列化和反序列化一个对象,JVM会给我们创建一个单独的对象,在反序列化时,JVM创建对象并不会调用任何构造函数。为了反序列化一个对象,对应类需实现Serializable接口,附上一段具体实现代码。

    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    public class People implements Serializable{
        private String name;
        public People(){
            this.name = "6点A君";
            System.out.println("construct people");
        }
        @Override
        public String toString() {
            return this.name;
        }
    
        public static void main(String[] args) {
            People p = new People();
            System.out.println(p);
            ObjectOutputStream oos = null;
            ObjectInputStream ois = null;
            try {
                FileOutputStream fos = new FileOutputStream("test.out");
                oos = new ObjectOutputStream(fos);
                oos.writeObject(p);
                oos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            People p1;
            try {
                FileInputStream fis = new FileInputStream("test.out");
                ois = new ObjectInputStream(fis);
                p1 = (People)ois.readObject();
                System.out.println(p1);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

原文地址:https://www.cnblogs.com/gudaozi/p/8353600.html

时间: 2024-11-05 22:34:52

JAVA创建对象的五种方式的相关文章

Java创建对象的4种方式?

 [Java创建对象的4种方式?] 1)通过new语句实例化一个对象 2)通过反射机制创建对象 3)通过clone()方法创建一个对象  (复制) 4)通过反序列化方式创建对象

Java中创建对象的五种方式

我们总是讨论没有对象就去new一个对象,创建对象的方式在我这里变成了根深蒂固的new方式创建,但是其实创建对象的方式还是有很多种的,不单单有new方式创建对象,还有使用反射机制创建对象,使用clone方法去创建对象,通过序列化和反序列化的方式去创建对象.这里就总结一下创建对象的几种方式,来好好学习一下java创建对象的方式. 一.使用new关键字 这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的). 比如:Student student = n

java创建对象的四种方式

java程序中对象的创建有四种方式: ● 调用new语句创建对象,最常见的一种 ● 运用反射手段创建对象,调用java.lang.Class 或者 java.lang.reflect.Constructor 类的newInstance()实例方法 ● 调用对象的clone()方法 ● 运用序列化手段,调用java.io.ObjectInputStream 对象的 readObject()方法. 下面分别实例讲述 一.new语句创建 ?// 使用java语言的关键字 new 创建对象,初始化对象数

Java键入的五种方式 ----

package com.test.Log4j; import java.io.BufferedReader; import java.io.Console; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; import javax.swing.JOptionPane; import junit.framework.TestCase; public class Input

Java创建对象的几种方式

(1) 用new语句创建对象,这是最常见的创建对象的方法. (2) 运用反射手段,调用java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法. (3) 调用对象的clone()方法. (4) 运用反序列化手段,调用java.io.ObjectInputStream对象的 readObject()方法. (1)和(2)都会明确的显式的调用构造函数 :(3)是在内存上对已有对象的影印,所以不会调用构造函数 :(4)是从文件中

java 创建对象的两种方式

一: Object object = new Object(); 二: public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException { //可以通过映射的方式来获取 DemoTest2 myobject = (DemoTest2)Class.forName("DemoTest2").newInstance(); m

Java中创建对象的几种方式

Java中创建对象的五种方式: 作为java开发者,我们每天创建很多对象,但是我们通常使用依赖注入的方式管理系统,比如:Spring去创建对象,然而这里有很多创建对象的方法:使用New关键字.使用Class类的newInstance方法.使用Constructor类的newInstance方法.使用Clone方法.使用反序列化. 使用new关键字:这是我们最常见的也是最简单的创建对象的方式,通过这种方式我们还可以调用任意的够赞函数(无参的和有参的).比如:Student student = ne

五种方式让你在java中读取properties文件内容不再是难题

一.背景 最近,在项目开发的过程中,遇到需要在properties文件中定义一些自定义的变量,以供java程序动态的读取,修改变量,不再需要修改代码的问题.就借此机会把Spring+SpringMVC+Mybatis整合开发的项目中通过java程序读取properties文件内容的方式进行了梳理和分析,先和大家共享. 二.项目环境介绍 Spring 4.2.6.RELEASE SpringMvc 4.2.6.RELEASE Mybatis 3.2.8 Maven 3.3.9 Jdk 1.7 Id

Java反射获取class对象的三种方式,反射创建对象的两种方式

Java反射获取class对象的三种方式,反射创建对象的两种方式 1.获取Class对象 在 Java API 中,提供了获取 Class 类对象的三种方法: 第一种,使用 Class.forName 静态方法. 前提:已明确类的全路径名. 第二种,使用 .class 方法. 说明:仅适合在编译前就已经明确要操作的 Class 第三种,使用类对象的 getClass() 方法. 适合有对象示例的情况下 package com.reflection; /** * Created by Liuxd