super关键字
class Animal{
Animal(){
System.out.println("constructor Animal");
}
}
class Cat extends Animal{
Cat(){
//super();
System.out.println("constructor Cat");
}
}
public class test{
public static void main(String [] args){
Cat cat = new Cat();
}
}
在构造子类对象时,会先构造父类对象,在代码中的表示就是,先调用子类的构造函数,进入之后,编译器会在每个构造函数的开头第一句默认加上一句super(),这样就可以先构造父类对象了,但是super()也可以自己写出来,这样编译器就不会自动添加了,但是super()这句必须加在构造函数的第一句,否则报错。而且要注意,编译器默认只加上不带参数的父类构造函数,若要加上带参数的父类构造函数,必须手动加上。
讨论一下类在继承时,变量初始化和构造函数的执行顺序问题
class Var{
Var(int i){
System.out.println("Var"+i);
}
}
class Animal{
Var v1 = new Var(1);
static Var v2 = new Var(2);
Animal(){
System.out.println("constructor Animal");
}
}
class Cat extends Animal{
Var v3 = new Var(3);
static Var v4 = new Var(4);
Cat(){
super();
System.out.println("constructor Cat");
//super();
}
}
public class test{
public static void main(String [] args){
Cat cat = new Cat();
}
}
打印结果:
Var2
Var4
Var1
constructor Animal
Var3
constructor Cat
运行这个程序,首先要找到main函数,main函数在test类里面,先加载test类,再运行main函数,main函数第一句是生成一个Cat对象,因此,先要加载Cat类,在加载Cat时,发现Cat继承Animal,因此又去找Animal类,找到Animal类之后,就要初始化类,属于类的内容就是静态变量,静态方法,静态方法块,在初始化类时,会运行静态方法块和对静态变量赋值。初始化Animal之后,对Cat类初始化,初始化过程和Animal一样。全部的类初始化之后,就要开始创建对象了,创建对象首先是创建父类的对象,创建父类对象就要先初始化父类对象的非static成员变量,然后运行父类构造函数,最后就是创建子类对象,其过程和父类也一样。
java允许在子类中重载父类的函数。