前言 - 问题可直接跳转到小结部分
每天将自己已经学习过的知识整理成笔记,养成写博客的好习惯.学而时习,之不亦乐乎?
我也是在不断学习的过程中,文章中的问题理解不到位的地方甚至出现的错误,欢迎大家指出,我会及时订正.
每个问题都会进行小结,不想看过程的可以直接跳到小结部分.
方法重载和方法重写的区别
方法重载
方法重载的主要是在一个类当中,方法的方法名相同,参数列表不同,返回值类型可以相同,也可以不同.
/*
这里只是简单的示例一下,Food Snack没有给出,意会一下即可.
*/
public class Demo{
public void eat(Food food){
System.out.println("今天正常吃饭!吃了" + food.name);
}
public void eat(Snack snack){
System.out.println("今天想吃零食!吃了" + snack.name);
}
public int eat(){
int money = 10;
System.out.println("今天喝西北风!但是省钱了,返回省钱的数目");
return 10;
}
//public void eat(){
// int money = 10;
// System.out.println("今天喝西北风!但是省钱了,返回省钱的数目");
//}
}
注意:如果参数列表相同,返回值类型不同是不算重载的.这种写法会直接报错.因为在调用方法的时候,我们还不知道方法的返回值类型,所以编译器无法区分你调用的是哪个方法,肯定就傻掉了,所以就告诉你,兄弟你写错了!
方法重写
方法的重写体现在子父类当中,最典型的是子类重写父类中的方法.
Father类和Son类都有Walk(boolean canRun)方法.
但是执行的时候结果却不同.
public class Father {
private boolean canRun = false;
public boolean isCanRun() {
return canRun;
}
public void setCanRun(boolean canRun) {
this.canRun = canRun;
}
public void walk(boolean canRun){
if(canRun){
System.out.println("父亲尽力跑啊跑!");
}else{
System.out.println("父亲老了,只可以走路!");
}
}
}
public class Son extends Father{
boolean canRun;
public Son(boolean canRun){
this.canRun = canRun;
}
@Override
public void walk(boolean canRun) {
if(canRun){
System.out.println("儿子可以跑!");
}else{
System.out.println("儿子也只能走!");
}
}
}
public class Test {
public static void main(String[] args) {
Father father = new Father();
Son son = new Son(true);
father.walk(father.isCanRun());
son.walk(son.canRun);
}
}
这里体现的就是子类Son重写了父类中的Walk()方法.
注意:重写这里有一个重要的点在于子类重写的方法不能低于父类方法的访问权限.
可以简单理解一下:在多态当中,父类引用指向子类对象,如果子类对象中重写的方法权限低于父类方法了,那么多态情况下,父类引用就无法访问子类中的方法了.
public class Test {
public static void main(String[] args) {
Father father = new Son(true);
System.out.println(father.isCanRun()); // false
father.walk(father.isCanRun()); // 儿子也只能走!
}
}
这里很神奇,明明我的Son对象创建的时候传入的参数是true,为什么执行结果却是儿子也只能走!
呢?
这里先进行一下这个知识点的小结,上面的问题会在下一个文章中讲解.
Java基础系列第二弹之Java多态成员访问的特点
小结
- 方法重载体现在同一个类当中同名方法参数列表不同的情况(必须满足),返回值类型可以相同也可以不同.如果两个方法方法名相同,参数列表相同但是返回值类型不同是不算重载的.
- 方法重写体现在子父类当中,体现的不同类之间的联系.要求子类重写的方法有和父类相同的方法名,参数列表和返回值类型,但是方法内部的具体操作可以发生变化.方法重写时要求子类方法的范文权限不能低于父类方法的访问权限.