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.构造代码块优先于构造方法执行,父类初始化之前,所以打印出父类中的构造代码块和构造方法中的内容。
        
      
        
      
评论区