目录
多态:同一个引用类型,使用不同的实例而执行不同操作
2. 多态的使用
搞错了!!!!!!
3.代码:
Master m=new Master();
// 创建Cat类对象 传统方法
// Cat c= new Cat(50, "小白", "200", "会飞");
// m.cure(c);
// 新 向上转型:父类的引用(对象名)指向子类的实例(对象)
Animal a=new Cat(50, "小花", "80", "会跳");
System.out.println("看病前"+a.getHealth());
m.cure(a);
System.out.println("看病后的健康值:"+a.getHealth());
//这里animal调用的方法在形式上看是调用Animal类中的
// toHospital()方法,实际上调用的方法是animal对象指向的子类中重写后的toHospital()方法
animal.toHospital();
4.抽象方法
以下代码有什么问题?
public abstract class Pet {
public void toHospital() {
}
}
5.抽象方法
抽象方法没有方法体
抽象方法必须在抽象类里
抽象方法必须在子类中被实现,除非子类是抽象类
6. 向下转型
7. 多态的应用
完整代码实例:
1
package cn.bdqn.demo03;
public class Master {
//定义给宠物Animal看病的方法
public void cure(Animal animal){
if(animal.getHealth()<60){
//这里animal调用的方法在形式上看是调用Animal类中的toHospital()方法,实际上调用的方法是animal对象指向的子类中重写后的toHospital()方法
animal.toHospital();
}
}
}
2.
package cn.bdqn.demo03;
public class Animal {
private String name;
private int health;
private int love;
public Animal() {
super();// 调用Object类里无参构造方法
}
public Animal(String name, int health, int love) {
super();
this.name = name;
this.health = health;
this.love = love;
}
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 int getLove() {
return love;
}
public void setLove(int love) {
this.love = love;
}
public void print() {
System.out.println("Animal:宠物信息:昵称:" + this.getName() + ",健康值:"
+ this.getHealth() + ",亲密度:" + this.getLove());
}
public void toHospital(){
System.out.println("宠物看病......");
}
}
3.
package cn.bdqn.demo03;
public class Dog extends Animal {
//在这个Dog类中只定义Dog类中特有的属性和方法,原来和Penguin类中相同的代码在Animal类中,通过继承获取,使用extends关键字来获取
private String strain;
public Dog() {
super();//表示使用Animal类中的无参构造方法
}
public Dog(String name, int health, int love, String strain) {
super(name, health, love);//表示使用Animal类中的有参构造方法
this.strain = strain;
}
public String getStrain() {
return strain;
}
public void setStrain(String strain) {
this.strain = strain;
}
public void print(){
super.print();
System.out.println("Dog:品种:"+this.getStrain());
}
@Override
public void toHospital() {
System.out.println("打针......");
this.setHealth(80);
}
//定义Dog类中特头的方法
public void eat(){
System.out.println("狗吃骨头......");
}
}
4
package cn.bdqn.demo03;
public class Cat extends Animal {
private String color;
public Cat() {
super();
}
public Cat(String name, int health, int love, String color) {
super(name, health, love);
this.color = color;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
@Override
public void print() {
super.print();
System.out.println("猫的颜色:"+this.getColor());
}
@Override
public void toHospital() {
System.out.println("打针,吃药......");
this.setHealth(90);
}
}
5
package cn.bdqn.demo03;
public class Penguin extends Animal {
//定义企鹅类中特有的属性
private String sex;
public Penguin() {
super();//表示使用Animal类中的无参构造方法
}
public Penguin(String name, int health, int love, String sex) {
super(name, health, love);
this.sex = sex;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public void print() {
super.print();
System.out.println("Penguin:性别:"+this.getSex());
}
@Override
public void toHospital() {
System.out.println("吃药......");
this.setHealth(75);
}
//定义Penguin类中特头的方法
public void swimming(){
System.out.println("企鹅会仰泳");
}
}
6
package cn.bdqn.demo03;
public class Tiger extends Animal {
private String weight;
public Tiger() {
super();
}
public Tiger(String name, int health, int love, String weight) {
super(name, health, love);
this.weight = weight;
}
public String getWeight() {
return weight;
}
public void setWeight(String weight) {
this.weight = weight;
}
@Override
public void toHospital() {
System.out.println("吃一只鸡......");
this.setHealth(99);
}
//定义Tiger类中特有的方法
public void sleep(){
System.out.println("老虎打盹");
}
}
7.
package cn.bdqn.demo03;
public class Test {
public static void main(String[] args) {
// 创建Master类对象
Master master = new Master();
//创建Dog类对象
// Dog dog = new Dog("宝马", 30, 90, "泰迪");
// master.cure(dog);
//向上转型:父类的引用(对象名)指向子类的实例(对象)
Animal animal = new Dog("奥迪", 30, 90, "泰迪");
System.out.println("看病前的健康值:"+animal.getHealth());
master.cure(animal);
System.out.println("看病后的健康值:"+animal.getHealth());
//父类引用无法调用子类中特有的方法
//animal.eat();
//向下转型:子类的引用(对象名)指向父类的引用(对象名)
Dog dog =(Dog)animal;
dog.eat();
animal = new Penguin("精灵", 20, 88, "母");
System.out.println("看病前的健康值:"+animal.getHealth());
master.cure(animal);
System.out.println("看病后的健康值:"+animal.getHealth());
//animal是父类引用,无法调用子类中特有的方法
// animal.swimming();
Penguin penguin = (Penguin)animal;
penguin.swimming();
animal = new Tiger("东北虎", 10, 99, "500公斤");
System.out.println("看病前的健康值:"+animal.getHealth());
master.cure(animal);
System.out.println("看病后的健康值:"+animal.getHealth());
//父类引用无法调用子类中特有的方法
// animal.sleep();
// Tiger tiger =(Tiger)animal;
// tiger.sleep();
// Penguin penguin2 = (Penguin)animal;//ClassCastException 类型转换异常,父类没有转换成其指向的子类
// penguin2.swimming();
/*
* 在向下转型的时候,有可能转换错误,没有转换成其指向的子类,这时候会报ClassCastException异常
* 我们可以在转型之前使用instanceof关键字进行判断父类引用指向了哪个子类对象
*
*
*/
if(animal instanceof Dog){
Dog dog2 =(Dog)animal;
dog2.eat();
}else if(animal instanceof Penguin){
Penguin penguin2 = (Penguin)animal;
penguin2.swimming();
}else if(animal instanceof Tiger){
Tiger tiger2 =(Tiger)animal;
tiger2.sleep();
}
}
}