重写(Override)
重写简单理解就是子类对父类允许访问的方法重新编写,方法名形参和返回类型都不改变
重写反映的是"父子差异". 你"继承"了父亲吃火锅的爱好, 但是吃同一份鸳鸯锅(注意, 数据类型相同) , 你喜欢涮红汤, 你父亲喜欢涮清汤.
又比如你从你父亲哪里继承了一家中餐馆,但是你绝对中餐馆不挣钱,你又开了一家西餐馆。
class Animal{
public void move(){
System.out.println("动物可以移动");
}
}
class Dog extends Animal{
public void move(){
System.out.println("狗可以跑和走");
}
}
测试
public class TestDog{
public static void main(String args[]){
Animal a = new Animal(); // Animal 对象
Animal b = new Dog(); // Dog 对象
a.move();// 执行 Animal 类的方法
b.move();//执行 Dog 类的方法
}
}
结果:
动物可以移动
狗可以跑和走
思考
package Override;
public class Animal {
public void move(){
System.out.println("我可以移动");
}
}
class dog extends Animal{
public void move (){
System.out.println("狗也可以移动");
}
public void run(){
System.out.println("狗可以跑的很快");
}
}
package Override;
public class test {
public static void main(String[] args) {
Animal d = new Animal();
d.move();
Animal g = new dog();
g.move();
g.run();//这里会提示报错,The method run() is undefined for the type Animal
}
}
上述例子中,g属于Animal类型,如果Animal中没有run()方法,会提示编译错误,必须在Animal中定义run方法
package Override;
public class Animal {
public void move(){
System.out.println("我可以移动");
}
public void run() {
// TODO Auto-generated method stub
}
}
class dog extends Animal{
public void move (){
System.out.println("狗也可以移动");
}
public void run(){
System.out.println("狗可以跑的很快");
}
}
注意重写规则
- 参数列表必须与被重写的参数完全相同
- 构造方法不能被重写
- 声明为final的方法不能被重写
- 声明为static的方法不能被重写,但是能够被再次声明。
- 访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
- 子类和父类在同一个包内,子类可以重写父类的所有方法,除了private 和 final声明的方法
- 子类和父类不再同一个包内,子类只可以重写父类的public和protected方法
- 重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
类的继承中提到,如果子类调用父类的方法,需要用super.父类方法
如果子类中调用自己的方法,需要用this.子类方法。
class Animal{
public void move(){
System.out.printIn("我可以移动");
}
}
class cat{
public void move(){
super.move();
System.out.printIn("我可以跑");
}
}
package Override;
public class test {
public static void main(String[] args) {
Animal d = new Animal();
d.move();
}
}
输出结果:
我可以移动
我可以跑
重载(Overloading)
重载是指子类中与父类的方法名字相同,但是参数列表不同,返回类型可以相同也可以不同
一个方法写多次变量的修饰符不同,当调用方法是,会自动判断输入类型,调用相关的方法
package Overloading;
public class OverLoading {
public int test(){
System.out.println("没有参数的test");
return 0;
}
public void test(int a){
System.out.println("有参数"+ a +"的test");
}
public String test(int a,String b){
System.out.println("有两个参数"+a +"和"+ b +"的test");
return "test3";
}
public int test(String b , int a){
System.out.println("有两个参数"+b +"和"+ a +"的test");
return 1;
}
public static void main(String[] args) {
OverLoading overLoading = new OverLoading();
overLoading.test();
overLoading.test(6);
overLoading.test(1, "完美");
overLoading.test("完美",1 );
}
}
结果:
没有参数的test
有参数6的test
有两个参数1和完美的test
有两个参数完美和1的test
区别 | 重载方法 | 重写方法 |
返回类型 | 可以修改 | 不能修改 |
参数列表 | 必须修改 | 不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 不能做更严格的限制 |
重载更像是生活中的“随机应变”的体现,我平常去吃饭会穿的很随意,但是我去吃西餐,我就会穿的西装革履。