子类继承父类,子类是父类的扩展,子类得到父类的所有成员变量和方法,也就是说子类的实例拥有父类实例的共同特征,子类是特殊的父类,所以子类实例可以赋值给父类的引用变量,称为向上转型。
多态:编译时类型和运行时类型不一样,同一个类型的引用变量调用相同的方法时,可能会出现不同的结果。引用变量只能调用引用变量所属类中定义的方法和实例变量。方法具有多态性,而子类实例变量名和父类实例变量名相同时,父类实例变量只是被隐藏,并没有被重写,所以实例变量不具多态性。
代码演示:
class Father{
int a=10;
public void father(){
System. out.println("父类的方法" );
}
}
public class Son extends Father{
//子类隐藏父类的实例变量
int a=100;
public void father(){
System. out.println("子类覆盖父类的方法" );
}
public void son(){
System. out.println("子类自己的方法" );
}
public static void main(String args[]){
Father f=new Son();
//引用变量类型变量只能调用所属类中定义的方法,如果方法被重写,调用的是被重写的方法
f.father();
//引用变量类型变量不能调用不是所属类定义的方法
//f.son();
//实例变量不具有多态性
System.out.println(f. a);
}
}
如果需要父类引用类型变量调用子类中定义的方法,可以将父类引用变量进行强制类型转换,转换为子类类型的变量。父类引用类型变量强制转换为子类类型的变量,需要父类引用类型变量指向的是子类的实例。(引用类型强制转换需要是具有父子关系的两个类型之间)
为保证强制转换不会出现异常,进行强制转换前先用instanceof运算符判断是否可以成功转换,instanceof运算符前一个操作数是引用类型变量,或一个操作数是类或接口。instanceof运算符用来判断前面引用类型变量指向的实例,是否是后面类,或子类、接口的实例,如果是返回true(可成功强制转换),不是返回false(不可成功强制转换)。
代码演示:将上面代码的主方法改为:
public static void main(String args[]){
Father f=new Son();
//如果返回true,则会成功转换
if(f instanceof Son){
Son s=(Son)f;
s.son();
}
通过instanceof判断是否可以强制转换成功。