1.多态
1)形式1:父类做形参,子类做实参
2)形式2:父类做引用类型,子类实例化(自动转换)
3)形式3:父类作为方法的返回值,子类实例化
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 *父类 宠物类 9 */ 10 public class Pet { 11 public void eat(){ 12 System.out.println("pet正在吃"); 13 } 14 }
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 *子类:狗狗类 9 */ 10 public class Dog extends Pet{ 11 public void eat(){ 12 System.out.println("狗狗吃狗粮"); 13 } 14 15 public void catchFlyDisk(){ 16 System.out.println("狗狗玩飞盘"); 17 } 18 }
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 *企鹅类 9 */ 10 public class Penguin extends Pet{ 11 public void eat(){ 12 System.out.println("企鹅吃鱼"); 13 } 14 15 public void swiming(){ 16 System.out.println("企鹅游泳"); 17 } 18 }
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 * 9 */ 10 public class Cat extends Pet { 11 public void eat(){ 12 System.out.println("猫吃猫粮"); 13 } 14 15 public void ball(){ 16 System.out.println("猫玩球"); 17 } 18 1 /**
2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 *主人类 9 */ 10 public class Master { 11 12 public void feed(Pet pet){ 13 pet.eat(); 14 } 15 16 //领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换 17 public Pet getPet(int typeid){ 18 Pet pet=null; 19 if(typeid==1){ 20 pet=new Dog(); 21 } 22 else if(typeid==2){ 23 pet=new Penguin(); 24 } 25 else if(typeid==3) 26 { 27 pet=new Cat(); 28 } 29 return pet; 30 } 31 32 33 1 package bdqn.javademos;
2 3 import java.util.Scanner; 4 5 public class Test { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 //多态的形式1 12 Dog dog=new Dog(); 13 14 Penguin peng=new Penguin(); 15 16 Cat cat=new Cat(); 17 Master ms=new Master(); 18 ms.feed(dog); 19 ms.feed(peng); 20 ms.feed(cat); 21 22 //多态的形式2:父类做类型,子类实例化 23 Pet pet=new Dog();//自动转换 24 pet.eat(); 25 26 //调用领养宠物 形式3:父类作为方法的返回类型 27 System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) "); 28 Scanner input=new Scanner(System.in); 29 int xz=input.nextInt(); 30 Master dx=new Master(); 31 Pet pets=dx.getPet(xz); 32 pets.eat(); 33 } 34 }
2.重写方法
1)位置:子类和父类中有同名的方法,
2)方法名相同,返回类型和修饰符相同。方法体不同
3.instanceof(可以当成指向的概念)
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 *父类 宠物类 9 */ 10 public class Pet { 11 public void eat(){ 12 System.out.println("pet正在吃"); 13 } 14 }
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 *子类:狗狗类 9 */ 10 public class Dog extends Pet{ 11 public void eat(){ 12 System.out.println("狗狗吃狗粮"); 13 } 14 15 public void catchFlyDisk(){ 16 System.out.println("狗狗玩飞盘"); 17 } 18 }
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 *企鹅类 9 */ 10 public class Penguin extends Pet{ 11 public void eat(){ 12 System.out.println("企鹅吃鱼"); 13 } 14 15 public void swiming(){ 16 System.out.println("企鹅游泳"); 17 } 18 }
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 * 9 */ 10 public class Cat extends Pet { 11 public void eat(){ 12 System.out.println("猫吃猫粮"); 13 } 14 15 public void ball(){ 16 System.out.println("猫玩球"); 17 } 18 }
1 /** 2 * 3 */ 4 package bdqn.javademos; 5 6 /** 7 * @author xjz 8 *主人类 9 */ 10 public class Master { 11 12 public void feed(Pet pet){ 13 pet.eat(); 14 } 15 16 //领养宠物 多态形式3:父类作为方法返回值,子类实例化 类型自动转换 17 public Pet getPet(int typeid){ 18 Pet pet=null; 19 if(typeid==1){ 20 pet=new Dog(); 21 } 22 else if(typeid==2){ 23 pet=new Penguin(); 24 } 25 else if(typeid==3) 26 { 27 pet=new Cat(); 28 } 29 return pet; 30 } 31 //主人和宠物玩耍的行为 32 public void play(Pet pet){ 33 if (pet instanceof Dog) { 34 Dog dog=(Dog)pet;//向下转型 35 dog.catchFlyDisk(); 36 }else if(pet instanceof Penguin){ 37 Penguin peng=(Penguin)pet; 38 peng.swiming(); 39 }else if(pet instanceof Cat){ 40 Cat cat=(Cat)pet; 41 cat.ball(); 42 } 43 44 45 46 } 47 48 }
1 package bdqn.javademos; 2 3 import java.util.Scanner; 4 5 public class Test { 6 7 /** 8 * @param args 9 */ 10 public static void main(String[] args) { 11 //多态的形式1 12 Dog dog=new Dog(); 13 14 Penguin peng=new Penguin(); 15 16 Cat cat=new Cat(); 17 Master ms=new Master(); 18 ms.feed(dog); 19 ms.feed(peng); 20 ms.feed(cat); 21 22 //多态的形式2:父类做类型,子类实例化 23 Pet pet=new Dog();//自动转换 24 pet.eat(); 25 26 //调用领养宠物 形式3:父类作为方法的返回类型 27 System.out.println("请选择您要领养的宠物:(1-狗狗 2-企鹅 3-猫) "); 28 Scanner input=new Scanner(System.in); 29 int xz=input.nextInt(); 30 Master dx=new Master(); 31 Pet pets=dx.getPet(xz); 32 pets.eat(); 33 34 dx.play(dog); 35 36 } 37 38 }
---多态可以减少类中的代码量
可以提高代码的可扩展性和可维护性
---向上转型——————子类转换为父类
自动进行类型转换
---向下转型——————父类转换为子类
结合instanceof运算符进行强制类型转换