一、重写与重载方法的区别?
重写(override),是子类对父类的允许访问的方法的实现过程进行重新编写,返回值和形式参数都不改变,即外壳不变,核心重写。
好处:子类可以根据需要,定义自己的行为。
子类可以根据需要实现父类的方法,在面向对象原则里,重写可以重写任何现有方法。
1、重写
1、新建Animal.java
package day05;
public class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
2、新建Dog.java
package day05;
public class Dog extends Animal{
public void move(){
System.out.println("狗可以移动");
}
public void bark(){
System.out.println("狗可以吠叫");
}
}
3、新建TestDog.java
package day05;
public class TestDog{
public static void main(String args[]){
Animal a = new Animal();
Animal b = new Dog();
Dog c = new Dog();
a.move();
b.move();
a.bark(); //报错:因为a的引用类型animal没有bark方法,类型为day05.Animal的变量a找不到方法bark(),使用b.bark();方法也不正确,((Dog) b).bark();才能获取到这个方法。
c.move();
c.bark();
}
}
输出信息:
方法重写的规则:
- 参数列表必须完全与被重写列表相同
- 返回类型必须完全与被重写方法的返回类型相同
- 子类方法的访问权限必须大于或等于父类方法的访问权限,例如:父类的一个方法被声明为public,那他的子类中重写方法就不能声明为protected。
- 父类的成员方法只能被他的子类重写。
- 声明为final的方法不能被重写
- 声明为static的方法也不能被重写,但是能够被再次声明。
- 子类和父类如果在同一个包中,name子类可以重写所有父类方法(除了声明为final和private的方法)
- 子类和父类如果不在同一个包中,子类只能重写父类的声明为public和protected的非final方法
- 构造方法不能被重写
10.如果不能继承一个方法,则不能重写这个方法。
2、重载(overlord)
重载(overloading)是在一个类里面,方法名字相同,而参数不同。返回类型呢可以相同也可以不同,每个重载的方法或构造函数都必须有一个独一无二的参数列表。
重载规则:
- 被重载的方法必须该表参数列表
- 被重载的方法可以改变返回类型
- 被重载的方法可以改变访问修饰符
- 被重载的方法可以声明新的或更广的检查异常
- 被重载的方法能够在同一个类中或在子类中被重载
package day05;
public class Overloading {
public int test(){
System.out.println("test1");
return 11;
}
public void test(int a){
System.out.println("test2");
}
//以下两个参数类型顺序不同
public String test(int a,String s){
System.out.println("test3");
return "returntest3";
}
public String test(String s,int a){
System.out.println("tets4");
return "returntest4";
}
public static void main(String[] args){
Overloading o = new Overloading();
System.out.println(o.test());
o.test(1);
System.out.println(o.test(1,"john"));
System.out.println(o.test("sail",1));
}
}
重写与重载的区别:
区别点 | 重写方法 | 重载方法 |
---|---|---|
参数列表 | 一定不能修改 | 必须被修改 |
返回类型 | 一定不能修改 | 可以修改 |
异常 | 可以减少或删除 | 一定不能抛出新的或更广的异常 |
访问 | 一定不能做更严格的限制(可以降低限制) | 可以修改 |