多态:
子类重写父类方法
1)位置:子类和父类中有同名的方法
2)方法名相同,返回类型和修饰符相同,参数列表相同
方法体不同
多态的优势和应用场合
多态:同一个引用类型,使用不同的实例而执行不同的操作
方法重载也是多态的一种体现.
人的不同肤色不是多态
多态的终极目标:
为了实现统一调用。
多态的两种方式:
多态一:
父类普通类 方法a()
子类普通继承父类 方法a()
多态二:
父类的抽象类 方法是抽象方法a()
子类普通实现 抽象类 重写了抽象方法a()
instanceof 用来判断一个对象是否属于一个类或者实现了一个接口
简单工厂:
通过工厂类 创建子类对象 保存到父类的类型中
■多态可以减少类中代码量
·可以提高代码的可扩展性和可维护性
■向上转型一子类转换为父类,
·自动进行类型转换
■向下转型一父类转换为子类,
·结合instanceof运算符进行强制类型转换
例子:
父类:Pet package cn.javaoppDay01; public abstract class Pet { public String name; public int health=100; public int love=0; public Pet(String name) { super(); this.name = name; } public void print(){ System.out.println("我的名字是"+this.name+"健康值"+this.health+"亲密度"+this.love); } public abstract void eat(); }
package cn.javaoppDay01; 狗狗类:Dog public class Dog extends Pet { public Dog(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void eat() { } public void catchingFlyDisc(){ System.out.println("狗狗"+super.name+"正在接飞盘"); super.health =super.health-10; super.love =super.love+5; System.out.println("狗狗的健康值为:"+this.health+",亲密值为:"+this.love); } }
package cn.javaoppDay01; public class Penguin extends Pet{ 企鹅类:Penguin public Penguin(String name) { super(name); // TODO Auto-generated constructor stub } @Override public void eat() { } public void swimming(){ System.out.println("企鹅"+super.name+"正在游泳"); super.health =super.health-10; super.love =super.love+5; System.out.println("企鹅的健康值为:"+this.health+",亲密值为:"+this.love); } }
测试类: package cn.javaoppDay01; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub Dog dog=new Dog("啊啊"); dog.catchingFlyDisc(); Penguin penguin=new Penguin("哈哈"); penguin.swimming(); } }
instanceof运算符的使用
作用:用来判断一个对象是否属于一个类或者实现一个接口
类型转换比较
1.
子类转换父类
向上转型
自动转换
2.
父类转换子类
向下转型
使用isntanceof用作比较判定
子类 对象名 = (子类)父类;
使用子类对象
例子:
父类: /** *父类 宠物类 */ public class Pet { public void eat(){ System.out.println("pet正在吃"); } }
Cat:猫类 public class Cat extends Pet { public void eat(){ System.out.println("猫吃猫粮"); } public void ball(){ System.out.println("猫玩球"); } }
子类: 狗狗类 : /** *子类:狗狗类 */ public class Dog extends Pet{ public void eat(){ System.out.println("狗狗吃狗粮"); } public void catchFlyDisk(){ System.out.println("狗狗玩飞盘"); } }
子类: 企鹅类: /** *企鹅类 */ public class Penguin extends Pet{ public void eat(){ System.out.println("企鹅吃鱼"); } public void swiming(){ System.out.println("企鹅游泳"); }
主人类 /** *主人类 */ public class Master { public void feed(Pet pet){ pet.eat(); } //领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换 public Pet getPet(int typeid){ Pet pet=null; if(typeid==1){ pet=new Dog(); } else if(typeid==2){ pet=new Penguin(); } else if(typeid==3) { pet=new Cat(); } return pet; } //主人和宠物玩耍的行为 public void play(Pet pet){ if (pet instanceof Dog) { Dog dog=(Dog)pet;//向下转型 dog.catchFlyDisk(); }else if(pet instanceof Penguin){ Penguin peng=(Penguin)pet; peng.swiming(); }else if(pet instanceof Cat){ Cat cat=(Cat)pet; cat.ball(); } } }
测试类: public class Test { /** * */ public static void main(String[] args) { //多态的形式1 Dog dog=new Dog(); Penguin peng=new Penguin(); Cat cat=new Cat(); Master ms=new Master(); ms.feed(dog); ms.feed(peng); ms.feed(cat); //多态的形式2:父类做类型,子类实例化 Pet pet=new Dog();//自动转换 pet.eat(); //调用领养宠物 形式3:父类作为方法的返回类型 System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) "); Scanner input=new Scanner(System.in); int xz=input.nextInt(); Master dx=new Master(); Pet pets=dx.getPet(xz); pets.eat(); dx.play(dog); } }