多态(polymorphism)、对象的转型(casting)

多态(polymorphism)

多态概念和实现:

多态是同一个方法,由于不同对象不同可能会有不同的方法。

多态的要点:
1、多态是方法的多态,不是属性的多态(多态与属性无关)
2、多态的存在要有三个条件:(1)继承(2)方法重写(3)父类引用指向子类对象
3、父类引用指向子类对象后,用该父类引用调用子类重写的方法时,此时多态就出现了。

*多态和类型转换
 */
package cn.test.polymorphism;

public class Animal {
  public void shout(){
	  System.out.println("叫了一声!");
}
	}
class Dog extends Animal{
	public void shout(){
		System.out.println("汪汪汪!");
	}
	public void seeDoor(){
		System.out.println("看门中!");
	}
}
class Cat extends Animal{
	public void shout(){
		System.out.println("喵喵喵!");
	}
	
}
public class TestPolym {
	public static void main(String[] args) {
		Animal a1 = new Animal();//向上可以自动转型
		//传的具体是哪一个类就调用那一个类的方法。大大提高了程序的可扩展性
		animalCry(a1);//相当于animalCry(new Animal())
		Animal a2 = new Dog();
		animalCry(a2);//a2为编译类型,Dog对象才是运行时类型。
		
		/*编写程序是,如果想调用运行时类型的方法,只能进行强制类型转换。
		 *否则通不过编译器的检查。 */
		Dog dog = (Dog)a2;//向下不需要强制类型的转换
		dog.seeDoor();
	}
	//有了多态,只需要让增加的这个类继承Animal类就可以了。
	static void animalCry(Animal a){
		a.shout();
	}
	/*如果没有多态,我们这里需要写很多重载的方法。
	 * 每增加一种动物,就需要重载一种动物的叫声,非常麻烦。
	 * static void animalCry(Dog d){
	 *     d.shout();
	 *     }
	 */
}

多态的主要优点是提高了代码的可扩展性,符合开闭原则但是多态也有弊端,就是无法调用子类特有的功能

对象的转型(casting):

父类引用指向子类对象,我们成为向上转型,属于自动类型转换。
向上转型后的父类引用变量只能调用他编译类型的方法,不能调用他运行时的方法。这时,我们就需要进行类型转换,我们称为向下转换。

/*
 * 对象的转型
 */
package cn.test.polymorphism;

public class TestCasting {
	public static void main(String[] args) {
		Object obj = new String("春秋战国");//父类引用指向子类对象
//      obj,charAt(0)无法调用,编译器认为obj是object类型而不是String类型
	/*编写程序时,如果想调用运行时类型的方法,只能进行强制类型转换。
	 * 不然通不过编译器的检查
	 */
		
		String str = (String)obj;//向下转型(object类型转向String类型)
		System.out.println(str.charAt(0));//位于0索引位置的字符
		System.out.println(obj == str);//true,他们运行时是同一个对象
	}
}
    

在向下转型过程中,必须将引用变量转为真实的子类类型(运行时类型)否则会出现类型转换异常ClassCastingExceotion

* 类型转换异常
 */
package cn.test.polymorphism;

public class TestCasting2 {
	public static void main(String[]args){
		Object obj = new String("秦王扫六合");
	//真实的子类类型是String,但是此处向下转型为StringBuffer
		StringBuffer str = (StringBuffer) obj;
		System.out.println(str.charAt(0));
	   
	
	}

}

为避免出现这种异常,我们可以使用instanceof 运算符进行判断`

* 向下转型中使用instanceof
 */
package cn.test.polymorphism;

public class TestCasting3 {
	public static void main(String[]args){
		Object obj = new String("虎视何雄哉");
		//父类引用指向子类对象
		
		if(obj instanceof String){
			String str = (String)obj;//向下强转:Object类型转为String类型
			System.out.println(str.charAt(0));
		}else if(obj instanceof StringBuffer){
			StringBuffer str = (StringBuffer)obj;
			System.out.println(str.charAt(0));
		
		}
	}

}

1、多态是:同一个方法,由于不同对象不同可能会有不同的方法。
2、多态的三个条件:继承、方法重写、父类引用指向子类对象

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值