Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中声明默认构造函数有什么意义吗?_Java_Constructor - Fatal编程技术网

在Java中声明默认构造函数有什么意义吗?

在Java中声明默认构造函数有什么意义吗?,java,constructor,Java,Constructor,在Java中声明默认构造函数有什么意义吗 class MyClass { public MyClass(){} public MyClass( T someArgs){ //somecode } } 如果您有一个非默认构造函数,那么默认构造函数不是隐式可用的。如果你的目标是不让任何人这样做,那么最好不要放一个: MyClass myClass = new MyClass(); 如果不指定其他构造函数,Java会添加一个默认的public no args构造函数,因此,如

在Java中声明默认构造函数有什么意义吗

class MyClass {
  public MyClass(){}
  public MyClass( T someArgs){
    //somecode
  }

}

如果您有一个非默认构造函数,那么默认构造函数不是隐式可用的。如果你的目标是不让任何人这样做,那么最好不要放一个:

MyClass myClass = new MyClass();

如果不指定其他构造函数,Java会添加一个默认的public no args构造函数,因此,如果需要一个构造函数并指定另一个构造函数,则需要放置一个构造函数。因此,在您的情况下,如果您这样定义您的类:

class MyClass {
  public MyClass( T someArgs){
    //somecode
  }
}
class MyClass {
  // no constructors
}
那你就不能这么做了:

MyClass a = new MyClass();
但如果它是这样定义的:

class MyClass {
  public MyClass( T someArgs){
    //somecode
  }
}
class MyClass {
  // no constructors
}
你可以

通常不使用参数构造函数来指定伪默认参数。例如:

class Switch {
  private boolean on;

  public Switch() { this(true); }
  public Switch(boolean on) { this.on = on; }
  public boolean isOn() { return on; }
  public boolean toggle() { on = !on; }
  public boolean set(boolean on) { this.on = on; return this.on; }
}

是的,当您有其他构造函数时

  • 当你想要的时候,它是必需的 创建对象而不传递任何 构造函数的参数

  • 在大多数情况下,这是必要的 反思,尤其是当你工作的时候 以一定的反射为基础 框架和库(例如序列化、Hibernate、Hessian)

  • 使用setter通常可能会 给你更好的控制。它也 可以很好地处理继承(在哪里 您需要显式地调用 所有专用的构造函数 类,因为构造函数不是 虚拟的


某些框架将要求您具有零参数/默认构造函数。例如,您需要一个构造函数作为JUnit测试用例运行类。[编辑:删除了不正确的语句]


这是由于它们使用了反射。

除了前面所有关于无参数构造函数的参数之外,它是JavaBeans的一个必需元素,因为这些Bean可以使用反射创建(特别是通过调用
Class.newInstance
)。因此,任何依赖JavaBeans的框架都将使这个无参数构造函数成为您的体系结构的一个必需部分

另外还有一个额外的好处,因为无参数构造函数可以通过让您链接setter调用来帮助引入一种流畅的接口。例如,在我工作的一家公司中,使用以下方法来定义next setter和getter:

class MyClass {
    privaite int index;
    public int getIndex() { return index; }
    public void setindex(int index) { this.index = index; }

    public MyClass withIndex(int index) {
        setIndex(index);
        return this;
    }
}
允许我以以下方式创建对象:

MyClass myObject = new MyClass().withIndex(2);

这是一种非常有用的方法,可以在不定义错误构造函数的情况下创建对象。

否。可序列化对象不需要默认构造函数。在某些情况下(是的,不是所有情况下)可以这样做:自己阅读。可序列化类不需要默认构造函数。句点。它是第一个需要默认构造函数的不可序列化超类。