zoukankan      html  css  js  c++  java
  • java基础面试题1--继承--看程序写结果

    面试题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()

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

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

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

  • 相关阅读:
    Ubuntu 12.10 安装 jdk-7u10-linux-x64.tar.gz(转载)
    Android-- FragmentStatePagerAdapter分页(转载)
    Windows下安装Cygwin及包管理器apt-cyg(转)
    Androidi性能优化之多线程和同步
    Androidi性能优化之高效使用内存
    综合面试---常问知识点
    路由器
    域名系统
    IP地址与子网掩码
    网络层使用的协议
  • 原文地址:https://www.cnblogs.com/shiguangmanbu2016/p/5932836.html
Copyright © 2011-2022 走看看