继承相关的面试题

来源:互联网 发布:windows xp开机蓝屏 编辑:程序博客网 时间:2024/06/07 21:48
题目一:
class Fu{int num = 10;Fu(){System.out.println("fu");}}class Zi extends Fu{int num = 50;Zi(){System.out.println("zi");}void show(){int num = 30;System.out.println(num);System.out.println(this.num);System.out.println(super.num);}}class Rectangle{public static void main(String args[]){Zi z = new Zi();z.show();}}
执行顺序:
1、类的初始化过程:成员变量的初始化,默认初始化,显示初始化,构造方法初始化。
2、Zi z = new Zi(),首先JVM在堆内存中开辟一个空间,并开始对这个内存空间进行初始化。
3、初始化过程:首先开辟空间的同时,本来是要调用 Zi 类的构造方法,但是它存在继承关系,所以首先去初始化父类的成员变量,对成员变量进行默认初始化,然后再进行显示初始化,最后调用父类的构造方法;最后到子类进行相同的操作。
4、初始化完毕之后,就把地址赋给  z,然后  z 指向 new Zi() 开辟的内存空间,z  也就可以调用 Zi 的show方法,num代表的是当前方法的局部变量,this.num代表的是当前类的全局变量num,super.num代表的是父类的num。
5、输出结果:fu,zi,30,50,10
题目二:
class Fu{static{System.out.println("父类静态代码块");}{System.out.println("父类构造代码块");}Fu(){System.out.println("父类构造方法");}}class Zi extends Fu{static{System.out.println("子类静态代码块");}{System.out.println("子类构造代码块");}Zi(){System.out.println("子类构造方法");}}class Text{public static void main(String args[]){Zi zi = new Zi();}}

执行顺序:
1、执行new Zi(),JVM开辟空间,同时为对应的内存空间进行初始化。初始化过程如下:
2、本来首先对子类进行初始化,但是子类继承父类,所以首先初始化父类,但这次不是首先初始化父类的构造方法,而是首先实行父类的静态代码块,因为静态代码块是用于初始化类的,类一旦加载,就会首先执行静态代码块。
3、执行完父类的静态代码块,就会执行子类的静态代码块,执行完子类的静态代码块就会执行父类的构造代码块,然后再执行构造方法,执行完父类的构造方法,就会在子类执行相同的操作。
4、Q:为什么会先执行构造代码块,再执行构造方法?
      A:因为构造代码块是初始化所有的对象的,而构造方法是初始化对应的对象的,比如 Zi() 只是用于zi对象的初始化。
5、Q:为什么会先执行静态代码块,然后再执行构造代码块?
      A:因为静态代码块是初始化类的,构造代码块是初始化对象的,类一旦加载就会执行静态代码块,对象一旦建立就会执行构造代码块。


题目三:
class A{B b = new B();A(){System.out.println("A的构造方法");}}class B{B(){System.out.println("B的构造方法");}}class Text extends A{B b = new B();Text(){System.out.println("Text的构造方法");}public static void main(String args[]){new  Text();}}

执行顺序:
1、main函数入口,执行new Text(),JVM为其开辟空间,然后初始化步骤如下:
2、原本是首先初始化Text类的,但是因为Text类有继承关系,所以首先对父类A进行初始化,首先对父类的成员变量进行初始化,执行new B(),也同时执行B类的构造方法,打印内容。然后才执行A类的构造方法,打印内容。最后,父类才初始化完成。
3、然后到Text子类进行初始化工作。首先执行new B(),同时执行B的构造方法,然后再往下指向,执行Text的构造方法,最后,初始化完成,程序停止。




0 0
原创粉丝点击