面试_java_Java创建对象的几种方法

102 阅读1分钟

在Java中,创建对象有几种方式?一定要调用构造函数吗?

第一种:

  • 用new关键字创建对象,需要使用构造器。


第二种:

  • 反射:使用ClassnewInstance()方法。需要调用构造函数,调用的是无参构造方法。

    public class Test {
        public Test(){
            System.out.println("初始化时直接调用");
        }
    
        public static void main(String[] args) throws Exception {
            Test p = Test.class.newInstance();
            System.out.println(p);   
        }
    }
    


第三种:

  • 反射:使用Constructor类的newInstance()方法。需要调用构造函数,调用的是有参构造方法。

    import java.lang.reflect.Constructor;
    
    public class Test {
        public Test(String name) {
            System.out.println("name=" + name);
        }
    
        public static void main(String[] args) throws Exception {
            Class p1 = Class.forName("Test");
            Constructor p2 = p1.getConstructor(String.class);
            Test p = (Test) p2.newInstance("张三");
            System.out.println(p);   // name=张三
        }
    }
    

    关于反射的详解,参考本站另一篇文章:反射



第四种:

  • 克隆

    要使用clone方法, 必须先让被克隆的类实现Cloneable接口 并重写Object的clone方法。得到的对象是一个全新的对象,所以属于深克隆。此方法不需要调用构造函数。

public class Person implements Cloneable { @Override public Person clone() throws CloneNotSupportedException { return (Person) super.clone(); } }

public class Main { public static void main(String[] args) throws Exception { Person person = new Person(); Object clone = person.clone();

      System.out.println(person == clone); //false
  }

}

> 关于克隆的详解,参考本站另一篇文章:[克隆](https://hsyu.cn/2021/11/2639497952.html)
>



<br>

<br>

#### 第五种:

- 使用反序列化

此方法也不需要调用构造函数。这种方法特别耗内存。

```javascript
import org.apache.commons.lang3.SerializationUtils;
public class Main {
    public static void main(String[] args) throws Exception {
        Person person = new Person();
        byte[] bytes = SerializationUtils.serialize(person);
        Object deserPerson = SerializationUtils.deserialize(bytes);
        
        System.out.println(person == deserPerson);  //false
    }
}

关于序列化与反序列化的详解,参考本站另一篇文章:序列化与反序列化





cloud.tencent.com/developer/a… zhuanlan.zhihu.com/p/106836536