100天JAVA学习计划06-多态

今天我们学习面向对象的最后一个特征,多态(polymorphism)!
产生多态的原因是编译时类型和运行时类型的不一样。在之前的文章出现的代码中,两种类型都是一样的。比如Dog d = new Dog()这句话的意思是我们把一个Dog类的对象赋给了d这个变量,很开心的是,d也是一个Dog类的对象,所以并没有什么奇怪的。那么我们把声明该变量的类型叫做编译时类型,这很好理解,比如int i,我们告诉计算机,在编译的时候把i当做整型处理!所以Dog d就是编译时类型;我们把实际赋给该变量的对象类型叫做运行时类型,也就是new Dog(),这也很好理解,比如int i=0;现在计算机已经知道i我要把他当整型,那么如果在运行代码的时候i到底是多少呢,那么我们告诉计算机,运行时把i当0看,很容易懂吧!
首先给出简单多态的实现代码:

class Dog{//父类
    public String say = "我是一只狗";
    public void bark(){
        System.out.println("我会叫");
    }
    public void live(){
        System.out.println("生活就是玩耍");
    }
}

public class JinMao extends Dog{//子类
    public String say = "我是一只金毛";
    public void live(){
        System.out.println("生活就是卖萌");
    }
    public void work(){
        System.out.println("我还会工作");
    }

    public static void main(String[] args){
        Dog dog = new Dog();//不发生多态
        System.out.println(dog.say);
        dog.bark();
        dog.live();

        JinMao jm = new JinMao();//不发生多态
        System.out.println(jm.say);
        jm.bark();//从父类继承的方法
        jm.live();
        jm.work();

        Dog jmDog = new JinMao();//编译时类型和运行时类型不一样,发生多态
        System.out.println(jmDog.say);//实例变量不具备多态性,所以输出父类的say                                        
        jmDog.bark();//方法具有多态性,总是表现出子类的行为,而此处子类的bark行为是从父类继承而来
        jmDog.live();//指向子类的live方法
        //jmDog.work();//父类中没有提供work,编译出错
    }
}

程序运行结果如图:
这里写图片描述
在Java中是允许把子类对象直接付给父类的引用变量,这是一种向上的转型,在实际的代码编译过程中,计算机知道jmDog是一个父类的引用变量(编译时类型决定),但是在实际的运行过程中,确实一个子类的对象,总是指向子类方法!当然仅限于方法,实例变量(代码中的say)是不具有多态性的!是不是很简单!
最后,简单介绍一下instanceof运算符,instanceof运算符的前一个操作数通常是一个引用变量,后一个操作数通常是一个类或者接口(接口可以看成一个特殊的类,后面会讲到),它用来判断前面的对象是否是后面的类,或者其子类,实现类的实例,是返回true,不是返回false,那么举个例子,在之前代码的main方法最后加上这么一句话:

//instanceof的例子
        System.out.println("jmDog是否是JinMao类的实例"+(jmDog instanceof JinMao));

就会有这样的结果:
这里写图片描述
使用instanceof要注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面具有父子继承关系,否则编译出错。
instanceof的作用呢是在进行类型转换之前首先判断一下是否可以成功转换,让代码更加健壮!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值