1.请问下面程序的输出结果是什么?
class Fu{
public int num = 125;
public Fu(){
System.out.println("fu");
}
}
class Zi extends Fu{
public int num = 256;
public Zi(){
System.out.println("zi");
}
public void show(){
int num = 512;
System.out.println(num);
System.out.println(this.num);
System.out.println(super.num);
}
}
public class Test {
public static void main(String[] args) {
Zi z = new Zi();
z.show();
}
}
答案:
fu
zi
512
256
125
分析:
创建Zi的对象之后系统会先调用Zi的父类Fu中的构造方法,所以先打印了fu
之后系统调用Zi中的构造方法,打印出zi
在show方法里面有个局部变量num=512,第一行打印num,调用的是局部变量,结果是512
通过this调用了成员变量num,打印出256
通过super调用父类中的num,打印出125
2.请问下面程序输出的结果是什么?
public class Test2_Extends {
public static void main(String[] args) {
Zi z = new Zi();
}
}
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");
}
}
答案:
静态代码块Fu
静态代码块Zi
构造代码块Fu
构造方法Fu
构造代码块Zi
构造方法Zi
分析:
1.系统将Fu.class和Zi.class分别加载到方法区的内存里面,静态代码会随着.class文件一块加载到方法区里面,所以先打印出了静态代码块中的内容
2.构造代码块优先于构造方法执行,父类初始化之前,所以打印出父类中的构造代码块和构造方法中的内容。
评论区