1、方法的重载
在一个类中,我们可以定义多个方法。如果有一系列方法,它们的功能都是类似的,只有参数有所不同,JavaOOP的语法允许把这一组方法名定义为同名方法。例如,在Hello类中,定义多个hello()方法:
class Hello {
public void hello() {
System.out.println("Hello, world!");
}
public void hello(String name) {
System.out.println("Hello, " + name + "!");
}
public void hello(String name, int age) {
if (age < 18) {
System.out.println("Hi, " + name + "!");
} else {
System.out.println("Hello, " + name + "!");
}
}
public int hello(int x) {
return x*5;
}
}
这种方法名相同,但各自的参数不同,称为方法重载(Overload),注意:方法重载的返回值类型通常都是相同的。方法重载的目的是:功能类似的方法使用同一名字,更容易记住,调用起来也简单,编译器会根据传入的参数自动匹配到具体调用的方法。
hello()方法的实现:
public class Work_01 {
public static void main(String[] args) {
Hello hl = new Hello();
hl.hello(); // Hello, world!
hl.hello("梁志超"); //Hello, 梁志超!
hl.hello("王老八", 17); //Hi, 王老八!
System.out.println(hl.hello(5)); //25
}
}
2、方法的重写
在Java继承关系中,子类如果定义了一个与父类方法签名完全相同,返回值也相同的方法,被称为方法的重写(Override)
例如,在Person类中,我们定义了run()方法,在子类Student中,重写这个run()方法:
...注意:在重写方法前加上@Override注解可以让编译器帮助检查是否进行了正确的覆写,此时不小心写错了方法签名编译器会报错
class Person {
public void run() {
System.out.println("Person.run");
}
}
class Student extends Person {
@Override
public void run() {
System.out.println("Student.run");
}
}
而在下面的例子中,则不是方法的重写:
class Person {
public void run() { … }
}
class Student extends Person {
// 不是Override,因为参数不同:
public void run(String s) { … }
// 不是Override,因为返回值不同:
public int run() { … }
}
那么方法的重写对我们的好处就是:重写子类可以覆写父类的方法(Override),覆写在子类中改变了父类方法的行为,从而使我们能够更具体的实现继承同一个父类的不同子类的各自方法的调用
最后:
总结两者的区别:如果方法签名不同,就是Overload重载,Overload重载方法是一个新方法;如果方法签名相同,并且返回值也相同,就是Override 重写。