黑马程序员技术交流社区
标题:
【黑马程序员】继承中的面试题
[打印本页]
作者:
huburt
时间:
2016-5-24 10:18
标题:
【黑马程序员】继承中的面试题
看程序写结果1
class Fu{
public int num = 10;
public Fu(){
System.out.println("fu");
}
}
class Zi extends Fu{
public int num = 20;
public Zi(){
System.out.println("zi");
}
public void show(){
int num = 30;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
class Test1_Extends {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
看程序写结果2
class Fu {
static {
System.out.println("静态代码块Fu");
}
{
System.out.println("构造代码块Fu");
}
public Fu() {
System.out.println("构造方法Fu");
}
}
class Zi extends Fu {
static {
System.out.println("静态代码块Zi");
}
{
System.out.println("构造代码块Zi");
}
public Zi() {
System.out.println("构造方法Zi");
}
}
Zi z = new Zi(); 请执行结果。
复制代码
结果1:
fu
zi
30
20
10
分析1:
子类空参构造方法默认调用父类的空参构造方法;
子类中有 与 父类中成员变量 同名的变量时 ,调用此变量默认采用就近原则;
使用this. 调用子类的成员变量;
调用super.调用父类的成员变量;
结果2:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
分析2:
创建子类对象时,jvm会先后把父类的class文件和子类的class文件加载进内存,加载的同时会执行静态代码块;
然后调用构造方法创建对象,java中是分层初始化:先初始化父类,再初始化子类;
所以先走父类构造方法,发现有构造方法就先执行,再执行构造方法,随后执行子类的构造
其实只要记住一句话:现有父再有子!
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2