方法重寫介紹
- 子類和父類有兩個返回值,參數,名稱都一樣的方法, 子類的方法會覆蓋父類的方法。
- 調用
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());}
}