什么是重写(Override)?
重写:子类继承父类,子类声明与父类方法方法名相同,参数列表相同的称为重写。
重写规则:遵从两同两小一大原则;
两同:方法名相同,参数列表相同
两小:返回值类型小于等于父类。(1)当父类返回值类型为基本数据类型或void 时,子类返回值类型必须与父类相同。(2)当父类返回值类型为引用类型时,子类返回值类型必须小于 或为父类的返回值类型的子类。
一大:子类访问权限必须大于等于父类。
为什么要进行重写?
答:子类继承父类的非私有方法时,父类方法不满足子类的需求,此时子类可以重写该方法满足自己需求。
package JAVA_OOP.com.huacit.day02Inheritance;
/**
* @author yyc
* 方法的重写Override 或 Overwrite
* 1.子类可以是使用父类中所有非私有资源,也可以扩展子类自己的属性和功能,如果子类继承过来的方法不满足子类的需求,可以进行重写。
* 子类继承父类之后,父类中的方法功能不满足子类需求时可以对其进行重写
* 2.重写规则:遵循两同两小一大原则:
* ① 两同: 方法名相同,参数列表相同
* ②两小 : 返回值类型 小于等于父类。 第一:若父类方法返回值类型为void 或 8 种基本类型,则必须相同。
* 如果父类返回值类型是引用类型 ,则子类返回值类型可以与父类相同 或 是父类返回值类型的子类。
* 第二: 子类抛出的异常必须小于父类(如果父类没有抛出异常,则子类不能抛出异常,只能使用try- catch捕获异常。)
* ③一大: 子类访问权限必须大于等于父类。若父类访问权限为public ,则子类与之相同。
* 3.为什么要记性重写?
* 父类提供的方法不能满足子类的使用需求,但是由于子类间存在差异性,不能直接对父类的代码进行修改,
* 这时候就只能在子类中进行重写,避免修改源代码,也不会对原有功能产生影响,能够提高程序的扩展性。
*
* 构造方法能不能被重写:
* 不能:
* 私有方法能不能被重写?
* 不能:
* 重写(Override) 和 重载(Overload)的区别?
*/
public class Test4_Override {
public static void main(String[] args){
Chinese c1 = new Chinese();
//重写前调用父类的方法,重写后调用子类的方法。
c1.eat();
c1.show();
}
}
class Person{
public void eat(){
System.out.println("eat----------");
}
public Person show(){
System.out.println("父类show()");
return this;
}
private void print(){
System.out.println("打印---");
}
}
class Chinese extends Person{
@Override //@Override 注解,表示当前方法为重写方法。
public void eat(){
System.out.println("吃啥!");
}
@Override
public Chinese show(){
System.out.println("子类show()");
return this;
}
//@Override,不识别为重写,加上Override认为在访问父类中的私有方法。编译报错。父类的私有属性可继承不可访问。
/*
* 对于父类中的私有方法,子类不能重写,如果子类中定义了相同的方法,则会识别为子类特有的方法。
* */
public void print(){
System.out.println("打印机打印");
}
}
什么是重载(Overload)?
(1)同一个类下,方法名相同,参数列表不同的方法称之为方法的重载。
参数列表不同是指参数个数,参数顺序,参数类型不同,重载与返回值类型,访问权限,形参变量名和 方法体均无关。( 建议把返回值类型设置相同 避免麻烦 )
区别
重载前提是必须在同一个类中,方法名相同,参数列表不同。
重写 前提 发生继承关系,子类对父类非私有方法的重写。
注意:
a. 子类可以继承父类的私有方法,但是不能访问父类的私有方法,子类可以定义与父类私有方法完全相同的方法,但是不能使用呢@Override修饰,因为使用该注解表示访问了父类的该方法,而私有方法子类是没有访问权限的。
b. 构造方法不能被继承,所以不能被重写。构造方法是一个类特有的。方法名与类名相同,没有返回值类型,子类中定义则语法不符。