这就是我遇到问题的方法.我举个例子:
package check;
public class Check {
int a,b;
Check (int i,int j) {
a = i;
b = j;
}
}
Run Code Online (Sandbox Code Playgroud)
这可以.现在我想通过扩展创建一个子类Check.所以我写道:
class V extends Check {
}
Run Code Online (Sandbox Code Playgroud)
我写完后,在Eclipse中出现了一个十字架,单击它我发现了一条消息:
implicit super constructor Check() is undefined for default constructor. Must define an explicit constructor.
Run Code Online (Sandbox Code Playgroud)
我用Google搜索了问题并添加了
V (int i, int j) {
super(i, j);
}
Run Code Online (Sandbox Code Playgroud)
Eclipse也提出了这个建议.现在我有两个问题.
class V?AFAIK,创建构造函数不是必需的,因为JAVA编译器会自动创建默认构造函数以继续其操作.同样来自消息,它似乎也需要一个默认的构造函数,但不是我写的,但正如我所说,JAVA不是自动创建的吗?V(int i, int j){ super.a=i; super.b=j}.,但我仍然遇到错误.这是为什么?这段代码不super.a=i; super.b=j一样super(i,j)吗?另外,在V类中,我可能不需要使用b,那么为什么我需要通过构造函数对其进行初始化呢?1)为什么必须在V类中使用构造函数?AFAIK,创建构造函数不是必需的,因为JAVA编译器会自动创建默认构造函数以继续其操作.同样来自消息,它似乎也需要一个默认的构造函数,但不是我写的,但正如我所说,JAVA不是自动创建的吗?
只有当您创建了Check(int i,int j)删除默认构造函数的构造函数时,才会创建默认构造函数.
如果在构造函数中没有包含对super的调用,则java会尝试super()默认调用.但是,由于父类中没有默认构造函数,因此无法执行此操作.
这种行为很好,因为您可能不需要默认构造函数; 某些变量可能必须初始化才能使对象正常运行.因此,需要有一种方法来删除默认构造函数,这是通过显式创建构造函数来完成的.
2)另一件事,我将子类中的代码更改为V(int i,int j){super.a = i; super.b = j}.但我仍然得到错误.这是为什么?这段代码不是super.a = i; super.b = j与super(i,j)相同?另外,在V类中,我可能不需要使用b,那么为什么我需要通过构造函数对它进行初始化呢?
代码
V(int i, int j){
super.a=i; super.b=j
}
Run Code Online (Sandbox Code Playgroud)
仍然没有调用父构造函数,因此变为
V(int i, int j){
super();
super.a=i; super.b=j
}
Run Code Online (Sandbox Code Playgroud)
而super()也不存在
有些调用super必须存在以"设置"对象的父部分,一直到Object(所有对象都隐含地扩展).因此,您不能仅仅因为在子构造函数中执行等效操作而省略父构造函数
| 归档时间: |
|
| 查看次数: |
204 次 |
| 最近记录: |