Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.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 - Fatal编程技术网

Java 为什么有人会故意实现默认构造函数的默认实现?

Java 为什么有人会故意实现默认构造函数的默认实现?,java,Java,刚刚从同事的代码中删除了以下代码: public ClassName() { super(); } 我只是想确保我做了正确的事。为什么有人会故意写这个?这正是编译器默认插入的内容,不是吗 编辑: 澄清一下:这是唯一的构造函数 而且,这不是一个骗人的问题。写这篇文章的人比我资历更高,所以我想确保在和他讨论这篇文章之前我已经涵盖了所有的可能性。如果你的代码中有一个非默认构造函数,那么编译器将不会提供一个默认的无参数构造函数。因此,如果有人试图使用newyourclass()创建对象。这将导

刚刚从同事的代码中删除了以下代码:

public ClassName() {
    super();
}
我只是想确保我做了正确的事。为什么有人会故意写这个?这正是编译器默认插入的内容,不是吗

编辑:

澄清一下:这是唯一的构造函数


而且,这不是一个骗人的问题。写这篇文章的人比我资历更高,所以我想确保在和他讨论这篇文章之前我已经涵盖了所有的可能性。

如果你的代码中有一个非默认构造函数,那么编译器将不会提供一个默认的无参数构造函数。因此,如果有人试图使用
newyourclass()
创建对象。这将导致编译错误


因此,如果存在其他构造函数,您需要确保代码中没有对该类默认构造函数的引用。

这样做可能有原因,例如如果您有非默认构造函数,但出于某种原因仍然需要默认构造函数可见(像Hibernate这样的API需要对默认构造函数的可见性)


请记住,如果您有一个非默认构造函数,并且没有实现默认构造函数,那么默认构造函数将根本不存在,无论是在类内部还是外部。

当同一个类中有一个参数化构造函数,但您也要调用默认构造函数时,您可以这样实现构造函数,because在此场景中不会提供默认构造函数

例如,你有这样的课程:

class A {
    private int a;

    public A(int a) {
        this.a = a;
    }
}
你想在某个地方使用它:

A a = new A(1);
可以,但如果您尝试使用非参数化构造函数:

A a = new A();

这将是一个错误,您将不得不将默认构造函数添加到类A中。这没有很好的技术原因。不是每个人都愿意学习默认构造函数的规则,许多人只是喜欢按照他们一贯的方式做事。我不喜欢在代码库中有这样无用的东西。但是,因为不会造成任何损坏,移除它也不是一个优先事项,所以除非需要大规模返工,否则我将不使用它


在你必须与他人分享代码的工作场所保持头脑清醒的关键是要接受你的做事方式与你不同。考虑把别人的代码的变化限制在重要的事情上。如果询问他们关于他们无意识的习惯或强迫症的特质是不起作用的,不要惊讶。

< P>其他答案已经很好了,但对于后代/乐趣来说,值得注意的是:

  • super()
    调用总是多余的
  • 如果没有其他构造函数,则生成的字节码完全相同,无论是否提供了public、no arg、super()-only构造函数
为了演示,这里有四个类:

public class Base {}

public class SubA extends Base {
  // nothing
}

public class SubB extends Base {
  public SubB() {
    // nothing in ctor
  }
}

public class SubC extends Base {
  public SubC() {
    super();
  }
}
如果在这三个子类中的每一个子类上运行
javap-c
,您将看到它们生成的字节码完全相同(当然除了它们的类名):

$javap-c SubA SubB SubC
从“SubA.java”编译而来
公共类SubA扩展了基{
公共SubA();
代码:
0:aload_0
1:invokespecial#1;//方法库。“:()V
4:返回
}
从“SubB.java”编译而来
公共类SubB扩展了基{
公共SubB();
代码:
0:aload_0
1:invokespecial#1;//方法库。“:()V
4:返回
}
从“SubC.java”编译而来
公共类SubC扩展了基{
公共分包商();
代码:
0:aload_0
1:invokespecial#1;//方法库。“:()V
4:返回
}

我显式地编写了一个与默认构造函数等效的无参数构造函数,这样我就可以提供关于无参数构造函数的注释。我发现这很有用,因为我是以契约式编程风格编写的

例如:

 /**
  * <p>
  * Construct an {@linkplain #isEmpty() empty} service directory.
  * </p>
  */
 public ServiceDirectory() {
    // Do nothing
 }
/**
*
*构造一个{@linkplain#isEmpty()empty}服务目录。
*

*/ 公共服务目录(){ //无所事事 }
还有其他构造函数吗?信息太少,无法得出任何结论。如果有其他构造函数,这很有用。为了使事情更明确,提供隐式构造函数可能是语言设计错误。如果它是唯一的构造函数且是私有的,那么这样做也很有用。这基本上意味着不允许人们直接实例化该类。如果您有一个抽象类要实例化为非抽象子类,这将非常有用。但是,您可以从构造函数中删除
super();
。(我承认我已将您接受的答案标记为“非答案”。)仅仅因为某些东西在技术上不是必需的,它仍然是有用的;例如{}以避免多行无括号-if@Richard当前位置同意,有些习惯实际上是有用的。
 /**
  * <p>
  * Construct an {@linkplain #isEmpty() empty} service directory.
  * </p>
  */
 public ServiceDirectory() {
    // Do nothing
 }