java中的关键字super有两种用法。
一、调用父类的构造方法,如:
class A
{
A(String s)
{
System.out.println(s)
}
}
class B extends A
{
B()
{
super("父类")
System.out.println("子类")
}
}
完整例子如下图:
二、调用父类的实例方法,如:
class A
{
void f1()
{
System.out.println("A.f1")
}
void f2()
{
System.out.println("A.f2")
}
}
class B extends A
{
void f()
{
super.f1()
f2()
}
void f2()
{
super.f2()
System.out.println("B.f2")
}
}
完整例子如下图:
你关系弄反了,应该是Son extends Father。。。你子类里面没有写构造函数是不是。。。。系统会默认调用父类的无参构造函数,但是你写了一个带参的构造函数,而且把无参的构造函数删掉了,当然会报编译错误啊目测你的代码是
public class Parent{
public Parent(String name){
}
}
public class Son extends Parent{
//如果这里不显示调用父类的无参构造函数,编译报错....
public Son(String name){
super(name) //这样才是正确地
}
}
不对。。子类默认继承父类的构造方法 子类创建对象时默认调用自身的空构造器,并在子类构造器中隐式的调用super() 即调用父类的空构造器,如果父类重载了构造器,那么子类必须初始化父类构造器否则编译错误!
class Animal{private String name
//重载父类构造器
Animal(String name){
this.name = name
}
}
class Dog extends Animal{
//必须加上
// Dog(String name){
// super(name)
// }
}
class Test{
public static void main (String[] args){
Animal a = new Dog()
//首先调用Dog空构造器 Dog(){ }构造器中第一句话为super()但父类已覆盖空构造器所以
//编译产生错误应添加子类构造器初始化父类构造器
//
}
}