100天JAVA学习计划06-多态

来源:互联网 发布:淘宝返现最多的app 编辑:程序博客网 时间:2024/05/17 04:01

今天我们学习面向对象的最后一个特征,多态(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 0
原创粉丝点击