Java面向对象之多态

多态概念

多态性是指同一个操作作用于某一类对象,可以有不同的解释,产生不同的执行结果

多态存在的三个必要条件:

  • 需要存在继承和实现关系
  • 同样的方法调用而执行不同操作、运行不同代码(重写)
  • 在运行时,父类或者接口的引用变量可以引用其子类的对象

多态的作用:

  • 多态通过分离做什么和怎么做,从一个角度将接口和实现进行分离
  • 多态消除了类型之间的耦合关系
  • 多态的存在提高了程序的拓展性和后期的可维护性

简单案例:

abstract class Animal
{
	String name;
	abstract public void eat();
}
class Animal
{
	String name;
	public void eat(){};
}
class Dog extends Animal
{
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("狗吃骨头");
	}
}
class Cat extends Animal
{
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("猫吃鱼");
	}
}
public class Test {
	public static void main(String[] args) {
		Animal an1 = new Dog();
		Animal an2 = new Cat();
		an1.eat();
		an2.eat();
	}
}

执行结果:
结果

对象的上下转型

  • 由子类转型成父类,在继承图上是向上移动的,一般称为向上转型。
  • 向上转型是从一个较专用类型向通用类型转换,所以总是安全的,也就是说,子类是父类的超集
  • 向上转型过程中,类接口中唯一可能发生的事情是丢失方法,而不是获取方法。
  • 向下转型,不安全(可能需要instanceof操作符协助)

向上转型:

Animal an1 = new Dog();

instanceof运算符用来运行时通过返回值来指出对象是否是特定类或者是它是子类的一个实例

用法:

result = object instanceof class

result:布尔类型
object:必选项,任意对象表达式
class:必选项,任意已定义的对象类

说明:如果 object 是 class 或其子类的一个实例,则 instanceof 运算符返回true,如果不是,或者 object 是null,则返回false。

使用场合:

在对对象做向下转型之前,没有其它有关对象信息时,务必使用 instanceof 来判断一下,以避免抛出ClassCastException异常。

abstract class Animal
{
	String name;
	abstract public void eat();
}
class Dog extends Animal
{
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("狗吃骨头");
	}
	public void sleep(){
		System.out.println("狗睡觉");
	}
}
class Cat extends Animal
{
	public void eat() {
		// TODO Auto-generated method stub
		System.out.println("猫吃鱼");
	}
}
public class Test {
	public static void main(String[] args) {
		Animal an1 = new Dog();  //向上转型
		Animal an2 = new Cat();  //向上转型
		an1.eat();
		//an1.sleep(); //向上转型后的方法丢失,所以不能使用
		an2.eat();
		
		if(an2 instanceof Cat){  //向下转型要判断一下,an2是不是Cat类型的实例化
			Cat cat = (Cat)an2;  //向下转型
			cat.eat();
		}
	}
}

执行结果:
结果

多态案例应用:


class School
{
	public DaYingJi dayingji;
	public void anZhuang(DaYingJi dayingji){
		this.dayingji = dayingji;
	}
	public void daYin(String contex){
		dayingji.print(contex);
	}
}

class DaYingJi
{
	String PinPai;
	public void print(String contex){
		
	}
}

class CaiSeDaying extends DaYingJi
{
	public void print(String contex) {
		// TODO Auto-generated method stub
		System.out.println("彩色打印机:"+contex);
	}
}

class HeiBaiDaying extends DaYingJi
{
	public void print(String contex) {
		// TODO Auto-generated method stub
		System.out.println("黑白打印机:"+contex);
	}
}

public class Test {
	public static void main(String[] args) {
		School s = new School();
		CaiSeDaying c = new CaiSeDaying();
		s.anZhuang(c);
		s.daYin("yang");
		
		HeiBaiDaying h = new HeiBaiDaying();
		s.anZhuang(h);
		s.daYin("杨");
	}
}

执行结果:
结果

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值