答疑 | 面试全对,却没offer?

627 阅读5分钟

构造方法

1. 如何理解java中的构造方法?

答:顾名思义,构造方法主要用于“构造”出一个对象。平时说的,类可以产生一个对象,实际就是类通过“new + 构造方法”产生了一个对象,例如Person per = new +Person构造方法() 。

构造方法的最大特点就是,没有返回值。

构造方法具体有以下几个作用:

(1)可以通过关键字new构造出一个对象。

(2)当给对象的属性赋值时,可以用多个setter方法,也可以用构造方法一次性赋值。即,此时,构造方法相当于多个setter。

(3)单例模式的一个核心实现就是:构造方法私有化,另一个是:枚举。

(4)构造方法可以产生一个对象,并且在产生该对象前会先自动调用其父类的无参构造方法,也就是在构造方法的第一句话会默认调用super()。

(5)一个类可以有多个重载的构造方法,并且多个构造方法之间可以使用this()相互调用。但是必须有一个构造方法没有this()调用其他方法,否则会陷入死循环。

(6)一个类如果没有显示的写上任何构造方法,也jvm会给该类自动生成一个无参构造;但如果手工写了任何一个构造方法,也jvm不会再提供无参构造。因此,当我们手写了任何一个构造方法后,就建议马上写一个无参构造。

(7)在项目中,对于javabean,一般至少会写这么三个构造方法:无参构造,全参构造,除id以外的全参构造。
(8)构造方法和setter、getter、toString()等,几乎是每个实体类的标配。除了每次自己编写(或用编译器自动生成)以外,还可以使用lombok插件自动完成。也就是说,使用了lombok之后,以后就不用再写构造方法、setter等了。lombok的使用,百度谷歌随处可得,自己查一下吧。

if…else…同时执行

2.今天面试看见这个题,____处该填什么呢?(如何才能同时执行if…else…?)

填空,使得程序的运行结果是:helloworld

if (____) {
    System.out.print("hello");
} else {
    System.out.print("world");
}

答:首先说明,if…else…是不可能同时执行的,这应该是选择结构第一堂课上老师必然会讲的内容。此题属于脑筋急转弯,考察的是一种创新能力。

答这个题之前,先想想以下这行语句的输出结果是什么?

System.out.println(System.out.printf("hello"));

结果是:hellojava.io.PrintStream@12a3a380

因为输出语句最终调用的printf(“字符串”),实际是在java.io.PrintStream中的printf(“字符串”)方法,源码如下:

public class PrintStream extends FilterOutputStream
    implements Appendable, Closeable
{
    public PrintStream printf(String format, Object ... args) {
        return format(format, args);
    }
   ...
}

可见,printf()参数是字符串时,返回时是一个PrintStream对象。如果继续跟踪formar()方法,可以发现最终会返回一个不为null的PrintStream对象。因此答案来了,可以填入的值是:

System.out.printf("hello") == null

完整代码如下所示。

public static void main(String[] args) {
    if (System.out.printf("hello") == null) {
        System.out.print("hello");
    } else {
        System.out.print("world");
    }
}

if在判断的过程中已经输出了hello,但判断结果为false,因此又会输出else中的world,所以答案就是helloworld。

实际上,以上的分析都不重要。重要的是,是怎么想到在if中再嵌套一条完整语句的,这个思路是怎么产生的?因为联想到了IO流中一条非常常见的代码,如下。

while((len = in.read(buf)) != -1) { 
  ...   
}
...

面试全对,却没offer

3. 我这几天参加了几次面试,有的是笔试。自我感觉回答的都还不错,并且回去了我查了答案,感觉都对着,但为什么一份offer也没拿到?

答:个人觉得,有这么几种可能:

(1)你回答的都对,但答案过于标准,面试官可能怀疑你的答案是背诵的某个“面试宝典”。软件开发不是应试教育,不需要标准的答案。很多时候,公司更需要一种有独立思维的员工。也就是说,面试官喜欢的答案是:你的回答是独一无二的(尽可能),至少能从回答中 看到你是对这个问题有自己独到的思考,而不希望你的回答和之前N个应聘者的答案一模一样。

(2)公司只想花4k雇一个做CRUD的,而你却写着期望2W+。

(3)行业水太深了。A公司可能根本不缺人,但由于合作关系、绩效任务等等原因,不得不作为招聘方去参加一场招聘会(或者其他形式的招聘)。因此,招聘者可能根本没有仔细听你在说什么,只是想跟你随便聊几句,然后下班回家。

(4)招聘转招生。根本不是在招聘,是培训机构在招生。常用手段就是,让你做一套题,然后告诉你“你的回答太浅了”(如果你有错,就会说“你的回答太差了”)。然后告诉你“培训机构哪家强?快来到我这报名,包你毕业后这些题都会,包你拿高薪……”

(5)年龄、person类中那个boolean类型的属性(《某某法》不让说)……
(6)欢迎在评论区补充~

不过还想说一句,这些其实都不重要。因为,从我接触过的人整体来看,很多人可能都遇到过一些无语的面试经历,但最终还是符合常理的:能力强的进大厂、拿高薪,能力弱的去小公司、甚至转行。从来没有一帆风顺,只有坚持与努力。