java自编面试题,自己做错的。
-
try、catch执行顺序最终返回什么?
public static void main(String[] args) { int[] a = {1,2,3}; try { System.out.println(1); int i = a[3]; System.out.println(2); } catch (ArrayIndexOutOfBoundsException e2) { System.out.println(3); } catch (Exception e) { System.out.println(4); } finally { System.out.println(5); } }
-
类加载顺序,最终返回什么
class Parent { static { System.out.println("Parent static block"); } { System.out.println("Parent instance block"); } Parent() { System.out.println("Parent constructor"); } } class Child extends Parent { static int staticVar1 = new Child().init(); // 静态变量 new 实例 static int staticVar2 = new Child().init(); static { System.out.println("Child static block"); } { System.out.println("Child instance block"); } Child() { System.out.println("Child constructor"); } int init() { System.out.println("Child instance init"); return 0; } } public class Main { public static void main(String[] args) { new Child(); } }
//返回Parent static block // 父类类加载阶段(仅一次) // 静态变量1
Parent instance block // staticVar1 初始化时的父类实例块 Parent constructor // staticVar1 初始化时的父类构造函数 Child instance block // staticVar1 初始化时的子类实例块 Child constructor // staticVar1 初始化时的子类构造函数 Child instance init // staticVar1 的 init() 方法
// 静态变量2 Parent instance block // staticVar2 初始化时的父类实例块 Parent constructor // staticVar2 初始化时的父类构造函数 Child instance block // staticVar2 初始化时的子类实例块 Child constructor // staticVar2 初始化时的子类构造函数 Child instance init // staticVar2 的 init() 方法
Child static block // 子类类加载阶段的静态代码块(仅一次) Parent instance block // main 中 new Child() 的父类实例块 Parent constructor // main 中 new Child() 的父类构造函数 Child instance block // main 中 new Child() 的子类实例块 Child constructor // main 中 new Child() 的子类构造函数//修改顺序1
class Child extends Parent { Child() { System.out.println("Child constructor"); } int init() { System.out.println("Child instance init"); return 0; }
static int staticVar1 = new Child().init(); // 静态变量 new 实例
static { System.out.println("Child static block"); } { System.out.println("Child instance block"); }
static int staticVar2 = new Child().init();
}
Parent static block
Parent instance block
Parent constructor
Child instance block
Child constructor
Child instance init
Child static block
Parent instance block
Parent constructor
Child instance block
Child constructor
Child instance init
Parent instance block
Parent constructor
Child instance block
Child constructor//修改顺序2
class Child extends Parent { Child() { System.out.println("Child constructor"); } int init() { System.out.println("Child instance init"); return 0; }
static { System.out.println("Child static block"); } { System.out.println("Child instance block"); }
static int staticVar1 = new Child().init(); // 静态变量 new 实例
static int staticVar2 = new Child().init();
}
Parent static block
Child static block
Parent instance block
Parent constructor
Child instance block
Child constructor
Child instance init
Parent instance block
Parent constructor
Child instance block
Child constructor
Child instance init
Parent instance block
Parent constructor
Child instance block
Child constructorpublic class Main { public static void main(String[] args) { new Parent(); } }
返回
Parent static block
Parent instance block
Parent constructor-
类加载顺序:父类先于子类加载(静态初始化)
-
静态初始化顺序:按代码书写顺序执行
-
实例初始化顺序:
-
父类实例块 → 父类构造器
-
子类实例块 → 子类构造器
-
-
-
java对象的创建方式是什么,从而完成对象初始化的
-
对象创建过程中是如何处理循环引用,从而完成对象初始化的?
- 刚开始A对象创建B对象的时候,A对象引用的是B对象的文件描述符。并不是对象。所以刚开始new对象成员变量出来的是null
-
双亲委派机制,懂吧~ 那什么情况下需要破坏它,懂吗?
- 快速失败和安全失败区别
-
- 安全失败:在读写复制集合,迭代器只会读旧的集合,修改会新建集合,所以不会出现快速失败的报错。
-
-
-
-
new String("abc")创建了多少个对象?
-
-
equals()和== 与 重写equals()为什么要重写hashcode
-
hash集合的新增一个对象的规则:为了效率,新插入对象的hashcode取模计算出一个地址集合下标地址,如果地址不存在对象直接插入,如果该地址存在对象,调用equals比较,相同覆盖,不相同进行散列(开放地址法,拉链法);
上述逻辑就是满足java经典的判断【两个对象相同,hashcode必然相同】【hashcode相同,两个对象不一定相同】 -
重写equals不重写hashcode会导致,两个equalsb比较相同的对象,但是hashcode不相同相同,hashcode不相同,永远无法覆盖对象的值,hash集合就用不了
-