Java基础-面向对象中(2/2)
方法的重写
方法的重写(override / overwrite)
1、重写:子类继承父类以后,可以对父类中的同名同参数的方法,进行覆盖操作。
2、应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。
3、重写的规定:
方法的声明:权限修饰符 返回值 方法名(形参列表) throws 异常类型{
方法体
}
约定俗成:子类中叫重写的方法,父类中叫被重写的方法。
① 子类重写的方法的“方法名和形参列表”与父类被重写的方法的“方法名和形参列表”相同。
② 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。
☆(方法的重写就是覆盖,权限不小于父类,才能覆盖掉父类的方法,像摊煎饼)
>特殊情况:子类不能重写父类中声明为private权限的方法。
③ 返回值类型:
>父类被重写的方法的返回值类型是void的,则子类重写方法的返回值类型也只能是void。
>父类被重写的方法的返回值类型是A,则子类重写方法的返回值类型也只能是A或A的子类。
>父类被重写的方法的返回值类型是基本数据类型(比如:double),则子类重写方法的返回值类型也只能是相同的基本数据类型(double)。
④ 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出异常类型。(具体放到异常处理时候讲)
******子类和父类中的同名同参数列表的方法要么都声明为非static的(考虑重写),要么都声明为非static的(不是重写)******
(静态方法不能被覆盖,因为静态的方法是随着类的加载而加载的,后面讲到static关键字再详细说明)
student s = new student();
s.eat();//重写了父类的eat方法,所以子类对象调用了子类重写父类的方法。
s.walk(10);//父类中的walk方法调用了show方法,show方法的权限是private。子类看不到,所以子类不算重写了show方法。
//所以子类和父类里的show的方法都是单独的个体。为什么walk方法调用了父类的show方法,没调用子类的show方法
//个人理解是就近原则?总之父类中private修饰的方法,不要在子类中声明同名方法!
System.out.println("*********************");
s.study();
ppperson p = new ppperson();
p.eat();//父类调用父类自己的eat方法,不受子类重写的影响。
//------------------------------------- 类 --------------------------------------------------
class ppperson{
String name;
int age;
public ppperson() {
}
public ppperson(String name, int age) {
this.name = name;
this.age = age;
}
public void eat(){
System.out.println("吃饭");
}
public void walk(int distance){
System.out.println("走路,走了:"+distance+"公里");
show();
}
private void show(){
System.out.println("我是一个人");
}
public Object info(){
return null;
}
public double info1(){
return 1.0;
}
}
class student extends ppperson{
String major;
public student(){
}
public student(String major){
this.major = major;
}
public void study(){
System.out.println("学习,专业是:"+major);
}
//重写父类的eat方法
public void eat(){