我正在编写一个名为LoginRequest的构造函数,它继承了一个叫做JsobObjectRequest的类(来自于Android中的Volley框架,但这与问题完全无关)
使用以下代码:
public LoginRequest(String username, String password, Response.Listener<JSONObject> responseListener, Response.ErrorListener errorListener) {
Boolean hasCredentials=(username!=null && password!=null);
int method=hasCredentials? Method.POST:Request.Method.GET;
super(method, API_URL_LOGIN, null, responseListener, errorListener);
this.username=username;
this.password=password;
}
我遇到了一个错误:在构造函数主体中,调用super()必须是第一条语句。
相反,这段代码编译得很好:
public LoginRequest(String username, String password, Response.Listener<JSONObject> responseListener, Response.ErrorListener errorListener) {
super((username!=null && password!=null)? Method.POST:Request.Method.GET, API_URL_LOGIN, null, responseListener, errorListener);
this.username=username;
this.password=password;
}
但这不是完全一样的事情吗?在两种情况下,在调用超类构造函数之前,都会进行几个微不足道的计算,这些计算是基于传递给子类构造函数的参数值的。既然编译器可以编译第二个示例,为什么不能编译第一个示例呢?
调用super构造函数必须是第一条语句的规范是否比它需要的简单化,还是我错过了什么东西?
编辑:这被错误地标记为为什么this()和super()必须是构造函数中的第一条语句?那个问题更加通用,并问为什么super()必须是第一条语句。这个问题是为什么像我发布的这种情况会破坏这些要求(并且这个问题已经得到满意的答复)。
super()
之前允许什么和不允许什么(否则我们可能会有一些代码被一个编译器接受而被另一个编译器拒绝)。这并不容易。也许可以稍微放宽限制,允许一些不调用任何方法的赋值语句,例如。但进行“彻底”的检查可能是不可行的。 - ajb