重载与重写
Posted monkey1024
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重载与重写相关的知识,希望对你有一定的参考价值。
方法的重载和重写都是实现多态的方式
OOP三大特性:继承,多态,封装。
Overload方法重载的规则
1.方法名一致,参数列表中参数的顺序、类型、个数不同
2.重载与方法的返回值无关,存在于父类和子类、同类中
3.可以抛出不同的异常,可以有不同的修饰符
下面是重载的例子:
1 public class Dog { 2 Dog() 3 { 4 this.bark(); 5 } 6 void bark()//bark()方法是重载方法 7 { 8 System.out.println("no barking!"); 9 this.bark("female", 3.4); 10 } 11 void bark(String m,double l)//注意:重载的方法的返回值都是一样的, 12 { 13 System.out.println("a barking dog!"); 14 this.bark(5, "China"); 15 } 16 void bark(int a,String n)//不能以返回值区分重载方法,而只能以“参数类型”和“类名”来区分 17 { 18 System.out.println("a howling dog"); 19 } 20 21 22 public static void main(String[] args) 23 { 24 Dog dog = new Dog(); 25 //dog.bark(); [Page] 26 //dog.bark("male", "yellow"); 27 //dog.bark(5, "China");
Override方法重写的规则
1.参数列表必须完全与被重写的方法一致,返回值类型也必须完全一致
2.构造方法不能被重写,声明为final的方法不能被重写,声明了static的方法不能被重写,但能再次声明
3.访问权限不能比父类中被重写的方法的访问权限更低
4.重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以
为什么函数不能根据返回类型来区分重载?(来自华为面试题)
答:
因为在调用时不能指定类型信息,编译器不知道你要调用哪个函数
例如:
1 float max(int a,int b); 2 int max(int a,int b);
当调用max(1,2)时无法确定抵用的是哪个,单从这一点来说,仅返回值类型不同的重载是不应允许的。
在比如对下面这两个方法来说,虽然它们有同样的名字和自变量,但其实是很容易区分的
1 void f () {} 2 int f () {}
若编译器可以根据上下文明确判断出含义,比如在int x = f()中,那么这样做完全没有问题。然而,我们也可能调用一个方法,同时忽略返回值;我们通常把这称为“为它的副作用去调用一个方法”,因为我们关心的不是返回值,而是方法调用的其他效果。所以假如我们像下面这样调用方法: f(); Java 怎样判断 f()的具体调用方式呢?而且别人如何识别并理解代码呢?由于存在这一类的问题,所以不能。
以上是关于重载与重写的主要内容,如果未能解决你的问题,请参考以下文章