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的作用呢是在进行类型转换之前首先判断一下是否可以成功转换,让代码更加健壮!
- 100天JAVA学习计划06-多态
- 100天JAVA学习计划01-HelloJAVA
- 100天JAVA学习计划03-浅谈方法
- 100天JAVA学习计划04-认识封装
- 100天JAVA学习计划05-继承
- java的学习计划30天
- 100天JAVA学习计划02-类和对象
- Java学习计划
- JAVA 学习计划
- java学习计划
- java学习计划
- Java学习计划
- Java学习计划
- Java学习计划
- JAVA学习计划
- java学习计划
- java学习计划
- java 学习计划
- 3D touch功能的封装
- http缓存的使用
- Linux free 命令详解
- Android 多线程断点下载的实现方法
- 仿微信语音聊天
- 100天JAVA学习计划06-多态
- [my]coolplayer.com的信息
- POI操作EXCEL(一)
- 具体实例教你如何做LoadRunner结果分析
- C++中的头文件和原文件
- centos6.7搭建lamp超级全教程
- IOS 开发-UI初级 (三)控件:UISwitch, UIActivityIndicatorView,UISlider,UISegmentedControl
- 1.javascript基础
- SQL脚本用Navicat导入MySQL数据库出现编码问题