面试环境:还是很不错的地点、环境也很好,前台不爱笑,感觉有点冷啊
过程:前台领取信息表格、笔试题,找空座位做题
笔试没答好的第一题:
PrintSequence的main方法执行后会顺序打印哪些内容
public class A { static { System.out.println(" static A"); } public A() { System.out.println(" constructor A"); } } public class B extends A { public B() { System.out.println(" constructor B "); } public void printHello() { System.out.println(" Hello B"); } } public class PrintSequence { public static void main(String[] args) { B b = new B(); b.printHello(); } }
很显然,当时我答错了,我回答的是
static A
constructor B
Hello B
而实际答案是
static A
constructor A
constructor B
Hello B
这题考的是很基本的java类加载机制,在过去一年中我也是对该问题有所涉猎的,但只是看了一些文章,没有记住具体内容,大概的思路范围在双亲委派这个名词中即可找到答案,我喜欢简单一点白话一点,以后凡是遇到这类问题的重点在于凡是new子类的时候,该子类的所有父类、父类的父类一直到object都要先被加载,加载不是new,是虚拟机把class文件解析后放入到永久带(PermSpace 当jdk<1.8)或者元空间(Metaspace 当jdk>=1.8时),然后执行父类的cinit的方法和init方法详细参见https://blog.csdn.net/w425006762/article/details/50452469,然后才是把当前对象通过new放入到堆中,我答错的原因是大概了解会执行cinit,但没有了解所有父类的init也会执行,所说的init是默认初始化方法,B类中的public B(){}方法,如果自己不写则虚拟机将java文件编译成class时会替我们放一个init,cinit则是A类中 static{}块中的内容(本文范围)。
第二个题:
写出程序打印内容
public class PrintThreadNameSequence { public static void main(String[] args) { Thread.currentThread().setName("main-thread"); MyThread mt = new MyThread(); mt.start(); } } class MyThread extends Thread { MyThread() { this.setName("new-thread-name"); this.printThreadName(); } public void printThreadName() { System.out.println(this.getThreadName()); } public String getThreadName() { return Thread.currentThread().getName(); } @Override public void run() { this.printThreadName(); } }
我的回答是,new-thread-name new-thread-name,很显然我错了,面试官告诉我我错了我当时还不信,我说实在不知道哪里错了。。。后来面试官指出没调用.start()方法之前还是在main线程之中。。。嗯。。太tm有道理了!
第三个题:
有一座桥,从桥的一边到另一边,从桥上走的人有老中少,每个人过桥所用的时间不同,老年人10分钟,中年人5分钟,儿童2分钟,少年1分钟,由于过桥的时候是在黑天,过桥需要手电筒,只有一个手电筒,一次最多能过两个人,时间以按大的那个人计算,如何用最少的时间过桥。
我回答的是 1拿着手电筒来回跑,我当时想了好久没有觉得比这更快的时间了,但想着这题不能这么简单,但也没别的思路了。。。用时是1+10 = 10过去 +1返回,1+5=5过去+1返回,1+2过去完成总用时是 10+1+5+1+2=19分钟,回来我在百度查了一下,果然有牛逼的答案是
第一步:1、2过桥,用时2分钟;
第二步:1带电筒回来,用时1分钟;
第三步:5、10过桥,用时10分钟;
第四步:2带电筒回,用时2分钟;
第五步:1、2过桥,用时2分钟;
总共17分钟。 嗯。。。果然思路清奇,正如马爸爸说的,有些人因为看到才相信,有些人因为相信所以看到。又好像某些人投资,外人看起来好像是亏的,实际人家可能精明的很,花落谁家鹿死谁手真不一定。