一个类当没有“带参数的构造方法”时,“不带参数的构造方法”可有可无(这里假设你的构造方法入abstract method一样什么也不做),但如果有“带参数的构造方法”,那么“不带参数的构造方法”会被自动销毁,需要使用时,要重新定义。例1:
Public class A {
A(){} /* 可有可无 */
public static void main(String args[]){
A a=new A(); /* 当构造方法A没有定义时,程序仍可以运行 */
}
}例2:
Public class A {
/* A(){} */ /* 不可无 */
A(int i){}; public static void main(String args[]){
A a=new A(); /* 由于该类有“带参数构造函数,默认构造函数被注销,因此这里会出错,改正是把 A(){}的注释去掉 */ }
}当一个类继承于另一个类,为该类建立一个对象时,编译器会自动为该类的所有父类也建立对象,但这些对象是隐含的,用户并不可见,因此,如果基类(含有子类的类)没有”不带参数的构造函数“而拥有”带参数的构造函数“,那么”不带参数的构造函数“就被销毁,因此该类的子类的构造函数必须为其父类传送一个参数,告诉父类的”带参数构造函数“以在后台建立父类的对象,否则会出错。例1:
Class A {
A(int i){...} /* 带参构造函数 */
}Class B extends A {
B(){...}
public static void main(String args[]){
B b=new B();
} /*程序出错,因为在为B建立对象时,编译器会自动为其父类A建立隐含对象,由于A的构造函数带参数,那么如果在B中的构造函数并没有告诉A应该传递一个什么参数,编译时就会出错,修改请看例2 */}例2 (仅对例1的Class B 部分进行修改)
Class B extends A {
B(){
int i=0;
super(i); /* 此行告诉父类A,应该传递一个什么参数给他,这里传0 */
} ...
}或者可以对父类A的参数作动态赋值,请看例3例3
Class B extends A {
B(int i){
super(i); /* 此行告诉父类A,应该传递一个什么参数给他,这里传一个动态值,由B对象初始化时决定 */
} ...
}
Public class A {
A(){} /* 可有可无 */
public static void main(String args[]){
A a=new A(); /* 当构造方法A没有定义时,程序仍可以运行 */
}
}例2:
Public class A {
/* A(){} */ /* 不可无 */
A(int i){}; public static void main(String args[]){
A a=new A(); /* 由于该类有“带参数构造函数,默认构造函数被注销,因此这里会出错,改正是把 A(){}的注释去掉 */ }
}当一个类继承于另一个类,为该类建立一个对象时,编译器会自动为该类的所有父类也建立对象,但这些对象是隐含的,用户并不可见,因此,如果基类(含有子类的类)没有”不带参数的构造函数“而拥有”带参数的构造函数“,那么”不带参数的构造函数“就被销毁,因此该类的子类的构造函数必须为其父类传送一个参数,告诉父类的”带参数构造函数“以在后台建立父类的对象,否则会出错。例1:
Class A {
A(int i){...} /* 带参构造函数 */
}Class B extends A {
B(){...}
public static void main(String args[]){
B b=new B();
} /*程序出错,因为在为B建立对象时,编译器会自动为其父类A建立隐含对象,由于A的构造函数带参数,那么如果在B中的构造函数并没有告诉A应该传递一个什么参数,编译时就会出错,修改请看例2 */}例2 (仅对例1的Class B 部分进行修改)
Class B extends A {
B(){
int i=0;
super(i); /* 此行告诉父类A,应该传递一个什么参数给他,这里传0 */
} ...
}或者可以对父类A的参数作动态赋值,请看例3例3
Class B extends A {
B(int i){
super(i); /* 此行告诉父类A,应该传递一个什么参数给他,这里传一个动态值,由B对象初始化时决定 */
} ...
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货