第一类:调用父类构造函数
1.如果子类自己没有定义任何构造函数,那么在创建子类对象的时候将调用父类无参数的构造函数。
2.如果子类定义了自己的构造函数,则在创建子类对象的时候,系统首先隐含调用父类无参数的构造函数,然后再执行自己的构造函数。
3.如果子类定义了自己的构造函数,并且显示的使用super关键字显示的调用了父类的构造函数,系统将不再隐含调用父类构造函数(直接调用)。
class Super{
int i=10;
Super(){
print();
i=20;
}
void print(){
System.out.print(i);
}
}
public class Child extends Super{
int j=30;
Child(){
super();
print();
j=40;
}
void print(){
System.out.print(j);
}
public static void main(String[] args){
System.out.print(new Child().j);
}
}
第二类:方法的重写
先了解写重写:子类在重写父类方法时,应保持与父类完全相同的方法头声明,即与父类应该有完全相同的方法名,返回值,和参数列表。
子类通过才重写,使父类方法在子类对象中不复存在的。
class Base
{
void test() {
System.out.println("Base.test()");
}
}
public class Child extends Base {
void test() {
System.out.println("Child.test()");
}
static public void main(String[] a) {
Child anObj = new Child();
Base baseObj = (Base)anObj;//相当于Base baseObj = new Child()所以baseObj 任然是子类对象。
baseObj.test();
}
}
第三类:含有静态块的继承
静态块在类加载的时候就开始执行,并且仅在第一次加载的时候执行。
class A{
static{
System.out.print("a");
}
public A (){
System.out.print("x");
}
}
class B extends A{
static{
System.out.print("b");
}
public B (){
System.out.print("y");
}
}
public class Test{
public static void main(String[] args){
A ab = new B ();//先加载A,执行static块,再加载B,执行static块,然后new B(),由于B有自己的构造函数,所以先隐含调用A的无参构造函数,输出x,然后调用B自己的构造函数,输出y
ab = new B ();//由于是一个程序,A和B都已加载完成,也就不再调用static块了,然后接着执行构造函数即可。
}
}