• 面试题:常见的代码执行问题


    在笔试当中经常会发现一些代码执行结果的题目,这类的试题看似简单,实则对代码的运行原理和继承、静态等知识点有透彻的了解。

    例如下面这段代码:

    package extend;  
      
    public class X {  
     Y y=new Y();  
     static{  
      System.out.println("tttt");  
     }  
     X(){  
      System.out.println("X");  
     }  
       
     public static void main(String[] args) {  
        new Z();  
      
     }  
    }  
      
    class Y{  
     Y(){  
      System.out.println("Y");  
     }  
    }  
      
    class Z extends X{  
     Y y=new Y();  
     static{  
      System.out.println("tt");  
     }  
     Z(){  
      System.out.println("Z");  
     }   
    }  
    请写出程序执行完成之后的结果。

    估计有的朋友看到这一段代码是不是一脸懵,这是因为正常的工作当中是不会出现这样的代码,十分不便于理解和分析,但是在笔试的时候就是考你对知识点的掌握程度。

    正确的答案是:

    tttt
    tt
    Y
    X
    Y
    Z

    是不是有些不知,虽然难理解,我们可以一点点解读。

    首先执行代码加载类文件时,首先执行的是静态块和静态变量(根据先后顺序执行),然后我们发现Z和X都有静态块,而且Z继承X,所以X优先于Z,父类优先与子类,所以先执行System.out.println("tttt");  在执行子类的静态块System.out.println("tt");  ,静态块执行完之后执行函数的入口main函数new Z();然后Z继承X,所以先执行X,按照代码顺序X第一行代码Y y=new Y();  所以先打印Y,然后是X,执行完之后Z中的代码Y y=new Y();  所以先打印Y,然后是Z.

    思路:

    1.加载类的时候先后顺序是:先加载父类静态块和静态变量(先后顺序)再加载子类静态块和静态变量。

    2.执行完成之后调用main方法(),new Z() 。

    3.子类继承父类,先执行父类的实例成员初始化,再执行父类构造器。

    4.执行子类的实例成员初始化,再执行子类的构造器。
    注意:静态块和静态变量只加载一次,加载过之后就不再加载

  • 相关阅读:
    剖析 GSM 加密机制以及位置更新的过程
    利用ASK/OOK 发射模块,实现信号重放
    使用RTL-SDR打开车门
    复现 360 Unicorn Team 黑科技之 HackNFC
    如何搭建并使用便携式 4G/LTE 伪基站研究移动安全
    如何利用 LTE/4G 伪基站+GSM 中间人攻击攻破所有短信验证
    黑客炼金术士 Seeker:可以攻破 4G 摸到你短信,还要为朝阳群众提供谍战工具
    如何使用HackRF做一个简单的IMSI捕获器
    招中高级web开发工程师
    ionic 动画和返回按钮
  • 原文地址:https://www.cnblogs.com/mzmy/p/11671899.html
Copyright © 2020-2023  润新知