繁体   English   中英

Java:为什么扩展需要一个空的构造函数?

[英]Java: why does extending need an empty constructor?

我有类SearchToUser和getFilesToWord。 GetFilesToWord必须继承SearchToUser字段。 如果SearchToUser类中为空构造,则扩展有效,否则:

cannot find symbol
symbol  : constructor SearchToUser()
location: class SearchToUser
public class GetFilesToWord extends SearchToUser{
       ^
1 error
make: *** [all] Error 1

我无法理解为什么扩展需要空构造函数。

[添加]

- ALERT ERRR! 使用成分! 左边是一个“坏”的例子 - 组合VS继承

它有效,但你能发现一些弱点吗? 我可以将searchTerm设为私有,为它创建公共方法,为GetFilesToWord中的参数创建SearchToUser对象吗?

SearchToUser.java

public class SearchToUser {
   public static GetFilesToWord geader;
   public static String searchTerm;

   SearchToUser(String s){
       searchTerm=s.trim().toLowerCase();
       files=geader.getFilesToWord(s);
   }
   ...
}

GetFilesToWord.java

public class GetFilesToWord extends SearhToUser{
    public GetFilesToWord(){super(SearchToUser.searchTerm){
    ...
}

超类不需要专门的空构造函数。 子类只需要调用超类中的构造函数。 如果超类具有公共或受保护的无参数构造函数,则会自动调用它,否则您需要显式。

默认构造函数

public class Super {
}

public class Sub extends Super {
}

这里, Super指定没有构造函数,所以添加一个。 Sub相同。 以上看起来真的像这样:

public class Super {
  public Super() {
  }
}

public class Sub extends Super {
  public Sub() {
    super();
  }
}

显式无参数构造函数

public class Super {
  public Super() {
  }
}

public class Sub extends Super {
}

这是合法的。 一个构造函数被添加到Sub ,调用Super的默认构造函数。

带参数的显式构造函数

public class Super {
  public Super(int i) {
  }
}

public class Sub extends Super {
}

这是一个像你一样的编译错误。 因为Super有一个构造函数,所以编译器不会自动添加no-arg构造函数。 处理这个问题的方法是:

public class Super {
  public Super(int i) {
  }
}

public class Sub extends Super {
  public Sub() {
    super(0); // <-- explicit constructor call
  }
}

从技术上讲,它不是......但如果你没有在GetFilesToWord中显式提供显式调用超类构造函数的构造函数,Java将自动插入对无参数超类构造函数的调用。 但是如果没有无参数超类构造函数,Java就不知道为参数提供什么值,并且它不能自动插入调用。 然后,您必须使用适当的值手动调用超类构造函数。

完全需要调用超类构造函数的原因在于,以一种方式,构造GetFilesToWord的操作在其中包括构造SearchToUser的操作。 例如,如果在SearchToUser有实例变量,则在创建GetFilesToWord以及仅创建普通的SearchToUser时需要初始化它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM