你看,沉默王二没出版书籍,可以是一名写作爱好者;沉默王三虽然出版了书籍《Web全栈开发进阶之路》,但仍然和王二是好兄弟,并没有看不起王二(从来没说过:“王二,你个渣渣,连本书都没有出版,好意思说自己是写作爱好者?”)。是不是很和谐?
Java该如何区分重载方法(毕竟参数名相同)呢?上例中,你也看到了,参数个数的不同就可以区分;另外,参数的类型和顺序(不建议使用,因为这样做会让代码难以维护,见下例)也可以用来作为区分的条件。
程序清单2-2:难以维护的方法重载(靠顺序,别这样!)
class Writer {private String name;
private int age;
public Writer(String name, int age) {
this.name = name;
this.age = age;
}
public Writer(int age, String name) {
this.age = age;
this.name = name;
}
}
03、返回当前对象引用的this关键字
在很长一段时间里,我对this关键字都避而不见,因为我搞不懂它到底在干嘛,我所使用它的场合仅限于程序清单2-1(this.name指的是类的成员变量,而name指的是当前方法的参数)。直到我遇见了jQuery(一个快速、简洁的JavaScript框架)的链式调用。
程序清单3-1:jQuery的链式调用
$("#canvas").append("我是一块抹布").show();
方法后面还能再紧跟一个方法,就好像一个胯下运球再接一个后仰跳投,超自然超连贯超燃的一连串动作,令人心情感到愉悦。这背后是什么原理呢?
程序清单3-2:jQuery的链式调用的背后
var MyJQ = function(){}
MyJQ.prototype = {
append : function(content){
console.log("添加内容");
return this;
},
show : function(){
console.log("将元素显示");
return this;
}
};
var myjq = new MyJQ();
myjq.append("我是一块抹布").show();
看完程序清单3-2之后,你就会恍然大悟,原来方法的内部返回了一个this,而这个this就是当前对象的引用;也就是说,myjq.append("我是一块抹布").show();就相当于:myjq.append("我是一块抹布");myjq.show();。
理解了jQuery的链式调用,我们来模拟一下Java当中的链式调用(写作者做完运动后去睡觉)。
程序清单3-3:Java的链式调用
class Writer {public Writer sleep() {
System.out.println("睡一觉");
return this;
}
public Writer ml() {
System.out.println("做运动");
return this;
}
public static void main(String[] args) {
new Writer().ml().sleep();
}
}
04、理想国中的Java垃圾回收
对象要想被正确使用,必须先被初始化,这是一切的开端;那么,当对象不再被使用后,它就需要被清理掉,要善始善终。假如你遇到一个面试官,他要“强行”问你关于Java垃圾回收的一些问题,你可以提前做好下面这些准备。
Q:为什么要进行垃圾回收?
A:如果不进行垃圾回收,内存迟早都会被消耗空。除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此。所以,垃圾回收是必须的。
Q:哪些内存需要回收?
A:所谓“要回收的垃圾”无非就是那些不可能再被任何途径使用的对象。
Q:Java是如何回收垃圾的?
A:深入理解 Java 垃圾回收机制
不过,在我的印象里,有一副爆笑的动态图令我印象深刻,它隐喻的是Java的垃圾回收机制。