【问题标题】:Default constructor in java when variables are already set to default by java当变量已经被java设置为默认值时,java中的默认构造函数
【发布时间】:2016-02-25 06:04:44
【问题描述】:

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

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

【问题讨论】:

  • Java 中的数据类型远不止原始数据类型。这就是我们拥有默认构造函数的方式。
  • 编译器创建的默认构造函数没有解决这个问题。为此,我们手动定义了一个默认构造函数。 .....Vishrant

标签: java constructor default


【解决方案1】:

不仅仅是原始数据类型的初始化,还有类成员数据类型的初始化。

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

也请查看answer了解更多详情。

【讨论】:

  • 与超级朋友有关。我想说初始化需要什么,如果默认情况下java有默认值
  • 想想如何以及何时完成初始化,至少必须有一些地方必须分配这些默认值(即使它是原始类型),所以如果你要开始调试你当调用到达构造函数时会发现它会首先初始化类级变量,然后光标将移动到构造函数的下一行。
【解决方案2】:

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() 方法,该方法需要无参数构造函数来创建实例。它实际上等同于 new Entity()。如果在 Entity 类中没有找到任何无参数构造函数,该方法会抛出 InstantiationException,这就是为什么建议提供无参数构造函数的原因。

Why Default or No Argument Constructor is Important in Java Class

【讨论】:

    【解决方案3】:

    默认构造函数的主要目的是调用基类的构造函数。给定以下类:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-08
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-05
      相关资源
      最近更新 更多