重载和重写是java中两个重要的方法,这篇文章就是来重点介绍一下java中的重写和重载 。
重载
为什么要重载呢?
重载就是为了方便我们根据不同的需求去调用不同的方法。
什么是重载?
首先 重载的是方法 那需要什么样的条件才能形成重载呢?
1.方法名要相同
2.参数列表不相同(个数,类型,顺序)
3.与访问修饰符和返回值类型无关
public void main(String[] args) {
print(12);
print("1234");
print("hello Java!");
}
public void print(int i){
System.out.println("打印整型值:"+i);
}
public void print(String s){ //参数的类型不同
System.out.println("打印字符串类型值:"+s);
}
public void print(int s1,String s2){ //参数的数量不同
System.out.println("打印整型值1"+s1+";字符串类型值2:"+s2);
}
public void print(String s2,int s1){ //参数的顺序不同
System.out.println("打印字符串型值2"+s2+";打印整型值1"+s1);
}
void print(int i){ //与访问修饰符无关
System.out.println("打印整型值:"+i);
}
注意:重载与返回值类型是否相同无关;两个方法如果仅仅只是因为返回值类型不同,是不能构成重载的。
重写
为什么要重写?
父类中的方法已经无法满足子类中的需求,于是在子类中重写方法覆盖父类中的方法。
什么是重写?
重写(override):也称为覆盖。重写是子类对父类非静态、非private修饰,非final修饰,非构造方法等的实现过程进 行重新编写 , 返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 那重写又需要什么样的条件呢?
1.出现在有子父类的情况下
2.方法名和参数列表都要相同
3.返回值类型相同或者是其子类
4.访问修饰符的权限不能严于父类
5.抛出的一场不能大于父类
//Animal.java
public class Animal {
String name;
int age;
public Animal(){} //父类无参构造方法
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() {} //子类无参构造方法
@Override
public void eat() { //重写父类中的方法
System.out.println(name + "吃鱼");
}
}
//Dog.java
public class Dog extends Animal {
public Dog(){}
@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);
}
}
重写和重载的区别:
区别点 | 重载 | 重写 |
---|---|---|
参数列表 | 不同 | 相同 |
返回值类型 | 无关 | 父类相同或是父类的子类 |
访问修饰符 | 无关 | 不能严与父类 |
抛出异常 | 不能大于父类 |