面向对象三大特征之一---多态

1. 面向对象

面向对象即万事万物皆对象,其编程的核心点有三:

1.先编写类
2.使用类创建对象
3.通过类.对象名去调用类里的方法(使用对象)

面向对象有三大特征—封装、继承、多态。这里来描述一下个人对多态的理解。

2. 多态

多态的概念

通过相同的代码语句,根据需求去调用相应类里的方法,即执行方法一致,结果不一致。因此多态可以非常有效的缩减代码。

实现多态的前提条件

1.需要有继承
2.要有父类类型去接收子类类型的参数
3.重写(不必需)

多态的体现方式

第一种:父类类型作为参数出现

eg.

public abstract class Pet(){
public abstract void eat();
}
public class Dog extends Pet(){
public void eat(){
sout("小狗吃骨头");
	}
}
public class Cat extends Pet{
public void eat(){
sout("小猫吃鱼");
	}
}
public class Master(){
//父类类型作为参数
public void feed(Pet pet){
pet.eat();
	}
}

在main方法里运行时,直接对Master类创建对象,master.feed(dog)可调用

原因:在这里插入图片描述
Pet为表面类型,仅仅决定是否可以调用此方法;
而真实类型是决定要调用哪个类的方法,即传进去的那个参数,例如master.feed(dog)。Dog子类继承于Pet父类,在子类里重写了eat方法,传进去的真实类型是Dog类对象,可以直接调用Dog类里的eat方法。

第二种:父类类型作为返回值类型

第一种父类作为参数类型的方式,由于表面类型(调用的方法必须是父类中也存在的,不能调用子类中单独享有的方法),所以有一定的限制性,故还有一种返回值类型的多态使用方式。

//假定此方法写在Test类里
public Pet getPet(int num){
if (num == 1){
//返回一个狗类的对象
	return new Dog();
	/*
	eg.
	这里可以直接return new Dog(name,sex,type);
	来直接进行赋值,方便后面的输出
	*/
}else 
//返回一个猫类的对象
	return new Cat();
}
//Test类
public class Test(){
Test test = new Test();
Scanner in = new Scanner(System.in);
System.out.println("请输入您要领养的宠物:1.狗狗 2.小猫");
int choose = in.nextInt();
psvm{
Pet pet = test.getPet(choose);
pet.setName("明明");//公共属性直接赋值
pet.setHealth(30);//公共属性
pet.setLove(50);//公共属性
//由于调用getPet方法时就会返回一个对应的子类对象给父类,正好对应多态前提条件第二条:需要有父类类型去接收子类类型的参数
//通过父类对象直接调用
pet.eat();
/*
这里与第一种方式不同的是可以调用子类私有的属性和方法
要使用到instanceof关键字进行判断
*/
}
}

多态细节

第一种:向上转型

父类类型接收子类对象:
父类 变量名 = new 子类();是类型准换,自动类型转换

向上转型优点:实现多态
向上转型缺点:不能调用子类特有的属性和方法,只能调用父类存在的属性和方法

第二种:向下转型 父类—>子类

子类 变量 = (子类) 父类对象

向下转型优点:调用子类特有的属性和方法
向下转型缺点:可能会产出ClassCastExcepiton异常(类型转换异常)(instanceof关键字判断)
eg.在这里插入图片描述

instanceof关键字

​ 语法:对象 instanceof 类 表达式结果:boolean

​ 判断该对象是否是类的对象或者子类对象:如果是,返回true;否则false

经验:

在进行向下转型的时候,先使用instanceof进行判断,避免出现ClassCastExcepiton异常

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值