java_多态初识

多态

多态

什么是多态?多种形态

生活中的多态

指同一个动作,因为环境的不同产生不同的效果

java程序中的多态

Java作为面向对象的语言,同样可以描述一个事物的多种形态。如Student类继承了Person类,一个Student的对象便既是Student,又是Person。
同一段代码,因为实参的不同,实现本质上不同的效果
多态的实现方式
1.父类作为形参
2.父类作为返回值

父类:

public class Pet {
		protected String name;
		private int health;

		public String getName() {
			return name;
		}
		public void setName(String name) {
			this.name = name;
		}
		public int getHealth() {
			return health;
		}
		public void setHealth(int health) {
			this.health = health;
		}
		

		
		
		public Pet() {
		}
		
		
		public Pet(String name,int health) {
			this.name = name;
			this.health = health;
		}
		
		public void cure() {
			System.out.println("宠物看病……");
		}

}

子类:

public class Cat extends Pet {

		public Cat() {
			// TODO Auto-generated constructor stub
		}

		public Cat(String name, int health) {
			super(name, health);
			// TODO Auto-generated constructor stub
		}
		@Override
		public void cure() {
		//重写父类的cure方法
			System.out.println("猫咪吃药,吃猫粮,健康值恢复了");
			this.setHealth(100);
		}

}
public class Dog extends Pet{
		
		private String strain;
		public String getStrain() {
			return strain;
		}
		public void setStrain(String strain) {
			this.strain = strain;
		}
		
		
		public Dog(String name, int health, String strain) {
			super(name, health);
			this.strain = strain;
		}
		public Dog(String name) {
			super.name = name;
		}
		
		public Dog() {}
		
		@Override
		public void cure() {
		//重写父类的cure方法
			System.out.println("狗狗看病,吃药,吃骨头,健康值恢复了");
			this.setHealth(100);
		}

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

主人类
可以给宠物看病

/**
 * 	主人类
 * 	可以给宠物看病
 *
 */
public class Master {

	public void toHospitalWithDog(Dog dog) {
		if(dog.getHealth() < 100) {
			dog.cure();
		}else {
			System.out.println("狗狗很健康,多陪陪它");
		}
	}
	
	
	public void toHospitalWithCat(Cat cat) { 
		if(cat.getHealth() < 80) {
			cat.cure(); 
			}
		else {
			System.out.println("猫咪很健康"); 
			} 
		}
	 
	// 以上代码可以实现给宠物看病 
	// 但是不符合开闭原则  我们的程序要对扩展开放 对修改源代码关闭 
	
	public void toHospital(Pet pet) {
		pet.cure();
	}
	
	/*
	 * 方法重写规则之一 返回值相同或者是其子类
	 */
	public Pet status(String status) {
		/*实际返回值是定义的返回值的子类,子类转为父类,自动实现,自动类型提升 向上转型*/
		if(status.equals("老大")) {
			return new Cat("小黑",68);
		}
		else {
			return new Dog("大福",87);
		}
		
	}
}


public class Test {

	public static void main(String[] args) {
		Master xiaobai = new Master();
		Cat Cat = new Cat("小黑",48); // 此时实参我们传入子类类型
		// 实现自动类型提升 向上转型 父类引用指向子类对象 
		// 此时能够调用的方法 是子类重写父类的方法 
		// 不能调用子类独有的方法
		Dog dog = new Dog("阿福",78,"哈士奇");
		xiaobai.toHospital(Cat);
		System.out.println(Cat.getHealth());
		xiaobai.toHospital(dog);
		System.out.println(dog.getHealth());
		System.out.println("====================");
		Pet pet = xiaobai.status("老大");
		System.out.println("老大 is "+pet.getName());
	}
}

再有新的Pet子类时,可以扩展,但不必修改已有的Master类

结果:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值