方法重写介绍
- 子类和父类有两个返回值,参数,名称都一样的方法, 子类的方法会覆盖父类的方法。
- 调用
public class Overide01 {public static void main(String[] args) {Dog dog = new Dog();dog.cry();}
}
- Animal类
public class Animal {public void cry() {System.out.println("动物叫");}
}
- Dog类
public class Dog extends Animal{
// public void cry() {
// System.out.println("狗叫");
// }
}
我们把Dog类的cry
方法注释掉了,就会到父类里面去找。
方法重载三个细节
-
子类方法,形参列表,方法名和父类完全一致
-
子类的返回类型如果和父类不同,要保证子类返回的
类型
是父类返回类型的子类 -
子类的方法不能缩小父类方法的访问权限范围
-
调用
public class Overide01 {public static void main(String[] args) {Dog dog = new Dog();dog.cry();}
}
- Animal类
public class Animal {public void cry() {System.out.println("动物叫");}public Object getSth() {return null;}protected First getA() {return null;}
}
- Dog类
public class Dog extends Animal{public void cry() {System.out.println("狗叫");}//String正好是Object的子类,反过来就会报错public String getSth() {return null;}public Second getA() {return null;}
}class First {}class Second extends First {}
重写的练习
- 刚开始的误区
- 每个
Say
方法写成void
的返回类型,每个类型打印自己的属性,没有体现出来继承
的优势,
- 改进
- 父类的
Say
方法的返回类型写为String
类型,返回父类自身的属性 - 子类的
Say
方法的可以用super
关键字直接调用父类的方法,在此基础上,再加上自身的属性。
代码如下:
Person类:
public class Person {Person(String name, int age) {this.m_Name = name;this.m_Age = age;}String say () {return "name = " + m_Name + "age = " + m_Age;}public String getName() {return m_Name;}public int getAge() {return m_Age;}private String m_Name;private int m_Age;
}
Student类
public class Student extends Person {String Say () {return super.say() + "id = " + m_Id + "score = " + m_Id;}Student(String name, int age, String id, double score) {super(name, age);this.m_Id = id;this.m_Score = score;}private String m_Id;private double m_Score;
}
调用
public class OverrideExercise {public static void main(String[] args) {Person lfm = new Person("lfm", 19);System.out.println(lfm.say());Student lfm314 = new Student("lfm", 19, "314", 88.5);System.out.println(lfm314.Say());}
}