Java 基础(面向对象特征: 方法的重写)
定义
在子类中可以根据需要对从父类中继承来的方法进行改造,也称为方法的重置、覆盖。在程序执行时,子类的方法将覆盖父类的方法。
要求
- 子类重写的方法必须和父类被重写的方法具有相同的方法名称、参数列表
- 子类重写的方法的返回值类型不能大于父类被重写的方法的返回值类型
- 子类重写的方法使用的访问权限不能小于父类被重写的方法的访问权限。
注意:子类不能重写父类中声明为private权限的方法 - 子类方法抛出的异常不能大于父类被重写方法的异常
注意:
子类与父类中同名同参数的方法必须同时声明为非 static 的(即为重写),或者同时声明为 static 的(不是重写)。因为 static方法是属于类的,子类无法覆盖父类的方法。
具体说明
- 重写:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作
- 应用: 重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法
- 重写的规定:
方法的声明: 权限修饰符 返回值类型 方法名 (形参列表) {
//方法体
}
约定俗称:子类中的叫重写的方法,父类中的叫被重写的方法
① 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同
② 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符
特殊情况:子类不能重写父类中声明为 private 权限的方法
③ 返回值类型:
父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void
父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以是A类或A类的子类
父类被重写的方法的返回值类型是基本数据类型,则子类重写的方法的返回值必须是相同的级别数据类型(比如:double),则子类重写的方法的返回值类型必须是相同的级别数据类型(必须是double)
④ 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型
Person.java
package com.klvchen.java1;
public class Person {
String name;
int age;
public Person() {
}
public Person(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();
eat();
}
private void show() {
System.out.println("我是一个人");
}
public Object info() {
return null;
}
}
Student.java
package com.klvchen.java1;
public class Student extends Person{
String major;
public Student() {
}
public Student(String major) {
this.major = major;
}
public void study() {
System.out.println("学习,专业是: " + major);
}
//对父类中的 eat() 进行了重写
public void eat() {
System.out.println("学生应该多吃有营养的食物");
}
//无法对父类中的 eat() 进行了重写
public void show() {
System.out.println("我是一个学生");
}
public String info() {
return null;
}
public void walk(int distance) {
System.out.println("重写的方法");
}
}
PersonTest.java
package com.klvchen.java1;
public class PersonTest {
public static void main(String[] args) {
Student s = new Student("计算机科学与技术");
s.eat();
s.walk(10);
System.out.println("**********************************");
s.study();
Person p1 = new Person();
p1.eat();
}
}
运行结果: