⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 student2.java

📁 《Java2程序设计实用教程(第2版)》课件
💻 JAVA
字号:
//【例3.6】  子类重定义父类成员。

public class Student2 extends Person1      //Student2是Person1类的子类
{
    private String speciality;             //专业,子类私有成员变量
    private static int count=0;            //人数,隐藏了父类的count

    public Student2(String name, int age, String spec)
    {
        super(name,age);                   //调用父类的构造方法
        this.speciality = spec;
        this.count++;                      //子类对象计数
    } 

    public Student2(String name, int age)  //子类构造方法重载
    {
        this(name,age,"未知");
    }

    public Student2(String name)
    {
        this(name,0,"未知");
    }

    public Student2()
    {
        this("姓名未知",0,"未知");
    }
     
    public Student2(Student2 s1)
    {
        this(s1.name, s1.age, s1.speciality);
    }

    public Student2(Person1 p1, String spec)
    {
        this(p1.name, p1.age, spec);
    }

    public void finalize()                 //覆盖父类的析构方法
    {
        super.finalize();                  //调用父类析构方法,父类人数减1
        this.count--;                      //子类人数减1 
    }
    
    public void setSpeciality(String spec) //子类增加的成员方法
    {
        if (spec==null || spec=="")
            this.speciality = "不知";
        else
            this.speciality = spec;
    }

    public void set(String name, int age, String spec)
    {                                      //重载父类同名成员方法
        super.set(name, age);
        this.setSpeciality(spec);
    }
            
    public String getSpeciality()
    {
        return this.speciality;
    }

    public static void howMany()          //分别统计父类和子类的人数
    {                                     //覆盖父类的同名类成员方法
        Person1.howMany();                //调用父类的类成员方法
        System.out.print("Student2.count="+count+"  ");
                                          //显示子类的类成员变量值
    }
    
    public String belongClassName() 
    {
        String str=super.belongClassName();//返回父类的类名
        if (this instanceof Student2)      //判断当前对象是否属于Student2类
            str+=", Student2";
        return str;
    }
    
    public String toString()               //覆盖父类的同名方法
    {
        return super.toString() +"," + speciality+"专业";
                                           //调用父类的同名方法
    }

    public void print()                    //覆盖父类的同名方法
    {
        this.howMany();
        System.out.println(this.belongClassName()+"类  ("+this.toString()+")");
    }

    public boolean equals(Object obj)      //覆盖Person1类中方法
    {
        if (this == obj) 
        {
            return true;
        }
        if (obj instanceof Student2) 
        {
            Student2 s2 = (Student2)obj;
            return super.equals(s2) && this.speciality.equals(s2.speciality);
        }
        return false;
    }
}

class Student2_ex
{
    public static void main(String args[])
    {
        Person1 p1 = new Person1();        //父类对象
        p1.set("李小明",21);               //调用父类成员方法
        p1.print();
        
        Student2 s1= new Student2();       //子类对象
        s1.set("王大伟",19);               //调用父类成员方法
        s1.print();
        
        Student2 s2= new Student2();       //子类对象
        s2.set("张小莉",18,"计算机");      //调用子类重载的成员方法
        s2.print();
        
        Person1 p2 = new Student2();       //父类对象赋值为子类实例,说明子类对象即是父类对象
        p2.set("胡东东",20);               //只能调用父类的set方法,不能调用子类的set方法 
        p2.print();                        //运行时多态

        s1.finalize();                     //覆盖父类的析构方法
        s1 = null;
        Student2.howMany();                //调用子类的类成员方法,分别统计父类和子类的人数
        System.out.println();
    }
}

/*

程序运行结果如下:

Person1.count=1  Person1类  (李小明,21岁)
Person1.count=2  Student2.count=1  Person1类, Student2类  (王大伟,19岁,未知专业)
Person1.count=3  Student2.count=2  Person1类, Student2类  (张小莉,18岁,计算机专业)
Person1.count=4  Student2.count=3  Person1类, Student2类  (胡东东,20岁,未知专业)
释放对象 (王大伟,19岁,未知专业) 
Person1.count=3  Student2.count=2

*/

/*
程序正确:


程序错误:

        p2.set("张小莉",20,"计算机");               //编译错,Person1类中没有定义3个参数的set()方法
        p2.setSpeciality("电子信息");               //编译错,
cannot find symbol
symbol  : method setSpeciality(java.lang.String)


*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -