方法重载
java语言中,重载是指在同一个类中一个方法名被用来定义多个方法。如:
public void println(int i){...}
public void println(float money){...}
public void println(String name){...}
上例中使用方法名println可以定义打印输出各种数据类型的方法。
方法重载是面向对象程序语言多态性的一种形式,它实现了java的编译时多态。即在编译器在编译时刻确定具体调用哪个被重载的方法。
由于重载的方法名称都是相同的,所以在方法声明时一定要确定彼此的不同成份,以便编译器能够区分这些方法。因此java中规定重载的方法必须遵循如下原则:
- 方法的参数表必须不同,包括参数的类型或个数,以此区分不同的方法体。
- 方法的返回类型,修饰符不能用来区分重载方法的不同。
public class Test{
public static void main(String[] args){
boolean b = true;
int num = 100;
float f = 12.8f;
String s = "java test";
java.util.Date time = new java.util.Date();
System.out.println(b);
System.out.println(num);
System.out.println(f);
System.out.println(s);
System.out.println(time);
}
}
执行结果:
true
100
12.8
java test
Wed Oct 07 18:24:27 CST 2015
this
this是java使用的一个有特定意义的引用,它指向当前对象自身。
class MyDate{
private int year;
private int month;
private int day;
public MyDate(int year, int month, int day){
this.year = year;
this.month = month;
this.day = day;
}
public String getDate(){
return this.day + "-" + this.month + "-" + this.year;
}
public String yesterday(){
this.day -= 1;
return this.day + "-" + this.month + "-" + this.year;
}
}
public class ThisTest{
public static void main(String[] args){
MyDate d = new MyDate(2015, 10, 7);
String today = d.getDate();
String yesterday = d.yesterday();
System.out.println("today:" + today);
System.out.println("yesterday:" + yesterday);
}
}
执行结果:
today:7-10-2015
yesterday:6-10-2015
上例中MyDate类中的构造方法、getDate()以及yesterday()方法中的this.year,this.month,this.day指的是当前对象中的year、month和day变量。实际上,在一个对象的方法被调用执行时,java会自动给对象的变量和方法都加上this引用,指向内存堆中的对象。所以有些情况下使用this指针可能是多余的。但是在上例中this关键词却是必须的,因为在构造方法中不适用this关键字的话,作为类成员的year,month以及day变量将被隐藏,视为局部变量,将得不到预期的结果,而在getDate()以及yesterday()方法中的this指针却是多余的,可以不加。
那到底什么时候使用this指针呢?就像上面的实例,类成员变量与局部变量有重名时,要想使用类成员变量,前面就必须加this关键字,来显示的调用类成员变量。
构造方法
java中所有的类都有构造方法,用来进行该类对象的初始化。构造方法也有名称、参数和方法体以及访问权限的限制。
构造方法定义的完整格式:
[public|protected|private]<class_name>([<argumentList>]){
//方法体
}
从构造方法的定义可以发现,这类方法是非常特殊的。构造方法的特点是:
- 构造方法的名称必须与类名相同。
- 构造方法不能有返回值。
- 用户不能直接调用构造方法,必须通过关键词new自动调用它。
在给类创建实例对象时,会自动调用该类的构造方法。
类的构造方法实例:
class MyDate{
private int year;
private int month;
private int day;
public MyDate(){
//类的构造方法
year = 2015;
month = 9;
day = 10;
}
public String getDate(){
return day + "-" + month + "-" + year;
}
}
public class Test{
public static void main(String[] args){
MyDate d = new MyDate();
String today = d.getDate();
System.out.println("today:" + today);
}
}
缺省构造方法
在类的定义中可以不定义构造方法,java编译时会给没有定义构造方法的类自动加入一个特殊的构造方法,这个方法不带参数且方法体为空,称为类缺省的构造方法。用缺省构造方法初始化对象时,由系统用用默认初始值初始化对象的成员变量。各种数据类型的默认值为:
数值型 :0
boolean :false
char :'\0'
对象 :null
但是一旦在类中定义了构造方法,缺省的构造方法就不再被加到类的定义中。此时,如在程序中再使用缺省的构造方法时,将出现编译错误,所以为了避免此类错误,即使在类中定义了构造方法,通常也将入不带任何参数的构造方法。
重载构造方法
构造方法也是可以重载的,重载构造方法的目的是使类对象具有不同的初始值,为类对象的初始值提供方便。
构造方法重载实例:
class Employee{
private String name;
private int sal;
public Employee(String name1, int s){
name = name1;
sal = s;
}
public Employee(String name1){
name = name1;
}
public Employee(){
this("who ?");
}
public int getSal(){
return sal;
}
public String getName(){
return name;
}
}
public class ThisTest{
public static void main(String[] args){
Employee e1 = new Employee();
System.out.println("name is " + e1.getName() + ",Salary is " + e1.getSal());
Employee e2 = new Employee("jack", 10000);
System.out.println("name is " + e2.getName() + ",Salary is " + e2.getSal());
}
}
执行结果:
name is who ?,Salary is 0
name is jack,Salary is 10000
上例中出现的this(),表示的是调用所在类的构造方法。如
Employee e1 = new Employee();采用这样的的形式创建类的实例对象所在的类是没有定义构造方法的,而是使用缺省构造方法。所以System.out.println(“name is ” + e1.getName() + “,Salary is ” + e1.getSal());这个输出结果才会是name is who ?,Salary is 0。