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)子类中的同名同参方法会重写父类的对应方法,比如上面的程序,子类StudentsetName方法,父类Person也有setName方法,并且参数还相同,那我调用p1(类型是Student)setName方法时,调用的就是Student对应的方法;
(2)重点来了,子类中的同名变量不会覆盖父类的同名变量,如果直接访问子类的同名变量实际上访问到的是父类变量,比如下面的例子中,所有变量都是public,可以直接访问,那p1.age的值还是0,即父类Personage默认值。

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;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读