什么是多态:
用同一个引用类型,使用不同的实例,得到不同的结果
实现对台的三个要素是:
继承、方法重写、父类引用指向子类对象
1、使用多态时:是使用父类的类型,但是对象还是子类的对象
2、如果子类不重写父类的方法,那么当使用多态时,是不能调用子类的独有的方法(谁的类型,调用谁的方法)
3、但是当子类重写父类方法,使用多态调用的方法,看似是父类中的方法,但实际是子类中重写父类的那个方法
当:父类引用指向子类对象/父类类型创建子类对象时
这个对象不能够使用子类独有的方法
当使用多态时:创建对象必须是:父类类型 对象名 = new 子类构造方法();
抽象类:表示这个类的对象是不存在的,因此抽象类不能够被实例化对象
但是可以用它的类型来创建对象,通常是创建子类对象,也就是多态
因此不需要具体实现的方法,可以把这个方法定义为抽象方法
(抽象方法没有方法体)
抽象类中可以有非抽象方法和抽象方法。但是抽象方法只能存在于抽象类中。
实现多态的两种方式:使用父类作为方法参数、使用父类作为方法返回值
什么是多态:
用同一个引用类型,使用不同的实例,得到不同的结果
实现对台的三个要素是:
继承、方法重写、父类引用指向子类对象
1、使用多态时:是使用父类的类型,但是对象还是子类的对象
2、如果子类不重写父类的方法,那么当使用多态时,是不能调用子类的独有的方法(谁的类型,调用谁的方法)
3、但是当子类重写父类方法,使用多态调用的方法,看似是父类中的方法,但实际是子类中重写父类的那个方法
当:父类引用指向子类对象/父类类型创建子类对象时
这个对象不能够使用子类独有的方法
当使用多态时:创建对象必须是:父类类型 对象名 = new 子类构造方法();
抽象类:表示这个类的对象是不存在的,因此抽象类不能够被实例化对象
但是可以用它的类型来创建对象,通常是创建子类对象,也就是多态
因此不需要具体实现的方法,可以把这个方法定义为抽象方法
(抽象方法没有方法体)
抽象类中可以有非抽象方法和抽象方法。但是抽象方法只能存在于抽象类中。
实现多态的两种方式:使用父类作为方法参数、使用父类作为方法返回值
什么是多态:
用同一个引用类型,使用不同的实例,得到不同的结果
实现对台的三个要素是:
继承、方法重写、父类引用指向子类对象
1、使用多态时:是使用父类的类型,但是对象还是子类的对象
2、如果子类不重写父类的方法,那么当使用多态时,是不能调用子类的独有的方法(谁的类型,调用谁的方法)
3、但是当子类重写父类方法,使用多态调用的方法,看似是父类中的方法,但实际是子类中重写父类的那个方法
当:父类引用指向子类对象/父类类型创建子类对象时
这个对象不能够使用子类独有的方法
当使用多态时:创建对象必须是:父类类型 对象名 = new 子类构造方法();
抽象类:表示这个类的对象是不存在的,因此抽象类不能够被实例化对象
但是可以用它的类型来创建对象,通常是创建子类对象,也就是多态
因此不需要具体实现的方法,可以把这个方法定义为抽象方法
(抽象方法没有方法体)
抽象类中可以有非抽象方法和抽象方法。但是抽象方法只能存在于抽象类中。
实现多态的两种方式:使用父类作为方法参数、使用父类作为方法返回值
作业:
package com.duotai2; /** * Pet.java * @author 陈 *2019.1.21 */ public class Pet { //创建宠物类 //定义设置私有属性 :健康值 private int health; //生成get/set方法 public int getHealth() { return health; } public void setHealth(int health) { this.health = health; } //创建宠物类的方法make public void make() { System.out.println("我现在健康值是:"+this.getHealth()); } }
package com.duotai2; /** * Dog.java * @author 陈 *2019.1.21 */ public class Dog extends Pet { //创建狗狗类 继承 宠物类 //创建狗狗的私有方法pick public void pick() { System.out.println("陪狗狗玩接飞盘的游戏"); this.setHealth( this.getHealth()-1); } }
package com.duotai2; /** * Penguin.java * @author 陈 *2019.1.21 */ public class Penguin extends Pet { //创建企鹅类 继承 宠物类 //创建企鹅的私有方法swim public void swim() { System.out.println("让企鹅在南极游泳!"); this.setHealth(this.getHealth()-3); } }
package com.duotai2; /** * Test.java * @author 陈 *2019.1.21 */ public class Test { //创建一个测试类 public static void main(String[] args) { Pet pet = new Penguin(); //子类到父类的转换, pet.setHealth(80); pet.make(); //判断如果pet是Dog类,则将pet转换为Dog类型,执行Dog类特有的方法 //如果pet是Penguin类,则将pet转换为Penguin类型,执行Penguin类特有的方法 if(pet instanceof Dog) { Dog dog = (Dog)pet; dog.pick(); dog.make(); }else if(pet instanceof Penguin) { Penguin pen = (Penguin)pet; pen.swim(); pen.make(); } } }
package com.duotai; public class Pet {
private int health; public int getHealth() { return health; } public void setHealth(int health) { if(health<0||health>100) { System.out.println("输入的健康值超出范围,默认为60"); health = 60; } this.health = health; } public void make() { System.out.println(this.getHealth()); } public void eat() { } }
package com.duotai; public class Dog extends Pet { public void eat() { System.out.println("给狗狗喂狗粮"); this.setHealth(getHealth()+3); } }
package com.duotai; public class Penguin extends Pet { public void eat() { super.eat(); System.out.println("给企鹅喂鱼"); super.setHealth(getHealth()+5); } }
package com.duotai; public class Master { public void feeding(Pet pet) { if(pet.getHealth()<80) { pet.eat(); }else if(pet.getHealth()>=100) { System.out.println("吃饱了!"); } } }
package com.duotai; import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); //父类“宠物类” 引用指向子类“狗类”对象,子类到父类的转换 Pet dog = new Dog(); System.out.println("请输入狗狗的健康值"); dog.setHealth(sc.nextInt()); Master master = new Master(); master.feeding(dog); dog.make(); //父类“宠物类” 引用指向子类“企鹅类”对象,子类到父类的转换 Pet pen = new Penguin(); System.out.println("请输入企鹅的健康值"); pen.setHealth(sc.nextInt()); master.feeding(pen); pen.make(); } }