昨天寫程序的時候有個地方運行一直有問題抚官,搞了好久才搞明白是怎么回事,最后發(fā)現(xiàn)的錯誤簡直讓人哭笑不得阶捆。
那個程序代碼比較多凌节,不方便放上來,我就拿個短點的程序舉下例描述一下那個錯誤洒试。
public class Person{
private String name = "";
private int age = 0;
public static void main(String[] arguments){
Person p1 = new Student("CatDevil",10);
System.out.println(p1.getAge());
}
public Person(){ }
public Person(String name,int age){
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return this.age;
}
}
class Student extends Person{
private String name = "";
private int age = 0;
public Student(String name,int age){
super();
this.name = name;
this.age = age;
}
public void setName(String name){
this.name = name;
}
public String getName(){
return this.name;
}
}
輸出:
0
程序中Student
繼承了Person
倍奢,本來應該覆寫它的setter和getter方法,但是這里忘記覆寫age的setter和getter了儡司,然后就導致調(diào)用p1.getAge()
時娱挨,實際上調(diào)用的是父類Person
的getAge方法,所以返回的age是父類的age,默認是0捕犬,就導致了這個輸出跷坝。
有人說了,還會出這樣的問題碉碉?
實際上我昨天寫的那個程序?qū)傩蕴貏e多柴钻,有10個左右,而且當時一個父類有3個子類垢粮,3個子類分別對應不同狀態(tài)贴届,后來我又給父類加了一個屬性,但卻忘了給子類設置新的setter和getter蜡吧,最后就出現(xiàn)了一些莫名其妙的錯誤毫蚓,后來還是通過斷點調(diào)試才發(fā)現(xiàn)了這個錯誤,下次一定要記住昔善。
總結一下昨天遇到的錯誤給我?guī)淼慕逃枺?/p>
1.父類添加新的屬性元潘,一定要記住給子類設置對應的setter和getter方法。
2.(1)子類中的同名同參方法會重寫父類的對應方法君仆,比如上面的程序翩概,子類Student
有setName
方法牲距,父類Person
也有setName
方法,并且參數(shù)還相同钥庇,那我調(diào)用p1(類型是Student)
的setName
方法時牍鞠,調(diào)用的就是Student
對應的方法;
(2)重點來了评姨,子類中的同名變量不會覆蓋父類的同名變量难述,如果直接訪問子類的同名變量實際上訪問到的是父類變量,比如下面的例子中吐句,所有變量都是public
龄广,可以直接訪問,那p1.age
的值還是0
蕴侧,即父類Person
的age
默認值。
public class Person{
public String name = "";
public int age = 0;
public static void main(String[] arguments){
Person p1 = new Student("CatDevil",10);
System.out.println(p1.age);
}
public Person(){ }
public Person(String name,int age){
this.name = name;
this.age = age;
}
}
class Student extends Person{
private String name = "";
private int age = 0;
public Student(String name,int age){
super();
this.name = name;
this.age = age;
}
}