java面试题1--继承--看程序写结果

来源:互联网 发布:sqlserver添加数据 编辑:程序博客网 时间:2024/04/27 17:47

面试题1:看程序写结果:

   本题考查的内容:
   
    A:成员变量 就近原则
    
    B:this和super的问题
      this访问本类的成员
      super访问父类的成员
      
    C:子类构造方法执行前默认先执行父类的无参构造方法
    
    D:一个类的初始化过程
        成员变量初始化
        默认初始化
        显式初始化
        构造方法初始化

    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); //30            System.out.println(this.num); //20            System.out.println(super.num); //10        }    }    class ExtendsTest {        public static void main(String[] args) {            Zi z = new Zi();            z.show();        }    }
结果:    fu    zi    30    20    10

题2:看程序写结果:

    A:一个类的静态代码块,构造代码块,构造方法的执行流程

   静态代码块 > 构造代码块 > 构造方法

    B:静态的内容是随着类的加载而加载

      静态代码块的内容会优先执行
    C:子类初始化之前先会进行父类的初始化

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");    }}class ExtendsTest2 {    public static void main(String[] args) {        Zi z = new Zi();    }}
结果是:    静态代码块Fu    静态代码块Zi    构造代码块Fu    构造方法Fu    构造代码块Zi    构造方法Zi

面试题3:

看程序写结果:
     A:成员变量的问题
       int x = 10; //成员变量是基本类型
       Student s = new Student(); //成员变量是引用类型
     B:一个类的初始化过程
         **成员变量的初始化
         默认初始化
         显示初始化
         构造方法初始化**
     C:子父类的初始化(分层初始化)
        先进行父类初始化,然后进行子类初始化。

class X {    Y b = new Y();    X() {        System.out.print("X");    }}class Y {    Y() {        System.out.print("Y");    }}public class Z extends X {    Y y = new Y();    Z() {        //super();        System.out.print("Z");    }    public static void main(String[] args) {        new Z();     }}


解释:这里的super()仅仅是用来占位的,实际上,必须是严格按照分层初始化的过程:
1.先初始化父类X的成员变量,即初始化成员变量Y,打印出:Y
2.初始化父类X的构造方法,打印出:X
3.父类初始化完成之后,初始化子类Z,先初始化子类的成员变量y,打印出:Y
4.接着初始化子类Z的构造方法,打印出:Z

可以看出,super()在这里不影响初始化的顺序

结果:
YXYZ

问题:

   虽然子类中构造方法默认有一个super()

   初始化的时候,不是按照那个顺序进行的。

   而是按照分层初始化进行的。

   它仅仅表示要先初始化父类数据再初始化子类数据,不受其他条件的制约。

0 0
原创粉丝点击