方法重载是根据参数来区分的,而不是返回值,这里要注意一下参数的基本类型转型问题。如果传入的数据类型(实际参数类型)小于方法声明的心事参数类型,世界数据类型会被提升。char略有不同,如果无法找到恰好接受char参数的方法,就会把char直接提升为int类型。
public class F{
F(String s ){
}
F(int p ){
}
F(String s,int p ){
this(p);
this(s);//报错
}
void doit(){
this("a");//报错
}
}
关于this,要注意的地方就是
F(String s,int p )表明:尽管可以用this调用一个构造器,但却不能调用两个。此外,必须将构造器用置于最起始处,否则编译器会报错。
void doit()表明,除了构造器之外,编译器禁止在其他任何方法中调用构造器。
关于finalize(),一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。所以要是你打算用finalize(),就能在垃圾回收时刻做一些重要的清理工作。不知道什么时候会用,还是不要去用的好。不过可以拿来验证一些东西终结条件什么的,虽然不一定出现
package orz.xuchao.test;
class Book {
boolean checkedOut=false;
public Book(boolean checkOut) {
checkedOut=checkOut;
}
void checkIn(){
checkedOut=false;
}
protected void finalize() {
if(checkedOut)
System.out.println("Error:check out");
}
}
public class TerminationCondition{
public static void main(String[] args) {
Book novel=new Book(true);
novel.checkIn();
new Book(true);
System.gc();
}
}
<span style="font-family: Arial, Helvetica, sans-serif;">java垃圾回收用的是引用可达性算法,java 里面有相互引用的对象组, 不会导致内存泄露。</span>
<pre name="code" class="java">public class TestMultipleParameter {
static void f(Character ... args){
System.out.println(args.getClass());
System.out.println("length=>"+args.length);
}
static void g(int...args){
System.out.println(args.getClass());
System.out.println("length=>"+args.length);
}
static void f(Character c){
System.out.println(c.getClass()+"<");
System.out.println("c"+"<");
}
static void f(Character a,Character b,Character c){
System.out.println(a+b+c);
}
public static void main(String[] args) {
f('a');
f('a','b');
f();
f('a','b','c');
g(1);
g();
}
}
打印的结果是:
<pre name="code" class="java">class java.lang.Character<
c<
class [Ljava.lang.Character;
length=>2
class [Ljava.lang.Character;
length=>0
294
class [I
length=>1
class [I
length=>0
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">多参数的函数用的比较少,当多参数的函数和固定个数的重载函数冲突的情况下,只调用固定个数参数的重载函数</span>