关于Java的多态
2015-10-10 10:54
465 查看
多态
[1]多态的体现
方法的重载,编译时多态
方法的重写,运行时多态
[2]一个父类型的引用可以指向一个子类型的对象
[3](操作数一 instanceof 操作数二)
操作数一:一个对象的引用
操作数二:一个类型(引用数据类型)
判定操作数一所指向的对象是否为操作数二这个类型。
[4]向上转型(上溯造型) 父类 父类的引用 = 子类对象 //无需转化,可自动完成;
向下转型(下溯造型) 子类 子类的引用 = (子类)父类引用 //这个需要强转
注:转型只能用在有继承关系的对象之间
代码示例一如下:
代码示例二如下:
Shape.java
Circle.java
Rect.java
Test.java
代码示例三如下:
Usb.java
Disk.java
Printer.java
Test.java
代码示例四如下:
Animal.java:
Dog.java
代码运行的结果如下:
[1]多态的体现
方法的重载,编译时多态
方法的重写,运行时多态
[2]一个父类型的引用可以指向一个子类型的对象
[3](操作数一 instanceof 操作数二)
操作数一:一个对象的引用
操作数二:一个类型(引用数据类型)
判定操作数一所指向的对象是否为操作数二这个类型。
[4]向上转型(上溯造型) 父类 父类的引用 = 子类对象 //无需转化,可自动完成;
向下转型(下溯造型) 子类 子类的引用 = (子类)父类引用 //这个需要强转
注:转型只能用在有继承关系的对象之间
代码示例一如下:
package com.atguigu.java1; /* * 面向对象的特征三:多态性 * 1.多态性指的是什么?多态性,可以理解为一个事物的多种表型形态。 * 1)方法的重载与重写 2)子类对象的多态性 * * 2.子类对象的多态性使用的前提:①要有类的继承②要有子类对父类方法的重写 * * 3.程序运行分为编译状态和运行状态。 * 对于多态性来说,编译时,"看左边",将此引用变量理解为父类的类型 * 运行时,"看右边",关注于真正对象的实体:子类的对象。那么执行的方法就是子类重写的。 * * 4.子类对象的多态性,并不使用于属性。 */ public class TestPerson { public static void main(String[] args) { Person p = new Person(); p.eat(); p.walk(); Man m = new Man(); m.eat(); m.walk(); System.out.println(); // 子类对象的多态性:父类的引用指向子类对象 Person p1 = new Man();// 向上转型 // 虚拟方法调用:通过父类的引用指向子类的对象实体,当调用方法时,实际执行的是子类重写父类的方法 p1.eat(); p1.walk(); System.out.println("$" + p1.id);//1001 // p1.smoking = null; // p1.entertainment(); Person p2 = new Woman(); p2.eat(); p2.walk(); // p2.shopping(); Woman w = (Woman) p2;// 向下转型,使用强转符:() w.shopping(); // java.lang.ClassCastException // Woman w1 = (Woman)p1; // w1.shopping(); // Woman w2 = (Woman)new Man(); // instanceof: // 格式: 对象a instanceof 类A:判断对象a是否是类A的一个实例.是的话,返回true;否则返回false // 若a是A类的实例,那么a也一定是A类的父类的实例。 if (p1 instanceof Woman) { System.out.println("hello!"); Woman w1 = (Woman) p1; w1.shopping(); } if (p1 instanceof Man) { Man m1 = (Man) p1; m1.entertainment(); } if (p1 instanceof Person) { System.out.println("你好!"); } } public void show(Person p) {//Person p = new Man(); } // public void show(Man p) {//Man p = new Man(); // // } // // public void show(Woman p) { // // } }
代码示例二如下:
Shape.java
Circle.java
Rect.java
Test.java
代码示例三如下:
Usb.java
Disk.java
Printer.java
Test.java
代码示例四如下:
Animal.java:
package com.example; /** * Created by Will Smith on 2016/5/26. */ public class Animal { public Animal(){} public void eat(){ System.out.println("Animal is eating"); } public void sleep(){ System.out.println("Animal is sleeping"); } }
Dog.java
package com.example; /** * Created by Will Smith on 2016/5/26. */ public class Dog extends Animal { public Dog(){} public static void main(String[] strings){ Dog d1 = new Dog(); Animal a1 = d1; a1.eat(); a1.sleep(); /*** * a1是没办法调用Dog的wangwnag()方法的 * **/ System.out.println("1----------1------------1"); /*** * 这里会出现ClassCastException * ***/ /***** Animal a2 = new Animal(); Dog d2 = (Dog) a2; d2.eat(); d2.sleep(); d2.wangwang(); System.out.println("2-----------2----------2"); *****/ Dog d3 = (Dog)a1; d3.eat(); d3.sleep(); d3.wangwang(); System.out.println("3------------3---------3"); } public void eat(){ System.out.println("Dog is eating"); } public void sleep(){ System.out.println("Dog is sleeping"); } public void wangwang(){ System.out.println("Dog is wangwanging"); } }
代码运行的结果如下:
相关文章推荐
- Java彩信接口开发经验及具体开发实现
- java反射机制学习
- Struts2版本引起的问题
- java中时间比较
- java 基础第一季
- 处理myeclipse编辑jsp卡的问题
- java.lang.IllegalStateException: The remote endpoint was in state [TEXT_FULL_WRITING] which is an invalid state for called method 解决办法
- struts配置问题
- Java线程的wait() 与notify()
- Java内部类与外部类的那些事
- java中Stack类的介绍以及使用
- 8张图理解Java
- ubuntu下eclipse找不到jre
- Android项目移植:从Eclipse移植到Android Studio
- Java 内部类种类及使用解析
- Eclipse报错:!!MESSAGE Job found still running.......
- Spring获取request对象
- spring source codes import to eclipse.
- 如何获取jar包的jdk版本号
- struts配置