重载和重写是Java中两个重要的概念。重载可以实现本类内的方法多态性,重写可以实现子类或实现类的多态性。
一、重载
在自然语言中,经常会出现“一词多义”的现象。比如:“墨水”,它可以指一种含有色素或染料的液体,墨水被用于书写或绘画;还可以指人的文化、知识,“胸无半点墨”便指人的知识很匮乏。一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。在Java语言中,也存在重载,不过它需要满足以下几点:
1.方法名必须相同;
2.参数列表必须不同(参数的个数不同、参数的类型不同、类型的次序必须不同)
public static void main(String[] args) {
print(12);
print("1234");
print("hello Java!");
}
public static void print(int i){
System.out.println("打印整型值:"+i);
}
public static void print(String s){
System.out.println("打印字符串类型值:"+s);
}
public static void print(String s1,String s2){
System.out.println("打印字符串类型值1"+s1+";字符串类型值2:"+s2);
}
//输出结果
//打印整型值:12
//打印字符串类型值:1234
//打印字符串类型值:hello Java!
编译器在编译代码时,会对实参进行推演,会根据推演的结果来确定调用那个方法。
注意:重载与返回值类型是否相同无关;两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的。具体错误如下所示:
public static void main(String[] args) {
int a = 10;
int b = 20;
int ret = add(a, b);
System.out.println("ret = " + ret);
}
public static int add(int x, int y) {
return x + y;
}
public static double add(int x, int y) {
return x + y;
}
//编译错误
Test.java:已在类 TestDemo中定义了方法 add(int,int)
public static double add(int x,int y){
1个错误
二、重写
//Animal.java
public class Animal {
String name;
int age;
public Animal(String name, int age) {
this.name = name;
this.age = age;
}
public void eat() {
System.out.println(name + "吃饭");
}
}
//Cat.java
public class Cat extends Animal {
public Cat(String name, int age) {
super(name, age);
}
@Override
public void eat() {
System.out.println(name + "吃鱼");
}
}
//Dog.java
public class Dog extends Animal {
public Dog(String name, int age){
super(name, age);
}
@Override
public void eat(){
System.out.println(name+"吃骨头");
}
}
//TestAnmal.java
public class TestAnimal {
// 编译器在编译代码时,并不知道要调用Dog 还是 Cat 中eat的方法
// 等程序运行起来后,形参a引用的具体对象确定后,才知道调用那个方法
// 注意:此处的形参类型必须时父类类型才可以
public static void eat(Animal a) {
a.eat();
}
public static void main(String[] args) {
Cat cat = new Cat("小黄", 2);
Dog dog = new Dog("大黄", 3);
eat(cat);
eat(dog);
}
}
//运行结果:
//小黄吃鱼
//大黄吃骨头
区别点 | 重载 | 重写 |
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
访问限定符 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
异常 | 可以修改 | 可以减少或者删除,一定不能抛出新的或者更广的异常 |