Java中的重写和重载

由于备考就Java的证书,重新复习了一遍Java,对一些重点做了些记录,总结归纳写了下来。

重写是父类和子类之间多态性的一种表现,而重载可以认为是一个类中多态性的表现。

首先,先说一下重写。重写很好理解,当你拥有一个继承超类方法的类,那么你就可以重写该方法。重写的主要好处是具有能够定义某个子类型特定行为的能力。关于重写的规则,可以用一句话来概括:“两同两小同一大同”。

  • 两同:变元列表和方法名必须一致。
  • 两小同:返回类型和异常要比父类小或相等。(此处返回类型的比父类小是有条件的!!只要是新的返回类型是被重写方法所声明的返回类型的子类型,就允许更改重写方法中的返回类型,否则不能更改!!!而异常比父类小指的是检验异常不能比父类更广或更新,千万要注意,当超类方法声明一个检验异常,但子类方法重写时没这么做,编译器将报错
  • 一大同:子类权限比父类大或相等。
如果定义的方法不满足这些条件,那么这个方法就不是重写方法,但不可认为它就是一个错误的方法,只要符合相关语法规则它可能是一个新方法也可能是重载方法。看下面一道题
 public class Animal { 
    protected int eat(int x) { return 0; } 
 } 
class Dog extends Amimal { 
    // insert code here 
 }  
 
A. public int eat(int x) { return 0; } 
B. private int eat(int x) { return 0; } 
C. private int eat(long x) { return 0; } 
D. protected long eat(int x) { return 0; } 
E. protected int eat(long x) { return 0; } 
其中正确的有哪几个呢?ACE是正确的,其中CE都不是重写方法,而是重载方法。如果在另一个类中,父类定义的方法类型为Animal,那么子类方法重写父类方法时将返回类型改为Dog则是合法的。
以上是重写方法的规则,我们再来了解一下重载方法。 相对重写方法,重载方法的规则就特别的简单了:重载方法必须改变变元列表,至于返回类型,访问权限和检查异常都是可以改变的(当然方法名可不能变)。
关于重写和重载的相关规则我们就先讲到这,下面我们来深入了解一下重写和重载方法的多态性。我们先通过这道题来测试一下
 public class Animal { 
   public void eat() { 
	System.out.println("Is Animal");
 	} 
 } 
class Dog extends Amimal { 
   public void eat(){
	System.out.println("Is Dog");
	}
   public void eat(String str){
	System.out.println("Is ReDog");
	}
 }
Animal a=new Animal();
Dog b=new Dog();
Aniimal c=new Dog();

a.eat();
b.eat();
c.eat();
c.eat("");
在说答案之前,我先将判断方法讲一下吧。其实总结就两句话,“ 引用类型决定在编译时使用哪个重载方法,对象类型决定在运行时使用哪个重写方法
很好理解,a.eat()和b.eat()输出结果大家当然是知道的,那c.eat()应该是什么呢?显然是Is Dog,因为尽管传递的是Animal的引用,但实际传递的对象是Dog,所以调用的方法也就是子类的方法。那么c.eat("")又应该是什么呢?是不是 Is ReDog呢?结果并不是!这里编译器将会报错。因为eat(String str)在父类中并没有定义,虽然之前说实际对象是Dog,但是程序没有运行而编译器只看到了Animal的引用,并且发现Animal中没有这个方法,所以编译器将报错。说到这不知道大家有没有理解之前的两句话。在判断调用哪个方法是,首先看编译器会不会报错,即引用对象指向的实际对象调用的方法有没有在其父类中定义,如果没有肯定是会报错的,否则程序运行过程中决定调用哪个方法则看对象类型是什么即可。
说到这最后在讲一个知识点,如果Animal类中有一个eat(int x){}方法,而Dog类中并没有重写父类方法,那c.eat(5)是否可以运行呢?显然是可以的,在这里我就提一下调用方法的一个先后顺序:this.eat(A)>super.eat(A)>this.eat(super(A))>super.eat(super(A))。
这样写出来应该能够理解,就拿上面的代码来说,c.eat(""),Dog中有eat(String s),则调用Dog中的方法,c.eat(5),由于Dog类中并没有这个方法,那么则看他的父类Animal是否有这个方法,有就调用,如果没有在看看Dog类中有没有eat(Object obj)有就调用该方法,没有在看父类有没有,都没有则报错。
都是自己总结的,很多地方可能说的不标准,有错误的地方大家说一下。谢谢!







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值