由于自己的垃圾,没有过目不忘的能力,经常看完书合上就忘记了,答题很菜,所以持续更新笔试遇到的问题
2018.9.9京东笔试
1、类的初始化过程,父类,静态变量,静态代码块,代码块
Java程序初始化的执行顺序
Java程序初始化的执行顺序:父类静态变量—>父类静态代码块—>子类静态变量—>子类静态代码块—>父类非静态变量—>父类非静态代码块—>父类构造方法—>子类非静态变量—>子类非静态代码块—>子类构造方法
package com.practice.initClass;
/**
* 请填写类注释
*
* @author ling
* @since 2018年09月10日
*/
public class InitClass {
public static void main(String[] args) {
/* System.out.println("\n---------------SubClass.name------------------\n"+SubClass.name);
System.out.println("\n---------------SubClass.value------------------\n"+SubClass.value);
System.out.println("\n---------------SubClass.nameSuper------------------\n"+SubClass.nameSuper);
System.out.println("\n---------------SubClass.valueSuper------------------\n"+SubClass.valueSuper);*/
System.out.println("\n--------------new SubClass()-------------------\n");
SubClass subClass=new SubClass();
/*System.out.println("\n--------------new SuperClass()-------------------\n");
SuperClass superClass=new SuperClass();
System.out.println("\n--------------SuperClass superClassOfSub=new SubClass()-------------------\n");
SuperClass superClassOfSub=new SubClass();*/
}
}
class SuperClass{
final static String nameSuper="final static string of superClass";
static String valueSuper="static string of superClass";
static {
System.out.println("static blocker of superClass");
}
{
System.out.println("not static blocker of superClass");
}
SuperClass(){
System.out.println("constructor of superClass");
}
}
class SubClass extends SuperClass{
final static String name="final static string of subClass";
static String value="static string of subClass";
static {
System.out.println("static blocker of subClass");
}
{
System.out.println("not static blocker of subClass");
}
SubClass(){
System.out.println("constructor of subClass");
}
}
--------------new SubClass()-------------------
static blocker of superClass
static blocker of subClass
not static blocker of superClass
constructor of superClass
not static blocker of subClass
constructor of subClass
类初始化场景
(1) 遇到new、getstatic、putstatic或invokestatic这4条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。生成这4条指令的最常见的Java代码场景是:使用new关键字实例化对象的时候,读取或设置一个类的静态字段(被final修饰、已在编译期把结果放入常量池的静态字段除外)的时候,以及调用一个类的静态方法的时候。
(2) 使用java.lang.reflect包的方法对类进行反射调用的时候,如果类没有进行过初始化,则需要先触发其初始化。
(3) 当初始化一个类的时候,如果发现其父类还没有进行过初始化,则需要先触发其父类的初始化。
(4)当虚拟机启动时,用户需要指定一个要执行的主类(包含main()方法的那个类),虚拟机会先初始化这个主类。
只有上述四种情况会触发初始化,也称为对一个类进行主动引用,除此以外,所有其他方式都不会触发初始化,称为被动引用
代码清单1
上述代码运行后,只会输出【---SuperClass init】, 而不会输出【SubClass init】,对于静态字段,只有直接定义这个字段的类才会被初始化。
因此,通过子类来调用父类的静态字段,只会触发父类的初始化,但是这是要看不同的虚拟机的不同实现。
代码清单2
此处对象数组不会引起SuperClass的初始化
但是却触发了【[Ltest.SuperClass】的初始化,通过arr.toString()可以看出,对于用户代码来说,这不是一个合法的类名称,它是由虚拟机自动生成的,直接继承于Object的子类,创建动作由字节码指令newarray触发,此时数组越界检查也会伴随数组对象的所有调用过程,越界检查并不是封装在数组元素访问的类中,而是封装在数组访问的xaload,xastore字节码指令中.
代码清单3
public static void main(String[] args) {
System.out.println("\n---------------SubClass.nameSuper------------------\n"+SubClass.nameSuper);
}
---------------SubClass.nameSuper------------------
final static string of superClass
static blocker of superClass
对常量ConstClass.value 的引用实际都被转化为NotInitialization类对自身常量池的引用,不会触发类实例化,静态变量和静态代码块是同一时期初始化的,所以不管调用静态变量还是静态代码块都会触发对方一起初始化
public static void main(String[] args) {
System.out.println("\n---------------SubClass.valueSuper------------------\n"+SubClass.valueSuper);
}
static blocker of superClass
---------------SubClass.valueSuper------------------
static string of superClass
2、加载机制
3、二叉树的节点数计算
4、tcp/ip协议五层模型,OSI七层模型,以及作用
5、tcp三次握手,四次释放
6、排序算法的时间复杂度
https://blog.csdn.net/gane_cheng/article/details/52652705
7、spring面试相关问题
https://www.nowcoder.com/discuss/105358?type=0&order=0&pos=566&page=1