JAVA 面试题 TOP100
1. 说说JAVA中的几种基本类型,各占用多少字节? 2. String能被继承吗?为什么? 3. 说说String, Stringbuffer, StringBuilder 的区别? 4. 说一下ArrayList 和 LinkedList 有什么区别? 5. HashMap 是线程安全的吗,并发下使用的 Map 是什么? 6. 说一下讲讲类的实例化顺序过程? 7. 深入理解Java类实例化时jvm执行顺序 8. 说一下抽象类和接口的区别? 类可以继承多个类么?接口可以继承多个接口么?类可以实现多个接口么? 9. 说一下继承和聚合的区别是什么? 10. 说说什么是java的反射? 11. 反射机制常用的api有哪些? 12. 说说Java反射机制有哪常用功能? 13. 讲一下java静态代理和动态代理分别是什么? 14. Class.forName 和 ClassLoader 区别是什么? 15. 说一下动态代理实现的几种方式? 16. 说一下java 的final关键字? 17. 实现单例模式有哪些常见方法? 18. 单例模式(懒汉模式)线程安全问题 19. 如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣 20. 说说java的访问修饰符都有哪些? 21. 说一下java 深拷贝和浅拷贝区别? 22. 说说error 和 exception 的区别?CheckedException,RuntimeException 的区别? 23. 说下java的Exception的种类?经常遇到的都有哪些? 24. 说出5个常见的运行时异常? 25. java泛型的存在是用来解决什么问题? 26. 说说hashcode和equals方法有什么关系? 27. 两个不相等对象的 hashcode 是否可能相同? 28. 说说JDK 和 JRE 有什么区别 29. 说说 == 和 equals 的区别是什么 30. 说一下java 中的 Math.round(-1.5) 等于多少 31. 手撕 一个字符串反转方法 32. 说说 String 类的常用方法都有那些? 33. 抽象类必须要有抽象方法吗? 34. List、Set、Map 之间的区别是什么? 35. 如何实现数组和 List 之间的转换? 36. ArrayList 和 Vector 的区别是什么? 37. Array 和 ArrayList 有何区别? 38. 在 Queue 中 poll()和 remove()有什么区别? 39.  哪些集合类是线程安全的? 40. 迭代器 Iterator 是什么? 41. Iterator 怎么使用?有什么特点? 42. Iterator 和 ListIterator 有什么区别? 43. synchronized 和 volatile 的区别是什么? 44. 什么情况下会发生栈内存溢出? 45. 简单说说JVM内存模型? 46. 谈谈java的栈和堆的区别? 47. 说一下java堆中的数据分区? 48. 简述一下jvm的gc过程? 49. jvm内存相关常用参数有哪些? 50. 简单说下jvm的垃圾回收器有哪些? 51. jvm垃圾回收GC Root是什么? 52. 业务中常用的gvm参数有哪些? 53. 简单说说g1 和 cms 区别? 54. 请解释如下 jvm 参数的含义 55. 32位系统jvm堆内存如下哪一个设置是最大且有效的? 56. 简单讲讲 tomcat 结构,以及其类加载器流程 57. tomcat 如何调优,涉及哪些参数。 58. java 中 IO 流分为几种? 59. 简单说下Spring 加载流程? 60. 讲讲 Spring 事务的传播属性? 61. Spring 如何管理事务的?

深入理解Java类实例化时jvm执行顺序

示例代码


package com.jdk.learn;



/**

 * Created by ricky on 2017/8/25.

 *

 * 类加载器加载顺序考究

 *



 *

 */

public class ClassLoaderTest {



    public static void main(String[] args) {

        son sons=new son();

    }

}



class parent{

    private static  int a=1;

    private static  int b;

    private   int c=initc();

    static {

        b=1;

        System.out.println("1.父类静态代码块:赋值b成功");

        System.out.println("1.父类静态代码块:a的值"+a);

    }

    int initc(){

        System.out.println("3.父类成员变量赋值:---> c的值"+c);

        this.c=12;

        System.out.println("3.父类成员变量赋值:---> c的值"+c);

        return c;

    }

    public parent(){

        System.out.println("4.父类构造方式开始执行---> a:"+a+",b:"+b);

        System.out.println("4.父类构造方式开始执行---> c:"+c);

    }

}



class son extends parent{

    private static  int sa=1;

    private static  int sb;

    private   int sc=initc2();

    static {

        sb=1;

        System.out.println("2.子类静态代码块:赋值sb成功");

        System.out.println("2.子类静态代码块:sa的值"+sa);

    }

    int initc2(){

        System.out.println("5.子类成员变量赋值--->:sc的值"+sc);

        this.sc=12;

        return sc;

    }

    public son(){

        System.out.println("6.子类构造方式开始执行---> sa:"+sa+",sb:"+sb);

        System.out.println("6.子类构造方式开始执行---> sc:"+sc);

    }

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58

执行结果


 1.父类静态代码块:赋值b成功

 1.父类静态代码块:a的值1

 2.子类静态代码块:赋值sb成功

 2.子类静态代码块:sa的值1

 3.父类成员变量赋值:---> c的值0

 3.父类成员变量赋值:---> c的值12

 4.父类构造方式开始执行---> a:1,b:1

 4.父类构造方式开始执行---> c:12

 5.子类成员变量赋值--->:sc的值0

 6.子类构造方式开始执行---> sa:1,sb:1

 6.子类构造方式开始执行---> sc:12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

分析

当我们进行new实例化进行操作的时候,JVM都进行了什么操作呢?
如果你看过深入理解jvm的话,应该会比较清楚,当我们使用new关键字进行实例化的时候,会进行如下几步处理:

  • 加载
    此阶段加载类的字节码信息到内存
  • 连接
    此阶段进行验证,分配默认值,符号引用转直接引用
  • 初始化
    为成员进行赋值等

  • 使用
    对实例进行操作比如sons.toString()

对于我们的实例而言,我们只关注连接和初始化阶段即可。
连接阶段我们按照类结构(成员变量(先),方法(后)等)的顺序(不是书写顺序),先对变量进行赋默认值0,对象的话为null。

初始化的时候,就是对对象进行赋值,比如c执行initc()进行赋值。

最后