专栏首页洁癖是一只狗雷锋教你阿里面试题

雷锋教你阿里面试题

雷锋教你面试题

看到雷锋敬个礼,好人啊,今天我们来看两道阿里的面试题.

1.Class.forName和classloader的区别

他们的区别是

  1. class.forName在进行类加载的时候,不仅把.class加载到jvm中,还执行了静态代码块.
  2. loadClass仅仅是把.class加载到jvm中,没有执行静态代码块。

我们用代码验证一下我们的结论.

第一步:要加载的类

public class jiepi {
    static {
        System.out.println("洁癖1进行测试:是否执行静态代码块");
    }
}
public class jiepi2 {
    static {
        System.out.println("洁癖2进行测试:是否执行惊天代码块");
    }
}

第二步:测试结果

package com.jiepi.test;

public class JvmTestClass {

    public static void main(String[] args) throws Exception {
        System.out.println("loadclass加载实验开始");
        ClassLoader classLoader = JvmTestClass.class.getClassLoader();
        Class<?> loadClass=classLoader.loadClass("com.jiepi.test.jiepi");
       // loadClass.newInstance();
        System.out.println(loadClass.getName());
        System.out.println("loadclass记载实验结束");
        System.out.println("");
        System.out.println("========================");
        System.out.println("forname加载实验开始");
        Class<?> forName = Class.forName("com.jiepi.test.jiepi2");
        System.out.println(forName.getName());
        System.out.println("forname加载实验结束");       
    }

运行结果:
loadclass加载实验开始
com.jiepi.test.jiepi
loadclass记载实验结束

========================
forname加载实验开始
洁癖2进行测试:是否执行静态代码块
com.jiepi.test.jiepi2
forname加载实验结束

看到结果。我们的结论完全正确,有的面试官也可能问一下loadClass在什么时候执行静态代码块呢,其实当执行newInstance()时候才会执行静态代码块。

2.Java类各种成员变量初始化顺序

这道题经常在笔试题中出现,来回都是这些题,今天我们说说,

老套路,上代码

第一步:父类

package com.jiepi.test;

public class Parent {

    static {
        System.out.println("洁癖爸爸:静态代码块");
    }

    {
        System.out.println("洁癖爸爸:构造代码块");

    }

    private static String staticString = initStaticString();


    private String string = initString();

    public Parent() {
        System.out.println("构造函数");
    }

    private static String initStaticString() {
        System.out.println("洁癖爸爸:静态方法给静态变量赋值");
        return "staticString";
    }


    private String initString() {
        System.out.println("洁癖爸爸:普通方法给普通变量赋值");
        return  "String";
    }
}

第二步:子类

package com.jiepi.test;
public class Child extends Parent {    //这里的顺序和父类是不一样的,顺序不一样结果也会不一样
    private String string = initString();
    private static   staticString = initStaticString();
        {
        System.out.println("洁癖:构造代码块");
    }

    static {
        System.out.println("洁癖:静态代码块");
    }
    public Child() {
        System.out.println("洁癖:构造函数");

    }
    private String initString() {
        System.out.println("洁癖:普通方法赋值普通变量");
        return "string";
    }
    private static String initStaticString(){
        System.out.println("洁癖:静态方法给静态变量赋值");
        return "staticString";
    }
    public static void main(String[] args) {
        System.out.println("洁癖开始测试------------------------------");
        new Child();
        System.out.println("洁癖测试完成-----------------------------");
    }
}

第三部:运行结果看一下

洁癖爸爸:静态代码块
洁癖爸爸:静态方法给静态变量赋值
洁癖:静态方法给静态变量赋值
洁癖:静态代码块
洁癖爸爸:构造代码块
洁癖爸爸:普通方法给普通变量赋值
洁癖爸爸:构造函数
洁癖:普通方法赋值普通变量
洁癖:构造代码块
洁癖:构造函数

看看和你想一样吗,总结一下他的执行顺序依次如下

  1. 父类的静态变量和静态代码块,按照代码的顺序依次执行
  2. 子类的静态变量和静态代码块,按照代码的顺序依次执行
  3. 父类的普通成员变量赋值和构造代码块,按照代码的顺序依次执行
  4. 父类的构造函数
  5. 子类的普通成员变量和构造代码块,按照代码的顺序执行
  6. 子类的构造函数

只要你严格按照这个顺序,以后遇到这类题保你不会错,笔试顺利通过,稳拿offer,欢迎持续关注,后续有一系列阿里面试题讲解演示.

本文分享自微信公众号 - 洁癖是一只狗(rookie-dog),作者:洁癖汪

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试Threadlocal源码解析

    今天我们讲一下高频面试题,Threadlocal,他是JDK1.2就已经有了,他是为每一个使用该变量的线程提供独立的副本,可以做到线程间的数据隔离,每一个线程都...

    小土豆Yuki
  • Python流程控制语句详细解读 含代码

    今天我们详细的讲讲Python流程控制语句。包括if条件判断,while循环以及break和continue等。下一篇我们主讲Python中的序列,包括列...

    小土豆Yuki
  • Nginx基础篇--docker搭建nginx

    Nginx是一个轻量级,高性能,基于HTTP的,反向代理服务器,同时还是一个电子邮件服务器,Nginx是有俄罗斯人用c语言开发的,2004年10月发布第一个版本...

    小土豆Yuki
  • 《Monkey Java》课程3.2之练习课

    GitOPEN
  • JavaNote[004] - 选择结构

    这个也很好理解,其语法结构为:if(布尔表达式){语句块1} else {语句块2}

    Sam Gor
  • Java程序员的日常 —— Java类加载中的顺序

    之前说过Java中类的加载顺序,这次看完继承部分,就结合继承再来说说类的加载顺序。 继承的加载顺序 由于static块会在首次加载类的时候执行,因此下面的...

    用户1154259
  • Java基础-03(02).总结运算符、键盘录入、if语句

    (3)案例: A:比较两个数是否相等 B:获取两个数中的最大值 C:获取三个数中的最大值(if语句的嵌套) D:根据成绩输出对应的等级 E:根据月份...

    Java帮帮
  • cmd输出控制台传递的参数

    Happy、Liu
  • netty案例,netty4.1源码分析篇四《ByteBuf的数据结构在使用方式中的剖析》

    在Netty中ByteBuf是一个非常重要的类,它可以以高效易用的数据结构方式来满足网络通信过程中处理数据包内字节码序列的移动。

    小傅哥
  • python相关包无法pip时 原

    通常可以直接google “XXX for python3.5”,或者在github中找到对应的python3.5的项目,将对应的.py文件添加到python的...

    晓歌

扫码关注云+社区

领取腾讯云代金券