super()不让我用参数调用超级构造函数

时间:2011-08-22 03:21:00

标签: java constructor super

我想调用带有两个参数的超类'构造函数,所以我调用super(arguments),但编译器说:

“类Person中的构造函数Person不能应用于给定类型;
要求:没有参数
找到:Java.lang.String,int
原因:实际和正式的参数列表长度不同“

我不知道为什么会这样。对super的调用是第一行。参数匹配(但由于某种原因不匹配编译器)。有谁知道发生了什么事?

顺便说一句,我正在使用NetBeans。最新版本。

编辑:我卸载了NetBeans,安装了Eclipse,现在一切正常。我不知道,也不会知道为什么NetBeans会给我一个错误。谢谢大家的帮助。

public class Person
 {
 private String name;
 private int age;


 public Person() { name = " "; age = 0; }
 public Person(String nm, int ag) { name = nm; age = ag; }
 }


 public class BaseballPlayer extends Person
  {
  private int homeruns;
  private double bat_avg;


  BaseballPlayer()
  {
  super();
  homeruns = 0;
  bat_avg = 0;
  }

  BaseballPlayer(String name, int age, int hr, double bavg)
  {
  super(name, age); // THIS CAUSES AN ERROR. I DON'T KNOW WHY
  homeruns = hr;
  bat_avg = bavg;
  }
 } 

6 个答案:

答案 0 :(得分:4)

顺便说一句,恕我直言,这是更好的形式,这样做:

public class Person
    ...
    public Person() { 
        this("", 0); // No-args constructor calls the arg'd version with default values
    }

    public Person(String nm, int ag) {
        name = nm;
        age = ag;
    }
    ...
}

这意味着一切都通过一个构造函数。如果你必须在构造函数中添加任何东西,那么你只有一个地方可以做更改。

答案 1 :(得分:2)

我可以想到上面代码在分隔文件中不起作用的唯一原因是发生了以下情况:

  1. 您有另一个Person班级
  2. “其他”Person类具有不同的构造函数
  3. 您的BaseballPlayer类文件导入了该文件
  4. 结论 - 检查导入语句(当类在单独的文件中时)。

    顺便说一下,当public位于同一个文件中时从BaseballPlayer移除BaseballPlayer与您尝试实现的内容不同 - Person将是packag-private访问权限,而不是公众。

    编辑:

    啊,因为我不熟悉NetBeans:

    1. 也许“原始”{{1}}类不会自动编译?

答案 2 :(得分:1)

没有理由给你一个错误。尝试做一个干净的构建。

答案 3 :(得分:1)

我正在使用NetBeans 7.0.1,它在JDK 6下作为单个文件和两个单独的文件以及两个单独的文件在单独的包中工作。

但是,有一件事我会尝试:你应该将你的BaseballPlayer构造函数声明为public。你现在写的方式,它们是默认的安全设置,它是包私有的。除非你打算让你的BaseballPlayer对象只在这个类所在的包中被实例化,并且永远不会被子类化,你应该真的把它改为public。

您正在运行的操作系统上的NetBeans可能存在一个错误,它不喜欢BaseballPlayer构造函数的默认可见性。

答案 4 :(得分:1)

我不知道这是否会解决你的问题,但值得一试。现在,您的所有类都在默认的未命名包中。 (这是当你没有包语句时会发生的情况。)

这不是推荐,因为会发生许多不好的事情。会发生什么坏事?我完全不知道,因为我总是把东西放在一个命名包中 - 正如推荐的那样。尝试将您的类放在命名包中,看看是否还有问题。

答案 5 :(得分:1)

我在查看该错误时的第一个想法是启用了Netbeans“Compile on Save”设置。虽然增量编译很多时候很方便,但它确实会不时出现一些挑剔的错误,特别是当你开始改变并添加构造函数并扩展它们时。它偶尔会混淆并开始缓存旧版本的.class文件,因为它认为新版本不会编译。

[编辑:事实上,你说在拆分之前你曾经将这两个类放在一个文件中,这足以导致命名空间冲突,导致它尝试针对错误的缓存版本进行编译] < / p>

作为故障排除步骤,请在保存时关闭编译,同时关闭任何其他自动编译设置。然后干净吧。然后手动检查目录(或项目目录)并确保.class文件确实消失了。然后再次编译。这个问题可能会自行解决。

如果这不起作用,我也会尝试命令行构建,因为这有助于缩小问题是否是netbeans配置/缓存问题,或者代码中是否存在其他错误(例如,也许你“你没有在你认为的目录中进行编译,或者你的文件名不是很正确,或者是netbeans不那么挑剔的其他东西。