1. 方法重载(overload):
定义:若干个方法名称相同,参数的类型或个数不同(即参数列表不同)的方法,与方法返回值无关!
public class FangFaChongZai {
public static void main(String[] args) {
System.out.println(add(10, 20));
System.out.println(add(10, 20, 30));
System.out.println(add(10.1, 20.1));
}
public static int add (int x, int y) {
return x + y;
}
// 方法重载
public static int add (int x, int y, int z) {
return x + y + z;
}
// 又重载
public static double add (double x, double y) {
return x + y;
}
}
- 问题:能否定义两个方法名称相同,参数个数、类型也相同但是返回值不同的方法?
public class FangFaChongZai {
public static void main(String[] args) {
System.out.println(add(10, 20));
System.out.println(add(30, 40));
}
public static int add (int x, int y) {
return x + y;
}
// 就光是返回值不同
public static double add (int x, int y) {
return x + y;
}
}
编译出错,所以坚决不能!!!
2. 方法覆写(override):
子类定义了与父类方法名称、参数、返回值完全一样的方法(没提权限!)。被覆写的方法不能拥有比父类更严格的方法访问权限(即
子类方法权限 >= 父类方法权限)
class Person {
public void print() {
System.out.println("1.Person类的print方法");
}
}
class Student extends Person {
// 方法覆写
public void print() {
System.out.println("2.Student类的print方法");
}
}
public class FangFaFuXie {
public static void main(String[] args) {
new Student().print();
}
}
这里的 new Student().print() 这句是先产生了一个 Student 类的对象,然后再调用 print 方法,Student 类又继承了 Person 类,
所以这里到底是会执行哪个类的 print 方法???
显然结果是执行了 Student 类的 print 方法。
结论:当前调用方法是通过哪个类new的并且此方法也被子类所覆写,调用的一定是覆写后的方法!!!
我们可以接着做个对比,下面的是通过 Person 类产生了一个对象。
class Person {
public void print() {
System.out.println("1.Person类的print方法");
}
}
class Student extends Person {
public void print() {
System.out.println("2.Student类的print方法");
}
}
public class FangFaFuXie {
public static void main(String[] args) {
new Person().print();
}
}
结果就变成了执行了 Person 类的 print 方法。
- 那么还存在一个权限的问题,被覆写的方法不能拥有比父类更严格的方法访问权限,这句的意思又是什么呢?
现在已经接触了三种访问控制权限:private < default < public。那么也就意味着如果父类使用public进行方法声明,那么子类必
须也使用public;如果父类使用default,那么子类可以使用default或者public。
错误的覆写:
class Person {
public void print() {
System.out.println("1.Person类的print方法");
}
}
class Student extends Person {
// 更严格的访问控制权限,错误
void print() {
System.out.println("2.Student类的print方法");
}
}
public class FangFaFuXie {
public static void main(String[] args) {
new Person().print();
}
}
- 问题:如果现在父类方法使用private定义,子类中使用public覆写,对吗?
class Person {
private void print() {
System.out.println("1.Person类的print方法");
}
}
class Student extends Person {
public void print() {
System.out.println("2.Student类的print方法");
}
}
public class FangFaFuXie {
public static void main(String[] args) {
new Person().print();
}
}
原因:如果父类方法使用了 private 定义,那么就表示该方法只能被父类使用,子类无法使用。换言之,子类根本就不知道父类
有这样的方法。这个时候子类中的该方法只是子类定义的新方法而已,并没有和父类的方法有任何关系。
结论:private方法无法被覆写!!!
*** 下面这张图可以充分说明二者之间的区别与联系: