Java面向对象的三大特性之一 多态

多态:

子类重写父类方法
 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);

    }

}
原文地址:https://www.cnblogs.com/3020815dzq/p/8504120.html