变量多态:
s被声明为父类类型,却指向的是子类时(即空间是子类),s称为变量多态。注意,使用时通过句柄s可以访问子类中与父类相同的成员变量,父类中没有的成员变量要对s进行强制类型转换
class Student {//父类
String studentNo,name;
Student(String sn,String nm)//父类构造器
{
studentNo=sn;
name=nm;
}
}
class Collegian extends Student{//子类
String major;
Collegian(String sn,String nm,String mj)//子类构造器
{
super(sn,nm);//只能用super指代父类构造器的名字,不能用父类构造器的名字。在构造器中没有this时,对super的调用必须在第一条
major=mj;
}
}
class sttext{
public static void main(String args[])
{
Student s[]=new Student[2];//本数组s实现了异类收集
Collegian stu;
s[0]=new Student("123","小可爱");
showInfo(s[0]);
s[1]=new Collegian ("23456","袁小妹","计算机");
stu=new Collegian ("234","小妹","计科");
showInfo(s[1]);
showInfo(stu);
System.out.println("转换后");
s[0]=stu;//表明用子类类型的变量直接给父类类型的变量赋值时,类型是可以直接转换的(父类可直接转换成子类);
//而stu=s[0]则会报错说不兼容,表明子类不能直接转换成父类
//用stu=(Collegian)s[0]也不行,因为指向父类对象的父类限制变量不能转换成子类类型
showInfo(s[0]);
stu=(Collegian)s[1];//这个可以,因为s[1]是子类类型的变量
showInfo(stu);
}
static void showInfo(Student s) {//实现了变量多态在方法参数传递时的应用,即形参是父类,实参可为父类,可为子类
System.out.println("姓名:"+s.name);
System.out.println("学号:"+s.studentNo);
if (s instanceof Collegian)//instanceof运算符用来判断左边的对象是不是右边的类型,如果是,为true;不是为false
System.out.println("专业:"+((Collegian)s).major);//强制类型转换,因为s2是Student类型的,Student中没有major,所以要进行强制转换
//说明对于产生覆盖的方法而言,s2不用强制类型转换,直接就访问子类中的
}
}