Java 面向对象(4)多态

Java 面向对象(4)多态

多态是同一个行为具有多个不同表现形式或形态的能力。

多态存在的三个必要条件

  • 继承
  • 重写
  • 父类引用指向子类对象

比如:

Parent p = new Child();

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

多态的弊端通过父类引用操作子类对象时,只能使用父类中已有的方法,不能操作子类特有的方法。

多态的实现方式

  1. 重写
  2. 接口
  3. 抽象类和抽象方法

多态-转型

父类的引用 指向子类对象时,就发生了向上转型,即把子类类型对象转成了父类类型

//描述动物这种事物的共性eat
abstract class Animal{
	abstract void eat();
}
//描述dog这类事物
class Dog extends Animal{
	void eat(){
		System.out.println("啃骨头");
	}
	void lookHome(){
		System.out.println("看家");
	}
}
//描述小猫
class Cat extends Animal{
	void eat(){
		System.out.println("吃鱼");
	}
	void catchMouse(){
		System.out.println("抓老鼠");
	}
}
// 测试类
public class Test {
	public static void main(String[] args) {
		Animal a = new Dog(); //这里形成了多态
		a.eat();
		//a.lookHome();//使用Dog特有的方法,需要向下转型
		Dog d = (Dog)a;
		d.lookHome();
		Animal a1 = new Cat();
		a1.eat();
		/**
		 * 由于a1具体指向的是Cat的实例,而不是Dog实例,这时将a1强制转成Dog类型,
		 * 将会发生	ClassCastException 异常,在转之前需要做健壮性判断。
             if(!Dog instanceof a1){ // 判断当前对象是否是Dog类型
                System.out.println("类型不匹配,不能转换");
                return;// 方法执行中止
             }
			Dog d1 = (Dog)a1;
			d1.catchMouse();
		*/
	}
}

向上转型:不需要面对子类类型时,通过提高扩展性,或者使用父类的功能就能完成相应的操作,这时就可以使用向上转型。

向下转型:当要使用子类特有功能时,就需要使用向下转型。

好处:可以使用子类特有功能。

弊端:需要面对具体的子类对象;在向下转型时容易发生ClassCastException类型转换异常。在转换之前必须做类型判断。

成员的特点

多态成员变量:

子父类中出现同名的成员变量时,多态调用该变量时:

编译时期:参考的是引用型变量所属的类中是否有被调用的成员变量。没有,编译失败。

运行时期:也是调用引用型变量所属的类中的成员变量。

简单记:编译运行都参考等号的左边。

多态成员函数:

编译时期:参考引用变量所属的类,如果没有类中没有该调用的函数,编译失败。

运行时期:参考引用变量所指的对象所属的类,并运行对象所属类中的成员函数。

简而言之:编译看左边,运行看右边。

多态静态函数:

多态调用时:编译运行都参考引用类型变量所属的类中的静态函数。

简而言之:编译运行看等号的左边。其实真正调用静态方法是不需要对象的,静态方法通过类直接调用

你可能感兴趣的:(java)