100天JAVA学习计划06-多态
2016-04-09 11:03
405 查看
今天我们学习面向对象的最后一个特征,多态(polymorphism)!
产生多态的原因是编译时类型和运行时类型的不一样。在之前的文章出现的代码中,两种类型都是一样的。比如Dog d = new Dog()这句话的意思是我们把一个Dog类的对象赋给了d这个变量,很开心的是,d也是一个Dog类的对象,所以并没有什么奇怪的。那么我们把声明该变量的类型叫做编译时类型,这很好理解,比如int i,我们告诉计算机,在编译的时候把i当做整型处理!所以Dog d就是编译时类型;我们把实际赋给该变量的对象类型叫做运行时类型,也就是new Dog(),这也很好理解,比如int i=0;现在计算机已经知道i我要把他当整型,那么如果在运行代码的时候i到底是多少呢,那么我们告诉计算机,运行时把i当0看,很容易懂吧!
首先给出简单多态的实现代码:
程序运行结果如图:
在Java中是允许把子类对象直接付给父类的引用变量,这是一种向上的转型,在实际的代码编译过程中,计算机知道jmDog是一个父类的引用变量(编译时类型决定),但是在实际的运行过程中,确实一个子类的对象,总是指向子类方法!当然仅限于方法,实例变量(代码中的say)是不具有多态性的!是不是很简单!
最后,简单介绍一下instanceof运算符,instanceof运算符的前一个操作数通常是一个引用变量,后一个操作数通常是一个类或者接口(接口可以看成一个特殊的类,后面会讲到),它用来判断前面的对象是否是后面的类,或者其子类,实现类的实例,是返回true,不是返回false,那么举个例子,在之前代码的main方法最后加上这么一句话:
就会有这样的结果:
使用instanceof要注意:instanceof运算符前面操作数的编译时类型要么与后面的类相同,要么与后面具有父子继承关系,否则编译出错。
instanceof的作用呢是在进行类型转换之前首先判断一下是否可以成功转换,让代码更加健壮!
产生多态的原因是编译时类型和运行时类型的不一样。在之前的文章出现的代码中,两种类型都是一样的。比如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的作用呢是在进行类型转换之前首先判断一下是否可以成功转换,让代码更加健壮!
相关文章推荐
- javase JDK 和 javaee SDK
- SpringMVC的各种参数绑定方式
- LoadRunner JAVA Vuser协议手工写脚本Failed to find Classes.zip entry in Classpath问题
- JDK与JRE的一些问题
- Java,super用法实例
- 二分法插入排序(java实现)
- leetcode01-Two Sum之beats99.47%Java版本
- Hibernate---单表操作
- Java中读取Properties文件
- 03.——Java语句的执行结构
- java IO
- 开源 免费 java CMS - FreeCMS1.9 全文检索
- JVM(1)--java内存模型
- 认真学spring官网,很容易找到spring4的jar包下载位置
- Spring装配对JSR-250的@Resourse的支持
- 【JAVA】别特注意,POI中getLastRowNum() 和getLastCellNum()的区别
- Java Web 基础知识篇
- LeetCode 242 -Valid Anagram ( JAVA )
- Java中printf()的用法
- Eclipse中JVM内存配置