第7节 类的多态性

Posted yutianbao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第7节 类的多态性相关的知识,希望对你有一定的参考价值。

一、多态的概念

技术图片技术图片

 

  在面向对象语言中,多态是指在一棵继承树中的类中可以有多个同名但不同方法体及不同形参的方法。通常有两种途径实现多态:方法的重载和覆盖。

  多态性允许以统一的风格处理已存在的变量及相关的类。多态性使得向系统里增加新功能变得容易。继承性和多态性是降低软件复杂性有有效技术。

二、实现多态

  多态(polymoph)指的是“执行期间(而非编译期间)”判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。多态也叫动态绑定,也叫迟绑定。

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

  1. 要有继承
  2. 要有方法重写
  3. 父类引用指向子类对象
    package com.duotai;
    /**
     * 狗狗类,宠物的子类
     */
    public class Dog extends Pet {
    	private String strain="哈士奇";// 品种
    	//无参构造方法
    	public Dog(String name,int health,int love,String strain) {
    		super(name,health,love);
    		this.strain = strain;
    		System.out.println("dog类构造方法");
    	}
    	public String getStrain() {
    		return strain;
    	}
    	public void setStrain(String strain) {
    		this.strain = strain;
    	}
    	//重写父类方法
    	public void print() {
    		System.out.println("宠物的自白:
    我的名字叫" +
    				this.getName() + ",我的品种是" + this.getStrain()+",我的健康值是" + this.getHealth()
    				+ ",我和主人的亲密程度是" + this.getLove() + "。");
    	}
    	public void toHospital(){
    		if(this.getHealth()<60){
    			System.out.println("给狗狗打针、吃药");
    			this.setHealth(60);
    		}
    	}
    }
    

      

    package com.duotai;
    /**
     * 企鹅类
     */
    public class Penguin extends Pet {
    	private String sex="Q仔";// 企鹅性别
    	//构造方法
    	public Penguin(String name,int health,int love,String sex) {
    		super(name,health,love);
    		this.sex = sex;
    		System.out.println("penguin类构造方法");
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	//重写父类方法
    	public void print() {
    		System.out.println("宠物的自白:
    我的名字叫" +
    				this.getName() + ",我的性别是" + this.getSex()+",我的健康值是" + this.getHealth()
    				+ ",我和主人的亲密程度是" + this.getLove() + "。");
    	}
    	public void toHospital(){
    		if(this.getHealth()<50){
    			System.out.println("给企鹅吃药、疗养");
    			this.setHealth(70);
    		}
    	}
    }
    

      

    package com.duotai;
    /**
     * 宠物类,狗狗和企鹅的父类
     */
    public class Pet {
    	private String name = "无名氏";// 昵称
    	private int health = 100;// 健康值
    	private int love = 20;// 亲密度
    	/**
    	 * 无参构造方法
    	 */
    	public Pet() {
    		System.out.println("父类无参构造方法");
    	}
    	/**
    	 * 有参构造方法
    	 * @param name  昵称
    	 */
    	public Pet(String name,int health,int love) {
    		this.name = name;
    		this.health = health;
    		this.love = love;
    		System.out.println("父类有参构造方法");
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public int getHealth() {
    		return health;
    	}
    	public void setHealth(int health) {
    		if(health<0||health>100){
    			System.out.println("健康值应该在0至100之间,默认值为60");
    			this.health=60;
    			return;
    		}
    		this.health = health;
    	}
    	public int getLove() {
    		return love;
    	}
    	public void setLove(int love) {
    		if(love<0||love>100){
    			System.out.println("亲密度应该在0至100之间,默认值为15");
    			this.love=15;
    			return;
    		}
    		this.love = love;
    	}
    
    	/**
    	 * 输出宠物信息
    	 */
    	public void print() {
    		System.out.println("宠物的自白:
    我的名字叫" +
    				this.name + ",我的健康值是" + this.health
    				+ ",我和主人的亲密程度是" + this.love + "。");
    	}
    	public void toHospital(){
    	}
    }
    

      

    package com.duotai;
    /*
     * 主人类
     */
    public class Master {
    //    //给狗狗看病方法
    //    public void cure(Dog dog){
    //        if(dog.getHealth()<60){
    //            System.out.println("给宠物打针、吃药");
    //            dog.setHealth(60);
    //        }
    //    }
    //    //给企鹅看病方法
    //    public void cure(Penguin pgn){
    //        if(pgn.getHealth()<60){
    //            System.out.println("给宠物吃药、疗养");
    //            pgn.setHealth(70);
    //        }
    //    }
        //给宠物看病
        public void cure(Pet pe){
            pe.toHospital();
        }
    }
    

      

    package com.duotai;
    //测试类
    public class Test {
    	public static void main(String[] args) {
    		// 1、创建宠物对象pet并输出信息
    //		Pet pet = new Pet("苏苏",99,60);
    //		pet.print();
    		Master master = new Master();  //实例化主人对象
    		// 2、创建狗狗对象dog并输出信息
    		//Dog dog = new Dog("丫丫",45,40,"牧羊犬");
    		Pet pdog = new Dog("丫丫",45,40,"牧羊犬");  //向上转型
    		master.cure(pdog);
    		pdog.print();
    		// 3、创建企鹅对象pgn并输出信息
    //		Penguin pgn = new Penguin("果果",85,20,"Q妹");
    //		pgn.print();
    		//同一引用类型        不同的实例
    		Pet ppegn = new Penguin("果果",10,20,"Q妹");
    		//多态:1、方法重写是实现多态的基础  2、同一引用类型,使用不同的实例而执行不同操作
    		master.cure(ppegn);  //执行不同操作
    		ppegn.print();
    	}
    }
    

    技术图片

     

以上是关于第7节 类的多态性的主要内容,如果未能解决你的问题,请参考以下文章

阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第7节 内部类_8_成员内部类的定义

阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第7节 内部类_15_类作为成员变量类型

java 代码片段

阶段1 语言基础+高级_1-3-Java语言高级_02-继承与多态_第7节 内部类_20_发红包案例_手气红包随机

第一小节 初识面向对象

实验7:类的多态