面试题目
- 什么是方法重载?
- 什么是方法重写?
- 方法重载和重写有什么区别?
- 返回值不同算不算方法重载?
这个是对Java基础知识的考察,但我们要掌握的是写重载和重写方法有什么好处,为什么要这样写?
题目解析
什么是方法重载
在 Java 中,方法重载是指在同一个类中
定义多个方法
,它们具有相同的名称
但参数列表不同
。具体来说,方法重载要求方法的方法名相同,但是参数列表必须不同。参数列表可以是参数的数据类型、个数和顺序。在Java中,方法重载是静态绑定的,即在编译时就确定了调用哪个方法。方法重载的定义如下:
java">public class HeavyLoad {public int add(int a, int b) {return a + b;}public int add(int a, int b, int c) {return a + b + c;}public String add(String a) {return a;}
}
返回值不同算不算方法重载(易混)
先来看一下以下代码是不是方法的重载?
java"> public int add(int a, int b) {return a + b;}public double add(int a, int b) {return (double) a + b;}
答案:不是重载,如果你在IDEA工具中写入这两个方法,会直接报错,提示add方法已经存在了。再来看一下重载的概念,重载的方法中的参数列表不同。
什么是方法重写
方法重写是指在子类中
定义与父类中同名、参数列表相同
、返回值类型相同
或者是其子类的方法,方法重写是动态绑定的,即在运行时才确定调用哪个方法。
定义一个父类Animal.java
java">public class Animal {public void eat() {System.out.println("Animal is eating.");}
}
再定义一个Dog子类,然后使用extends继承Animal
java">public class Dog extends Animal {@Overridepublic void eat() {System.out.println("Dog is eating.");}
}
再写一个Cat子类,同样也继承Animal父类
java">public class Cat extends Animal {@Overridepublic void eat() {System.out.println("Cat is eating.");}
}
通过上述的Dog和Cat类中可以看出,都重写了和Animal父类中一样的eat()方法,但是方法里面的输出的值不一样,这就是重写,在IDEA的父类中,点击方法左侧的箭头,就可以看到有哪些类重写了该方法。
方法重载和重写有什么区别
方法重载和重写都是实现多态的方式,区别在于重载是编译时多态,重写是运行时多态。
- 定义上的不同
- 重载是指定义相同的方法名,参数不同。
- 重写时方法名和参数都一样,只有方法中的实现体不一样。
- 规则上的不同
重载的规则
- 必须具有不同的参数列表
- 可以有不同的访问修饰符
- 可以抛出不同的异常
重写的规则
-
参数列表必须完全与被重写的方法相同,否则不能称其为重写而是重载
-
返回的类型必须一直与被重写的方法的返回类型相同,否则不能称其为重写而是重载。
-
访问修饰符的限制一定要大于被重写方法的访问修饰符。
-
重写方法一定不能抛出新的检查异常或者比被重写方法申明更加宽泛的检查型异常
例如,在Animal父类的eat方法中并没有抛出异常,在Cat子类重写的eat方法上抛出异常处理,则会报错,提示要去掉该异常处理或者在Animal类的eat方法上也添加该异常处理。
如果在Animal父类的eat中添加异常处理,在子类重写eat方法时可以不加异常处理,不会报错。