多态

一、多态

  • 变态:同一个类型的实例,在执行同一个方法,个别对象呈现出变异的行为特征。
    多态:同一个类型的多个实例,在执行同一个方法,呈现出多种的行为特征。

  • 为什么有多态?
    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();
		}
	}
}
posted @ 2020-02-07 18:45  又又又8  阅读(80)  评论(0)    收藏  举报