Overload)与重写(Overwrite/Override)都是针对方法来说的,那这两种机制有什么好处呢?
重载——同样的一个方法能够根据输入数据的不同,做出不同的处理。【有不同的参数列表(静态多态性)】
重写——当子类继承自父类的相同方法,输入数据一样,但要做出有别于父类的响应时,就需要重写父类的方法。即在子类中重写该方法【相同参数,不同实现(动态多态性)】
用个toy program应该更好理解一些,看完程序之后建议读者应该先想一想输出结果是什么。
1. Overload:比较不同类型的两个数的大小,把大的那个数输出。
public class TestOverload{
void max(int a,int b){
System.out.println(a>b ? a : b);
}
//构成重载,名称一样,参数(个数或类型)不一样的多个方法
void max(short a, short b){
System.out.println(a > b ? a : b);
}
void max (float a, float b){
System.out.println(a> b ? a : b);
}
public static void main(String[] args){
Test t = new Test();
//调用的是int类型的参数方法
t.max(2, 5);
//调用的是short类型的参数方法
short a=2;
short b = 4;
t.max(a,b);
}
}
输出结果:
t.max(2,5)调用的是void max(int a,int b),再比较这个两个值的大小,结果输出是5;t.max(a,b),传入的是虽然是2和4,但强制转换成short类型,所以调用的是void max(short a, short b),结果输出是4。
2.Override:获取人和学生的相关信息。
//获取人和学生的相关信息
class Person{
private String name;
private int age;
public void setName(String name){this.name=name;}
public void setAge(int age){this.age=age;}
public String getName(){return name;}
public int getAge(){return age;}
public String getInfo(){ //父类只有name合age属性
return "Name: " + name + "\n" + "age: " +age;
}
}
class Student extends Person{
private String school; //除了有父类的name和age外,还有自己的的school属性
public String getSchool(){ return school;}
public void setSchool(String school){ this.school=school;}
//重写了父类的方法,把自己特有的school属性也实现
public String getInfo(){
return "Name: " + getName() + "\n" + "age: " +getAge() + "\nschool: " +school;
}
}
public class TestOverWrite{
public static void main(String arg[]){
Student student = new Student();
Person person = new Person();
person.setName("lee");
person.setAge(24);
student.setName("Angelo");
student.setAge(18);
student.setSchool("北理工");
person.getInfo();
student.getInfo();
System.out.println(person.getInfo()); //person的信息,父类
System.out.println(student.getInfo()); //student的信息,子类
}
}
输出结果:
通过这两个小例子,对于重载与重写有了简单明了的认识。重写在多态当中的好处表现出了OOP的好处,经过实践后会有更深的体会,接下来会继续去认识多态。