当java中的变量已经设置为默认值时,java中的默认构造函数

时间:2016-02-25 06:04:45

标签: java constructor default

我们知道原始数据类型的默认值是由java提供的,例如:对于int,我们有0.我们在java中有一个默认构造函数,它也可以完成相同的工作。需要什么?如果java没有默认构造函数,则默认情况下任何对象的状态都是相同的。

我不是要求关于bean的答案,而是出于唯一目的,即初始化。为什么我们有一个默认的构造函数?

3 个答案:

答案 0 :(得分:2)

它不仅仅是原始数据类型初始化,而且是类成员数据类型的初始化。

例如: 当您创建类的对象而不是定义默认构造函数和任何参数化构造函数时,JVM将添加默认构造函数,该构造函数将调用其基类的构造函数以确保所有基类成员变量已初始化。

另请查看此answer了解详情。

答案 1 :(得分:1)

  

在创建对象时调用Java构造函数。它构造了值,即为对象提供数据,这就是它被称为构造函数的原因。

清楚地说构造函数为对象提供数据

class Student{  
int id;  
String name;  

void display(){System.out.println(id+" "+name);}  

public static void main(String args[]){  
Student s1=new Student();  
s1.display();  
}  
}  

输出为0 null

class Student{  
int id;  
String name;  

Student()
{
  id=1;
  name="abc";
}

void display(){System.out.println(id+" "+name);}  

public static void main(String args[]){  
Student s1=new Student();  
s1.display();  
}  
}  

在这种情况下,输出将为1 abc

  

定义默认构造函数并不是必需的,但如果您正在编写Hibernate持久化类,JPA实体或使用Spring框架来管理对象创建和布线依赖性,那么您需要小心。许多开源框架使用反射在运行时根据类的名称创建实例或对象。例如,当Hibernate使用反射创建实体实例时,它使用Class.newInstance()方法,该方法需要无参数构造函数来创建实例。它实际上相当于新的Entity()。如果在Entity类中没有找到任何参数构造函数,则此方法抛出InstantiationException,这就是为什么建议提供无参数构造函数。

Why Default or No Argument Constructor is Important in Java Class

答案 2 :(得分:0)

默认构造函数的主要目的是调用基类的构造函数。鉴于以下课程:

public class Default {

    private int result;
    private Object result1;

    public int getResult() {  return result; }
    public Object getResult1() {  return result1; }
}

导致以下反汇编的字节代码:

> javap -c Default.class
Compiled from "Default.java"
public Default {
  public Default();
    Code:
       0: aload_0
       1: invokespecial #12                 // Method java/lang/Object."<init>":()V
       4: return

  public int getResult();
    Code:
       0: aload_0
       1: getfield      #20                 // Field result:I
       4: ireturn

  public java.lang.Object getResult1();
    Code:
       0: aload_0
       1: getfield      #24                 // Field result1:Ljava/lang/Object;
       4: areturn
}

在这种情况下,默认构造函数的唯一目的是调用super()来执行超类的默认(或无参数)构造函数。尽管如此,result已初始化为0result1已初始化为null - 这是在创建实例时由运行时环境完成的。

如果任何成员显式初始化,这也是在默认构造函数中完成的:

...
private int result = 42;
...
  public Default();
    Code:
       0: aload_0
       1: invokespecial #12                 // Method java/lang/Object."<init>":()V
       4: aload_0
       5: bipush        42
       7: putfield      #14                 // Field result:I
      10: return