28.多态

本文详细介绍了Java中的多态性,包括向上转型和向下转型的概念,并通过实例展示了如何在实际开发中利用多态性降低耦合度和增强程序扩展性。通过Host类喂养不同类型的宠物(Pet、Cat、Dog)的例子,阐述了面向抽象编程的重要性。
摘要由CSDN通过智能技术生成

关于java中的多态:

多态的几个概念:                                                                                                                              向上转型 (upcasting)    子类型转换成父类型   自动类型转换                                                        向下转型(downcasting) 父类型转换成子类型   强制类型转换【需要强制类型转换符】                      注意:无论是向上转型还是向下转型,两种类型之间必须要有继承关系

package com.bjpowernode.jave.Test06;

public class OverRideTest2 {

	public static void main(String[] args) {
		//a1是Animal类型的 创建的对象是Bird类型的,其中Animal属于父类 Bird属于子类 
		//这是子类型转换为父类型 属于自动类型转化
		Animal a1 = new Bird();
		//在jvm底层中,实际执行的是Bird对象 所以a1.move();的执行结果是------鸟在飞翔
		a1.move();		
		//这里我们不可以调用a1.catchWorm方法,虽然catchWorm()方法是Bird类中的
		//因为java程序在执行的时候分为编译阶段和运行阶段 如果编译阶段无法通过的话,就无法进入到运行阶段
		//其中编译阶段jvm只检查语法,可以看到a1是Animal类型的,而我们在Animal类中无法找到catchWorm()
		//这个方法,所以无法编译通过
		
		//如果我们想要让Animal类型的a1去访问Bird类中的catchWorm()方法,需要进行强制类型转换
		Bird b1 = (Bird)a1;
		b1.catchWorm();
		//下面是一个很著名的异常
		/*
		 * Animal a2 = new Bird();
		 * Fish f1 = (Fish)a2;
		*/
		//出现 java.lang.ClassCastException 异常  ** 类型转换异常
		//这两句代码在编译阶段不会出现错误 因为a2是Animal类型的,属于父类 f1是Fish类型的 属于子类
		//a2强制转换成f1没有问题
		//但是在运行期 因为a2的底层是Bird类型 而 f1是Fish类型,Bird与Fish之间没有继承关系 所以无法进行类型转换
		
		/*
		 * 我们想要避免类型转换异常可以使用instanceof运算符
		 * 语法结构: 引用 instanceof 数据类型名
		 * 它的运算结果是一个布尔类型 
		 * 例如:a instanceof Bird 
		 * 结果 true:a这个引用指向的对象是一个Bird类型
		 *     false:a这个引用指向的对象不是一个Bird类型
		 * */
		Animal a2 = new Bird();
		if(a2 instanceof Bird) {  //如果a2指向Bird对象
			Bird b2 = (Bird)a2;
			b2.catchWorm();
		}
		else if(a2 instanceof Fish) { //如果a2指向Fish对象
			Fish f2 = (Fish)a2;
			f2.swim();
		}
	}

}
//动物类 
class Animal{
	public void move() {
		System.out.println("动物在移动");
	}
}
//鱼类 继承动物类
class Fish extends Animal{
	//鱼类继承动物类的move()方法 并进行了方法覆盖
	public void move() {
		System.out.println("鱼在游泳");
	}
	public void swim() {
		System.out.println("fish swim");
	}
}
//鸟类 继承动物类 
class Bird extends Animal{
	//鸟类继承动物类的move()方法 并进行了方法覆盖
	public void move() {
		System.out.println("鸟在飞翔");
	}
	//鸟类特有的方法catchWorm()方法
	public void catchWorm() {
		System.out.println("鸟在抓虫子");
	}
}

多态在实际开发中的作用:

降低程序的耦合度 提高程序的扩展力                                                                                              能使用多态尽量使用多态 父类型引用指向子类型                                                                               核心:面向抽象编程,尽量不要面向具体编程

package com.bjpowernode.jave.Test08;

public class DuoTaiTest1 {

	public static void main(String[] args) {
		//创建主人对象
		Host lele = new Host();
		lele.name = "乐乐";
		//创建猫对象
		Cat c = new Cat();
		c.name = "大橘";
		//创建狗对象
		Dog d = new Dog();
		d.name = "金毛";
		lele.feed(lele, c);
		lele.feed(lele, d);
	}

}

//新建一个宠物类
class Pet{
	//宠物类中有eat()方法  宠物类属于父类
	public void eat() {
		System.out.println("宠物在吃东西");
	}
}

//新建一个猫类   继承宠物类  猫类属于子类
class Cat extends Pet{
	String name;
	//方法覆盖
	public void eat() {
		System.out.println("宠物猫"+this.name+"在吃鱼");
	}
}

//创建一个狗类    继承宠物类  狗类属于子类
class Dog extends Pet{
	String name;
	//方法覆盖
	public void eat() {
		System.out.println("宠物狗"+this.name+"在吃骨头");
	}
}

//创建一个主人类
class Host{
	String name;
	//定义一个喂宠物的方法
	public void feed(Host host,Pet pet) {	
		System.out.print(this.name+"的");
		pet.eat();
	}
	/*
	 * 我们设定宠物类,将主人类与宠物类进行绑定,主人类不面向于猫、狗等确定的宠物
	 * 而是面向于抽象的宠物类,而宠物类为父类可以向猫类、狗类进行自动类型转换
	 * 这样我们在对程序进行扩展的时候,就可以不需要更改Host类中的代码
	 * 直接增加一个类即可   例如:
	 * class Pig{
	 * 		String name;
	 * 		public void eat() {
				System.out.println("宠物猪"+this.name+"在吃菜");
			}
	 * }
	 * 我们只需要在主程序上创建对象即可SS
	 * */
	
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值