2022-01-18 java编程错误总结
2022-01-19 本文已影响0人
濒死的死神
昨天写程序的时候有个地方运行一直有问题,搞了好久才搞明白是怎么回事,最后发现的错误简直让人哭笑不得。
那个程序代码比较多,不方便放上来,我就拿个短点的程序举下例描述一下那个错误。
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了,然后就导致调用p1.getAge()
时,实际上调用的是父类Person
的getAge方法,所以返回的age是父类的age,默认是0,就导致了这个输出。
有人说了,还会出这样的问题?
实际上我昨天写的那个程序属性特别多,有10个左右,而且当时一个父类有3个子类,3个子类分别对应不同状态,后来我又给父类加了一个属性,但却忘了给子类设置新的setter和getter,最后就出现了一些莫名其妙的错误,后来还是通过断点调试才发现了这个错误,下次一定要记住。
总结一下昨天遇到的错误给我带来的教训:
1.父类添加新的属性,一定要记住给子类设置对应的setter和getter方法。
2.(1)子类中的同名同参方法会重写父类的对应方法,比如上面的程序,子类Student
有setName
方法,父类Person
也有setName
方法,并且参数还相同,那我调用p1(类型是Student)
的setName
方法时,调用的就是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;
}
}