多态

@Java入门基础
多态
1.多态概述
在同一个方法中,由于参数类型不同而导致执行效果各异的现象就是多态
在Java中为了实现多态,允许使用一个父类类型的变量来引用一个子类类型的对象,根据被引用子类对象特征的不同,得到不同的运行结果;
例如:

Animal a = new Cat();

要实现一个动物叫的方法,由于每种动物的叫声是不同的,因此可以在方法中接收一个动物类型的参数,当传入猫类对象的叫声时就发出猫类的叫声,传入犬类对象的叫声时就发出犬类的叫声;
例如:
Example1:


//定义接口Animal
interface Animal{
	void shout();//定义抽象shout()方法
}
//定义cat类实现Animal接口
class Cat implements Animal{
	//实现shout()方法
	public void shout(){
		System.out.println("miaomiao");
	}
}
//定义Dog类实现Animal接口
class Dog implements Animal{
	//实现shout()方法
	public void shout(){
		System.out.println("wangwang");
	}
}
//定义测试类
public class Example1{

	public static void main(String[] args) {
		Animal an1 = new Cat();//创建Cat对象,使用Animal类型的变量an1
        Animal an2 = new Dog();//创建Dog对象,使用Animal类型的变量an2
        animalShout(an1);//调用animalShout()方法,将an1作为参数传入
        animalShout(an2);//调用animalShout()方法,将an2作为参数传入
	}
	//定义静态的animalShout()方法,接收一个Animal类型的参数
   public static void animalShout(Animal an){
	   an.shout();//调用实际参数的shout()方法
   }
}

父类引用两个不同的子类对象分别调用animalShout()方法,打印出不同的结果。多态不仅解决了方法同名的问题,而且使程序变得更灵活,从而有效的提高程序的可扩展性和可维护性。
2.对象的类型转换

  • 子类向父类转换为隐式转换
  • 父类向子类转换为强制类型转换

当父类引用指向子类对象时,虽然提高了扩展性,但是只能访问父类中具备的方法,不可以访问子类中特有的方法
例如:
Example2:

interface Animal{
	void shout();
}
class Cat implements Animal{
	public void shout(){
		System.out.println("miaomiao");
	}
	public void sleep(){
		System.out.println("cat is sleeping");
	}
}
public class EXample2 {

	public static void main(String[] args) {
		Cat cat = new Cat();
         animalShout(cat);
	}
   public static void animalShout(Animal animal){
	   animal.shout();
	   animal.sleep();
   }
}

运行结果:
在这里插入图片描述
main方法中,Cat对象被当作父类Animal类型使用。但Animal类中没有定义sleep()方法;提示错误信息;
将animalShout()方法进行修改

public static void animalShout(Animal animal){
	   Cat cat = (Cat) animal;//将animal对象强制转换为Cat类型
	   cat.shout();//调用cat的shout()方法
	   cat.sleep();//调用cat的sleep()方法
   }

运行结果如下:
在这里插入图片描述

Example3:

interface Animal{
	void shout();
}
class Cat implements Animal{
	public void shout(){
		System.out.println("miaomiao");
	}
	void sleep(){
		System.out.println("cat is sleeping");
	}
}
class Dog implements Animal{
	public void shout(){
		System.out.println("wangwang");
	}
}
public class Example132 {

	public static void main(String[] args) {
		Dog dog = new Dog();
        animalShout(dog);
	}
    public static void animalShout(Animal animal){
       Cat cat = (Cat) animal;
 	   cat.shout();
 	   cat.sleep();
    }
}

zai在这里插入图片描述
在运行时报错,提示Dog类型不能转换成Cat类型,出错的原因是,在调用animalShout()方法时,传入一个Dog对象,在强制类型转换时,Animal类型的变量无法强转为Cat类型;
因此,引入一个instanceof,它可以判断一个对象是否为某个类的实例或者子类实例;

对象(或者对象引用变量)instanceof 类(或接口)

修改后:

    public static void animalShout(Animal animal){
    	if(animal instanceof Cat) {
    		Cat cat = (Cat) animal;
    	 	cat.shout();
    	 	cat.sleep();
    	}else {
    		System.out.println("this animal is not a cat");
    	}
    }

运行结果:
在这里插入图片描述
使用instanceof 关键字判断animalShout()方法中传入的对象是否为Cat类型,如果是Cat()类型就进行强制类型转换,否则就打印"this animal is not a cat";

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值