多态
一、多态
-
变态:同一个类型的实例,在执行同一个方法,个别对象呈现出变异的行为特征。
多态:同一个类型的多个实例,在执行同一个方法,呈现出多种的行为特征。 -
为什么有多态?
Java执行方法时,方法的执行是动态绑定的:方法总是执行该变量实际所指向对象的方法。 -
向上转型:子类对象可以直接赋值给父类变量,自动完成。
向下转型:父类变量赋值给子类变量,强制转换。
(类型) 变量名;
public class Bird
{
public void fly()
{
System.out.println("鸟在天上飞······");
}
}
public class Sparrow extends Bird
{
}
public class Ostrich extends Bird
{
@Override
public void fly()
{
System.out.println("鸵鸟只能跑······");
}
}
public class 多态
{
public static void main(String[] args)
{
//向上转型
Bird b1 = new Sparrow();
Bird b2 = new Ostrich();
//执行时会动态绑定Sparrow中的fly方法
b1.fly();//鸟在天上飞······
//执行时会动态绑定Ostrich中的fly方法
b2.fly();//鸵鸟只能跑······
}
}
二、变量类型和强制转换
-
变量类型
(1)编译时类型:声明该变量时所指向的类型
在Java程序的编译阶段,Java编译器只认编译时类型。
(2)运行时类型(实际类型):该变量实际所引用的对象的类型。 -
强转运算符的注意点:
(1)强转运算符只能在编译类型具有继承关系的变量之间进行强转,否则编译错误:不兼容类型
(2)如果在编译类型具有继承关系的变量之间进行转换时,如果被转变量的实际类型不是要转的目标类型,程序就会引发ClassCastException(类型转换异常) -
instanceof运算符:为了避免ClassCastException异常,Java增加了该运算符。
(1)变量名 instanceof 类型 ------当变量所引用的对象是后面类或者子类的实例时,则运算符返回true。
(2)instanceof 只能在编译类型具有继承关系的变量之间进行判断,否则编译错误。
(3)该运算符可以保证:被强转的变量确实是可转换的才进行转换,从而避免ClassCastException。
class Shape
{
public void draw()
{
System.out.println("在平面上绘制图形");
}
}
class Rect extends Shape
{
public void info()
{
System.out.println("我是一个矩形");
}
}
class Circle extends Shape
{
public void round()
{
System.out.println("绕着圆形走一圈");
}
}
public class 类型转换
{
public static void main(String[] args)
{
//编译类型为Shape,实际类型为Rect
Shape s1 = new Rect();
s1.draw();
//对编译器而言,s1是Shape类型,Shape没有info方法
//s1.info();
Shape s2 = new Circle();
//对编译器而言,s1是Shape类型,Shape没有round方法
//s2.round();
//s2编译类型是Shape,c要求Circle
Circle c = (Circle)s2;
c.round();
//s1是Circle或其他子类的实例
if(s1 instanceof Circle)
{
//s1的编译类型是Shape,c2要求Circle
Circle c2 = (Circle)s1;
c2.round();
}
}
}

浙公网安备 33010602011771号