今晚看final方法,结果差点被JAVA继承部分的重写、重构、重载搞疯了,记录一下可别再忘记了。。。
一、重写(覆盖)
就是子类继承父类后,可以重写父类的方法,要求是
(1)方法名、参数列表相同
(2)权限修饰符只能从private—>protected—>public变大,很明显嘛你父类都是public公开了,你子类不可能自私地private起来不让后面继承的子类用吧?
(3)返回值可以不同(基于J2SE5.0以上的新内容,慎用)
大概就是这三点,更具体的看这张图,来源https://www.runoob.com/java/java-override-overload.html
二、重构
这个最好记了,特殊的重写方法,就是方法名,返回值,参数类型和个数完全相同,就是方法实现内容不同。大概是这样子?
class base{
public void f()
{
System.out.print("this is base");
}
}
class one extends base{
public void f()
{
System.out.println("one ");
}
}
三、重载
(1)方法名字相同
(2)返回值可以不同
(3)参数必须不同(顺序不同也可以)
这个涉及到多态那里的内容,先大概记住。
。
。
。
。丑陋的换行符
。
。
。
。
然后是搞清楚,子类继承父类后,父类的private和final方法是无法被重写的,但是有点不同。
(1)private方法无法被重写
这里我理解是已经默认不能重写,但是如果硬是在子类里面试图编写和父类的private方法并且重写,编译器并不会报错,它是默认两个完全独立无关的方法。
class base{
private void f()
{
System.out.print("this is base");
}
}
class one extends base{
//或者这里修改权限修饰符为public,还是不会报错
private int f()
{
int i=1;
System.out.println("one ");
return i;
}
(2)final方法无法重写
这里神奇的事情就发生了,我先写好一个正常的父类和子类,父类有个protected方法,然后在子类中重写这个方法并把修饰符改为public,是重写吧?是不是,是的吧?但是我把父类方法改成final,哎就不行了
class base{
protected final void f()
{
System.out.print("this is base");
}
}
class one extends base{
//这里是会报错的,提示“不能覆盖base中的final方法”
public void f()
{
System.out.println("one ");
}
}
what?wtf?所以我觉得可能是private和final处理的方式不一样吧,书上也没细讲,直接就略过了,我也就暂时这样理解吧,以后实践中有发现再回来改。
题外话:这里尝试了一下重写里面的修改返回值类型,果然还是不会呢嘻嘻,书上也不讲清楚一点mmp