1、使用new关键字 } → 调用了构造函数

这种方式,我们可以调用任意的构造函数(无参的和带参数的)。

2、使用Class类的newInstance方法 } → 调用了构造函数

使用Class类的newInstance方法创建对象。这个newInstance方法调用无参的构造函数创建对象。

3、使用Constructor类的newInstance方法 } → 调用了构造函数

和Class类的newInstance方法很像, java.lang.reflect.Constructor类里也有一个newInstance方法可以创建对象。我们可以通过这个newInstance方法调用有参数的和私有的构造函数。

4、使用clone方法 } → 没有调用构造函数

无论何时我们调用一个对象的clone方法,jvm就会创建一个新的对象,将前面对象的内容全部拷贝进去。用clone方法创建对象并不会调用任何构造函数。

要使用clone方法,我们需要先实现Cloneable接口并实现其定义的clone方法。

5、使用反序列化 } → 没有调用构造函数

当我们序列化和反序列化一个对象,jvm会给我们创建一个单独的对象。在反序列化时,jvm创建对象并不会调用任何构造函数。
为了反序列化一个对象,我们需要让我们的类实现Serializable接口

 

代码demo

 1 package javatest.demo;
 2 
 3 import java.io.Serializable;
 4 
 5 public class PrintTest implements Cloneable, Serializable {
 6 
 7     public static final long serivalVersion = 1L;
 8 
 9     private String name;
10 
11     public PrintTest() {
12         System.out.println("this is Constructor");
13     }
14 
15     public void hello() {
16         System.out.println("hello ");
17     }
18 
19     @Override
20     public int hashCode() {
21         final int prime = 31;
22         int result = 1;
23         result = prime * result + ((name == null) ? 0 : name.hashCode());
24         return result;
25     }
26 
27     @Override
28     public boolean equals(Object obj) {
29         if (this == obj)
30             return true;
31         if (obj == null)
32             return false;
33         if (getClass() != obj.getClass())
34             return false;
35         PrintTest other = (PrintTest) obj;
36         if (name == null) {
37             if (other.name != null)
38                 return false;
39         } else if (!name.equals(other.name))
40             return false;
41         return true;
42     }
43 
44     @Override
45     public String toString() {
46         return "PrintTest [name=" + name + "]";
47     }
48 
49     @Override
50     protected Object clone() throws CloneNotSupportedException {
51         // TODO Auto-generated method stub
52         return super.clone();
53     }
54 
55     public String getName() {
56         return name;
57     }
58 
59     public void setName(String name) {
60         this.name = name;
61     }
62 
63 }
测试类

相关文章: