1.所有的对象实例化都需要调用构造函数 ,个人为是对的,因为你new时候会调用,反射的时候也会调用默认的构造函数,克隆也会,因为构造函数就是为了防止属性不能正确初始化而设计的。
2.
public class A {
static {
System.out.println(" static a");
}
{
System.out.println(" a 代码块 ");
}
public A() {
System.out.println(" a 构造函数");
}
}
public class B extends A {
static {
System.out.println(" static b");
}
{
System.out.println(" b 代码块 ");
}
public B() {
System.out.println(" b 构造函数");
}
public static void main(String[] args) {
new B();
}
}
结果:
static a
static b
a 代码块
a 构造函数
b 代码块
b 构造函数
推荐读读一下深入理解java虚拟机第七章,当时面试的时候写对了,但是还是免不了被刷的结果。
类的加载会在对象实例化之前,而子类实例化时会实例化父类,但是接口则不一样,必须使用到接口的时候才会实例化接口。
3.
public class ThreadA {
public static void main(String[] args) {
new Thread(() -> {
print();
}).run();
System.out.println("2");
}
public static void print(){
System.out.println("1");
}
}
本来以为这里考的是竞态性,没想到这里是个run,哎,只是简单的调用了这个方法,并没有开启线程。
4.自定义一个classloader
深入理解java虚拟机第七章
5.threadlocal原理
当时说了threadlocal使用安全原子类保证了线程的hashcode,并使用get和set方法进行传值,保证了线程安全的同时也减少了参数传递。需要标准答案的请百度。
6.http头
你咋不考新华字典呢?
7.安全单例模式
public class Singleton {
private static volatile Singleton singleton = null;
private Singleton() {
}
public static Singleton instance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
如果不进行双检查,在多线程竞态的时候可能会导致产生两个。
8.编写一个二分查找
http://dan326714.iteye.com/admin/blogs/2426244
9.get是否能用body进行传输
https://yanbin.blog/why-http-get-cannot-sent-data-with-reuqest-body/ 写的不错,推荐看一下