1、共同点:二者都是Java多态性的具体表现形式。
2、方法的重写(override)
2.1、何为Java方法的重写(override)?
在子类继承父类的过程中,可以根据需要对父类的一些不合时宜的方法(不能满足子类需求)进行重新定义,
这种做法就叫方法重写,也可称为方法覆盖。
2.2、方法重写的规则?
(1)重写方法必须和被重写方法具有相同的方法名、参数列表和返回值类型;
(其中参数列表包括:形参数目、类型、顺序)
(2)重写方法不能使用比重写方法更为严格的访问权限;
(3)重写方法不允许声明抛出比被重写方法范围更大的异常类型。
具体举例:
public class Person {
String name;
int age;
public String get Info () {
return "name:"+ name +"\tage:"+ age;
}
}
public class Student extend Person{
String school;
public String getInfo(){
return "name:"+ name +"\tage:"+ age+"\tschool:"+school;
}
}
public class Test{
public static void main (String[] args){
Person p = new Person();
p.name = "Jim";
p.age = "20";
System.out.println(p.getInfo());
Student s = new Student();
s.name = "Tom";
s.age = "21";
s.school = "哈佛";
System.out.println(s.getInfo());
}
}
程序运行输出结果为:
name:Jim age:20
name:Tom age:21 school:哈佛
3、方法的重载(overload)
3.1何为方法的重载(overload)?
在一个类中存在多个同名的方法的情况,通常这些方法所提供的功能相近但是稍有不同。
3.2方法重载的规则?
(1)必须具有相同的方法名;
(2)必须具有不同的参数列表;
(3)而返回值类型可以不同、方法的修饰符可以不同、可以抛出不同异常。
具体举例:
public class Test{
public void t1(int i){
System.out.println("方法t1的参数1:"+i);
}
public void t1(double j){
System.out.println("方法t1的参数2:"+j);
}
public static void main(String[] args){
Test t = new Test();
t.t1(3);
t.t1(3.14);
byte b = 12;
t.m1(b);
}
}
程序运行输出结果为:
方法t1的参数1:3
方法t1的参数2:3.14
方法t1的参数1:12
注:方法调用时出现实参和形参的类型不严格一致,但是只要通过自动类型转换后能够匹配的仍然可以调用。
在遇到多重匹配的情况,编译器是以最低的类型转换开销为准来进行方法调用的。
(最低开销可以理解为:不同类型数值之间的转换时所需要的存储空间和处理器运算时间上的消耗)。