多态


一.什么是多态?

1.生活中的多态:不同类型的打印机,打印的效果不同

2.程序中的多态:同一引用类型,使用不同的实例且执行不同的操作

二.使用多态实现思路

1.编写父类

2.编写子类,子类重写父类的方法

3.运行时,使用父类的类型,子类的对象

实现多态的两个要素:子类重写父类的方法和使用父类的类型

向上转型:

Pet pet=new Dog();----->自动类型转换又称为向上转型

三.实现多态的两种形式

1.使用父类作为方法形参实现多态

2.使用父类作为方法返回值实现多态

四.父类到子类的转换

1.向下转型(强制类型转换)

Pet pet=new Dog("欧欧","雪纳瑞");

Dog dog=(Dog)pet;

Penguin peng=(Penguin) pet---->报错,必须转为父类指向的真实子类类型

五.instance of运算符

语法:对象 instance of 类或接口

instance of 通常和强制类型转换相结合

六.多态的思想:

父类型的引用可以指向内存中的子类对象的内存空间,就可以方便设计方法的参数和返回值类型的时候,可以设计成父类对象,这样的方法在实现时比较简洁,

在后期进行扩展时,方法比较容易。在代码中,多态使用更多的是父类引用指向子类对象,会自动类型转换(向上转型),有时候也需要调用子类自己的东西,这时候需要还原子类,强制类型转换(向下转型),

向下转型的时候先使用instanceof运算符做类型判断

七.代码示范:

父类Pet类:

 

public abstract class Pet {

private String name;

private int age;

private int love=100;

private int health=100;

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public int getLove() {

return love;

}

public void setLove(int love) {

this.love = love;

}

public int getHealth() {

return health;

}

public void setHealth(int health) {

this.health = health;

}

/** * 吃东西 */

public abstract void eat();

/** * 显示宠物的信息 */

public abstract void show();

}

子类Dog类:

public class Dog extends Pet {

private String type;

public String getType() {

return type;

}

public void setType(String type) {

this.type = type; }

/**

* 狗狗和主人玩耍接飞盘 */

public void catchingFlyDisc(){

this.setHealth(this.getHealth()-10);

this.setLove(this.getLove()+5);

}

@Override

public void eat() {

if(this.getHealth()>=100){

System.out.println("已经吃饱了,不需要喂食!");

}else{

this.setHealth(this.getHealth()+5);

System.out.println("喂食成功!健康值增加5");

}

}

@Override public void show() {

System.out.println("我是一只"+type+",我的名字叫"+ this.getName()+",今年"+this.getAge()+"岁"+ ",健康值是"+this.getHealth()+",亲密度是"+this.getLove());

}

}

子类penguin类:

public class Penguin extends Pet {

private char sex;

public char getSex() {

return sex;

}

public void setSex(char sex) {

this.sex = sex;

}

/** * 企鹅和主人玩耍游泳 */

public void swimming() {

this.setHealth(this.getHealth() - 10);

this.setLove(this.getLove() + 5);

}

@Override

public void eat() {

if (this.getHealth() >= 100) {

 

System.out.println("已经吃饱了,不需要喂食!");

} else { this.setHealth(this.getHealth() + 3);

System.out.println("喂食成功,健康值增加3"); } }

@Override

public void show() {

System.out.println("我的名字叫"+this.getName() +"我的性别"+this.getSex()+ ",今年" + this.getAge() + "岁" + ",健康值是" + this.getHealth() + ",亲密度是" + this.getLove());

} }

主人类Master类:

public class Master {

/**

* 主人给宠物喂食 *

* @param pet

*/

public void feed(Pet pet) {

pet.eat();

}

/**

* 主人和宠物玩耍 *

* @param pet */

public void play(Pet pet) {

if (pet instanceof Dog) {/

/对象属于类类型返回true,否则返回false

// 强制类型转换,向下转型,将内存中的子类对象进行还原

Dog dog = (Dog) pet;

dog.catchingFlyDisc();

}else if(pet instanceof Penguin){

Penguin penguin=(Penguin)pet;

penguin.swimming(); }

}

}

测试类 TsetMaster类:

public class TsetMaster {

public static void main(String[] args) {

Master master=new Master();

Penguin pen=new Penguin();

Dog dog=new Dog();

dog.setName("旺财");

dog.setAge(4);

dog.setHealth(80);

dog.setLove(80);

dog.setType("中华田园犬");

master.play(dog);

dog.show();

}

}

原文地址:https://www.cnblogs.com/shuaiwenxin/p/6887973.html