📄 student2.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 + -