调用超类必须是构造函数中的第一个语句,但它却不是。

17

我一直收到一个错误,说“调用super必须是构造函数中的第一条语句”。

问题在于它确实是我构造函数中的第一条语句。

public void CheckingAccountCustomer(int a){
    super(n, p, b);
    accountNo = a;
}

这里也是我的超类。

public void customer(String n, int p, double b){
    name = n;
    pin = p;
    balance = b;
}

我在这里做错了什么?


2
有趣的是,由于这些不是构造函数,对super()的调用试图从子类的方法中调用父类的构造函数。错误消息显示“它不是子类构造函数中的第一行。” 这是正确的,但并不是非常有帮助。也许像“在构造函数中调用super”这样的消息会更好。 - Lee Meador
我绝对没有想到会这么快得到答案。当然,这只是一个简单的修复,而我太糊涂了,没能看到。但还是要感谢大家。 - Phil Meyer
6个回答

38
这段代码。
public void customer(String n, int p, double b){

不是构造函数。 构造函数没有返回类型,例如void。 假设您的类名为customer:

public customer(String n, int p, double b){

这也适用于 CheckingAccountCustomer


2
请注意,虽然 customer(小写c)是一个有效的类名,但这种命名方式并不被推荐。按照惯例,类名必须以大写字母开头(Customer),而方法名则以小写字母开头。 - ADTC

8
public void CheckingAccountCustomer(int a){

这不是一个构造函数,因为它声明了一个void的返回类型。它只是与类名相同的一个方法。去掉返回类型即可。

public CheckingAccountCustomer(int a){

6
如果您只是改变措辞为“你说那是构造函数?这才是构造函数!”我将会点赞您曾经所作的每一个回答。 - christopher
1
@ChrisCooney:我希望我和你一样聪明! :) - Hovercraft Full Of Eels
@PhilMeyer:别难过。我敢打赌,我们大多数人在刚开始的时候都会被这些“伪构造函数”绊倒。但我敢保证你再也不会犯同样的错误了。 - Hovercraft Full Of Eels

3
public void CheckingAccountCustomer(int a)

这是一个方法而不是构造函数,因为它有返回类型。


2

构造函数永远不会返回任何东西(无论是void还是Object类型)。

public void CheckingAccountCustomer(int a){
    super(n, p, b);
    accountNo = a;
}

这不是一个构造函数。


2
构造函数用于创建该类的实例,因此如果允许用户更改返回类型,这是没有意义的(也可能很危险)。这就是为什么构造函数没有返回类型的原因。
正如其他人已经回答的那样,去掉返回类型,它就成为了构造函数。

0

确保你的“构造函数”真的是一个构造函数。

在 Java 中有大量的样板代码,令我惊讶的是为什么构造函数没有一个“构造函数”关键字。我的意思是,Java 不会因为过于冗长而出现问题,但它喜欢在应该详细说明的地方变得简洁。

//:WRONG://

@Service
public class      EmployeeServiceImpl 
       implements EmployeeServiceInterface
{

    private EmployeeRepository employeeRepository ;

    /** Constructor **/

    public EmployeeServiceImpl saveEmployee(
        EmployeeRepository employeeRepository
    ){
        super(); //:No blank line allowed? ://
        this.employeeRepository = employeeRepository ;

    }

}

//:固定的://

@Service
public class      EmployeeServiceImpl 
       implements EmployeeServiceInterface
{

    private EmployeeRepository employeeRepository ;

    /** Constructor **/

    public EmployeeServiceImpl(
        EmployeeRepository employeeRepository
    ){
        super(); //:No blank line allowed? ://
        this.employeeRepository = employeeRepository ;

    }
}

因为Java允许重载,所以它没有发现这个错误。因为我的构造函数正好在下面:

@Override
public EmployeeDAO saveEmployee( EmployeeDAO employee ){

        return employeeRepository.save( employee ) ;

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接