前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >雷锋教你阿里面试题

雷锋教你阿里面试题

作者头像
小土豆Yuki
发布2020-06-15 17:40:41
5670
发布2020-06-15 17:40:41
举报
文章被收录于专栏:洁癖是一只狗洁癖是一只狗

雷锋教你面试题

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

1.Class.forName和classloader的区别

他们的区别是

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

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

第一步:要加载的类

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

第二步:测试结果

代码语言:javascript
复制
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类各种成员变量初始化顺序

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

老套路,上代码

第一步:父类

代码语言:javascript
复制
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";
    }
}

第二步:子类

代码语言:javascript
复制
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("洁癖测试完成-----------------------------");
    }
}

第三部:运行结果看一下

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

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

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洁癖是一只狗 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.Class.forName和classloader的区别
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档