Java面向对象-----重写(Override)和重载(Overloading)

本文深入解析了Java中的重写(Override)与重载(Overloading)概念,阐述了两者之间的关键区别,包括参数列表、返回类型、异常处理及访问权限等。通过实例展示了如何在子类中重写父类方法,以及如何在同一类中重载方法。

重写(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
区别重载方法重写方法
返回类型可以修改不能修改
参数列表必须修改不能修改
异常可以修改可以减少或删除,一定不能抛出新的或者更广的异常
访问可以修改不能做更严格的限制

 重载更像是生活中的“随机应变”的体现,我平常去吃饭会穿的很随意,但是我去吃西餐,我就会穿的西装革履

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值