方法重写和重载
介绍方法重载,方法重写的概念及重载与重写时须注意的事项,最后就是对Object
类的toString()
方法的重写。
Author: Msuenb
Date: 2023-02-12
方法重载
方法重载(overload)
是指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。
- 参数列表:参数个数不同、数据类型不同、数据类型顺序不同(不推荐,有歧义)。
- 重载方法调用:JVM 通过方法的参数列表,调用匹配的方法。
-
方法重载示例:
public void test() {} public void test(int i, int j) {} // 个数不同 public void test(int i, String s) {} // 类型不同 public void test(String s, int i) {} // 是重载 但不推荐
重载方法时使用可变参数
public class Main { public static void main(String[] args) { test(1,2,3,4); // 调用第一个 // 可变参数的本质就是数组 test(1, new int[] {2, 3, 4}); // 调用第二个 //test(1, 2, 3); // 第二个 第三个都匹配 test(new int[]{1,2,3}); // 调用第三个 } public static void test(int a, int b, int c, int d) {} public static void test(int a, int ...nums) {} public void test(int ...nums) {} // 调用时可能会与上一个产生歧义 一般不这样写 }
注意:
- 可变参数的本质就是数组。
public static void test(int ...nums) {} //public static void test(int[] nums); // 构不成重载
-
以下不是重载
public void test(int i, String s) {} public static void test(int i, String s) {} // 重载与修饰符无关 void test(int i, String s) {} // 重载与修饰符无关 int test(int i, String s) {} // 重载与返回值无关
子类可以重载从父类中继承的方法。
方法重写
父类的所有方法子类都会继承,但是当某个方法被继承到子类之后,子类觉得父类原来的实现不适合于子类,就可以进行方法重写 (Override)
。
public class Main {
public static void main(String[] args) {
Student student = new Student();
student.setName("张三");
student.setAge(23);
student.setScore(89);
System.out.println(student.getInfo());
}
}
class Person {
private String name;
private int age;
public void setName(String name) {this.name = name;}
public String getName() {return name;}
public void setAge(int age) {this.age = age;}
public int getAge() {return age;}
public String getInfo(){
return "姓名:" + name + ",年龄:" + age;
}
}
class Student extends Person {
private int score;
public int getScore() {return score;}
public void setScore(int score) {this.score = score;}
//方法的重写
public String getInfo(){
// return "姓名:" + name + ",年龄:" + age;
//在子类中不能直接使用父类私有的name和age
return "姓名:" + getName() + ",年龄:" + getAge() + ",成绩:" + score;
return super.getInfo(); // 调用父类被重写的方法
}
}
可以使用super.被重写方法([实参列表])
调用父类被重写的方法。
方法重写要求:
1.必须保证父子类之间重写方法的名称相同。
2.必须保证父子类之间重写方法的参数列表也完全相同。
2.子类方法的返回值类型必须<=
父类方法的返回值类型
注意:如果返回值类型是基本数据类型和void,那么必须是相同
3.子类方法的权限必须>=
父类方法的权限修饰符。
注意:public > protected > 缺省 > private 父类私有方法不能重写 跨包的父类缺省的方法也不能重写
Object根父类
类 java.lang.Object
是类层次结构的根类,即所有类的父类。每个类都使用 Object
作为超类。所有对象(包括数组)都实现这个类的方法。而且很多方法子类都会重写这些方法,通过子类对象调用方法后执行的是重写后的方法。
-
重写
toString()
方法Object
中实现的toString
方法,默认返回"对象的类型 @ 对象hashCode值的十六进制形式"
的信息表达式,而这个信息表达式对于绝大部分场景来说是没有用的,建议子类重写toString方法,结果应该时一个简明但易于读懂的信息表达式。class Person { private String name; private int age; public String getName() {return name;} public void setName(String name) {this.name = name;} public int getAge() {return age;} public void setAge(int age) {this.age = age;} @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }