构造函数:
在定义类时,可以使用构造函数定义对象建立的初始流程。构造函数是与类名称同名,无须声明返回类型的方法。例如:
package hello;
public class LoadDemo {
private int a;
private String txt;
public LoadDemo(int a,String txt) {
this.a=a;
this.txt=txt;
}
}
如果这样建立LoadDemo对象,成员a与txt会初始两次
LoadDemo ld=new LoadDemo(8, "GG");
创建对象时,数据成员就会初始化,如果没有指定初始值,则会使用默认值初始化。默认值表:
数据类型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0D |
char | \n0000 |
boolean | false |
类 | null |
所以使用new创建对象时,a与txt分别先初始为0与nu11,之后会再通过构造函数流程,设定为构造函数参数的值。如果定义类时,没有撰写任何构造函数,编译程序会自动加入一个无参数、内容为空的构造函数。
正因为编译程序会在你没有撰写任何构造函数时,自动加入默认构造函数( Default Constructor),所以在没有撰写任何构造函数时,也可以这样以无自变量方式调用构造函数
LoadDemo ld=new LoadDemo();
只有编译程序自动加入的构造函数,才称为默认构造函数,如果自行撰写无参数、没有内容的构造函数,就不称为默认构造函数了。虽然只是名词定义,不过要区别一下两者的不同。
如果已经撰写了构造函数,编译程序就不会自动建立默认构造函数。即上面那样已经撰写过就不可以用
LoadDemo ld=new LoadDemo();
创建对象。
方法重载
视使用情境或条件的不同,创建对象时也许希望有对应的初始流程。可以定义多个构造函数,只要参数类型或个数不同,这称为重载( Overload)构造函数。例如:
public LoadDemo(int a) {
if(a>0) {
this.a=a;
}
}
public LoadDemo(int a,String txt) {
if(a>0) {
this.a=a;
}
if(txt!=null) {
this.txt=txt;
}
}
在这个代码段中,创建时有两种选择:一是使用 new Some(10)的方式,二是使用newome(10," “some text”)的方式。
有些场合建议,如果定义了有参数的构造函数,也可以加入无参数的构造函数,即使内容为空也无所谓,这是为了日后使用上的弹性例如,运用反射(Reflcction)机制生成对象的需求,或者继承时调用父类构造函数时的方便。
定义方法时也可以进行重载,可为类似功能的方提供统一名称,但根据参数类型或个数的不同调用对应的方法。以 string类为例,其 valueof()方法就提供了多个版本 :
public static String valueOf(boolean b)
public static String valueOf(char c)
public static String valueOf(int i)
public static String valueOf(char[] data)
public static String valueOf(char[] data,int offset,int count)
public static String valueOf(Object obj)
虽然调用的方法名称都是 valueof(),但根据传递的自变量类型不同,会调用对应的方法。例如,调用 String. values(10)因为10是int类型,所以会执行 valueof(inti)的版本,若是 string.. valueof(10.12),因为10.12是 double类型,会执行 valueof(double d)的版本。方法重载让程序设计人员不用苦恼方法名称的设计,可用一致的名称来调用类似功能的方法,方法重载可根据传递自变量的类型不同,也可根据参数列个数的不同来设计方法重载。例如:
public class Someclass
public void somemethod (){
}
public void somemethod(int i){
}
public void somemethod(float f){
}
public void somemethod(int i, float f){
}
注意:返回值类型不可作为方法重依据,例如以下方法重载并不正确,编译程序会将两个 somemethod()视为重复定义而编译失败:
public class Some{
public int somemethod(int i){
return 0;
}
public double somemethod (int i){
return 0.02;
}
}
在JDK5之后使用方法重载时,要注意自动箱、拆箱问题:
public LoadDemo(int a) {
out.println("int");
}
public LoadDemo(Integer integer) {
out.println("integer");
}
LoadDemo ld=new LoadDemo(8);显示int。
只有这样明确指出LoadDemo ld=new LoadDemo(new Integer(1));显示integer。