Java多态

字面意思:多态就是多种形态

程序中的多态:父类引用指向子类对象

  同一个引用类型,使用不同的实例而执行不同的操作

  同一种操作,由于条件不同,产生结果不同       

例如:(1)   在王者游戏里面不论是“李白”、“鲁班”、“安琪拉”都是属于王者里的英雄角色   

           (2)再比如游戏里面的职业坦克、刺客、法师我们可以把它都归纳成职业,每个职业角色都需要装备属性的加成,所以我们可以把所有的装备统一为商店,但是每个英雄职业角色的推荐装备栏都是不相同的,所以每个英雄职业角色都会有自己特有的商店推荐装备栏。

多态对象只能调用父类中定义子类中重写的功能,并不能调用子类的特有功能,这样就实现了代码的统一。

多态的优势: 可替换性、可扩充性、灵活性、 简化性

二、如何实现多态

实现多态三要素

  • 继承关系的父子关系
  • 子类重写父类放法
  • 父类的引用指向子类的对象

代码如下(示例)

class Shape {
    void draw() {}
}
 
class Circle extends Shape {
    void draw() {
        System.out.println("Circle.draw()");
    }
}
 
class Square extends Shape {
    void draw() {
        System.out.println("Square.draw()");
    }
}
 
class Triangle extends Shape {
    void draw() {
        System.out.println("Triangle.draw()");
    }
}

多态的类型

  • 向上转s型—— ——子类到父类的转型:自动类型转换
  • 向下转型  —— ——父类到子类的转换:强制类型转换

三、向上转型:子类到父类的转换

就是将一个父类的引用指向一个子类对象

<父类型><引用变量名> = new <子类型>();

代码如下(示例):

public class ExdentShang {
    public void Student(){
        System.out.println("School Student..");
    }
    
   static class  Person extends  ExdentShang{
        public void  Student(){
            System.out.println("Dream Student");
        }
        public void play(){
            System.out.println("Play..");
        }
   }
   
    public static void main(String[] args) {
                ExdentShang x = new Person();//向上转型
                x.Student();
                
                //x.play();//报错没有此方法
        
                Person p = new Person();
                p.Student();
    }
/*运行结果是:Dream Student
             Dream Student
                                */         

}

说明:

  • 系统会自动进行类型转换
  • 通过父类引用变量调用的方法是子类覆盖或继承的子类方法,不是父类的放法
  • 通过父类应用变量无法调用子类特有的方法 

四、向下转换:父类到子类的转换

将一个指向子类对象的父类引用赋给一个子类的引用,即将父类类型转换为子类类型

向下转型必须进行强制转换

向下转型后,父类才可调用子类特有属性

<子类型><引用变量名>=(<子类型>)<父类型>;
代码如下(示例):
public class ExdentShang {
    public void Student(){
        System.out.println("School Student..");
    }
    public void time(){
        System.out.println("time.......");
    }

   static class  Person extends  ExdentShang{
        public void  Student(){
            System.out.println("Dream Student");
        }
        public void play(){
            System.out.println("Play..");
        }
   }

    public static void main(String[] args) {
                ExdentShang x = new Person();//向上转型
                x.Student();

                //x.play();//报错没有此方法

                Person p = (Person)x ;  //向下转型
                p.Student();
                p.time();
    }
   /*运行结果
                  Dream Student
                  Dream Student
                  time.......             
                                            */

}

五、instanceof运算符:运算结果true|false

进行类型判断,判断一个对象是否属于一个类或者实现了一个接口

作用:避免不必要的类型转换错误,提高代码健壮性

应用场合:向下转型之前,先使用instanceof进行判断

对象 instanceof 类|接口

注意:instanceof后的“类|接口”必须是在其前方的对象的继承树上,具有上下级关系

代码如下(示例):

public class ExdentShang {
    public void Student() {
        System.out.println("School Student..");
    }

    public void time() {
        System.out.println("time.......");
    }
}

    class  Person extends  ExdentShang {
        public void Student() {
            System.out.println("Dream Student");
        }

        public void play() {
            System.out.println("Play..");
        }

        class They extends Person{
            public void  Sum(){
                System.out.println("判断They和ExdentShang");
            }
        }

    public static void main(String[] args) {
                ExdentShang x = new Person();//向上转型
                Person p = (Person)x ;  //向下转型
                 //Object>ExdentShang>Person
                 //Object>Person>They
        //instanceof关键字可以判断左边对象是否是右边类或者子类的一个实例
        System.out.println(p instanceof Person);//true
        System.out.println(p instanceof ExdentShang);//true
        System.out.println(x instanceof They); //false
        System.out.println(p instanceof Object);//true
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值