子类继承父类的问题?
假如我定义一个子类继承了父类.那子类有没有继承父类的构造函数呢?编译不通过而如果调用父类的函数就可以了如:super( "mark ",20);请问这是为什么???谢谢
public class Person
{ String name;
int age;
Person(String n,String a)//构造函数
{
name=n;
age=a;
}
}
class Student extends Person //继承了父类.包括了函数name,age
{
public static void main(String args[])
{
}
}
------解决方案--------------------构造函数不被继承的。
但如果你在子类的构造函数中不明确写super调用,编译器会做一件事,相当于自动生成这个调用。
------解决方案--------------------在构造子类对象的时候,会调用父类的构造方法,由于你父类中定义了一个构造方法,所以父类就没有构造方法Person(),但你的子类的构造方法,如果没有显示调用父类的构造方法,那么他会去寻找默认的构造方法Person(),但是你父类Person中并没有这个方法,所以要报错.加上默认的构造方法Person()就应该可以了.
------解决方案--------------------huyc_fly() 说的已经很明白了.
就是说,父类中如果有不带参数的构造方法,那么子类也会存在一个不带参数的构造方法.当然子类中的构造方法可以写,可以不写.(其实你不写的时候系统会自动帮你写上).
一旦父类中的构造方法存在参数,那么子类必须写一带参数的构造方法.
父类有了有参构造函数就不存在默认无参构造函数了
------解决方案--------------------这是因为在你的父类中没有显式的定义超类的构造器
所以才会报错
如果在你 Person 类中 定义一个
Person(){
}
就行了
虽然子类并不继承父类的构造器
但是他会调用父类的构造器的构造器的
所有写一个默认的构造器就不会报错的
------解决方案--------------------在子类中不写构造方法,他会调用默认的构造方法,但是在父类中,你的构造方法已经覆盖了默认的构造方法,你可以试一下,
class Person
{ String name;
int age;
Person()
{
name= "name ";
age=0;
}
Person(String n,int a)//构造函数
{
name=n;
age=a;
}
}
public class Student extends Person //继承了父类.包括了函数name,age
{
public static void main(String args[])
{
Student st=new Student();
System.out.println(st.name+ "\n "+st.age);
}
}
创建子类对象时,系统会调用子类的构造方法,编译器也会自动的在子类构造方法中插入对父类构造方法的调用,当父类没有构造方法时,编译器也会自动生成一个默认的构造方法,子类也是这样,但是当你定义了父类的构造方法里,系统就不会生成默认的构造方法了,这时,自动调用就不可以了,你要用super关键字来调用父类的构造方法.
------解决方案--------------------但如果你在子类的构造函数中不明确写super调用,编译器会做一件事,相当于自动生成这个调用
---------------------------------------
这句话有一个问题,如果父类没有构造函数或者有一个没有参数的构造函数,那么编译器会在编译时在子类中自动加上一个无参数构造函数,同时调用super();
如果父类有带参数的构造函数,那么子类必要定义一个构造函数同时调用一个父类的构造函数来初始化父类,不然编译器不能确定该使用哪个构造函数来初始化弗雷,导致编译不能通过。
------解决方案--------------------说得都差不多,我就不说什么了。如果给出个默认构造器的例子就更好了。
------解决方案--------------------第一你岾上来的例子本来就错了,字符串类型的变量是不能赋给int型的
子类并没有继承父类的构造方法,而是在实例化子类对像时先调用父类的构造方法
------解决方案--------------------学习!
------解决方案--------------------呵呵,来晚了。同意ok60000的意见。