Java引用变量有两种类型:编译时类型和运行时类型。
编译时类型由声明该变量时使用的类型决定。
运行时类型由实际赋给该变量的对象决定。
如果编译时类型和运行时类型不一致,就会出现所谓的多态。
package com.ez; /** * @author 窗外赏雪(EZ编程网) */ public class Father { public int age=40; public void say(){ System.out.println("大人说话"); } public void eat(){ System.out.println("吃饭"); } public Father() { System.out.println("我被创建了father"); } }
package com.ez.impl; import com.ez.Father; /** * 儿子继承父亲吃饭的方法,又有自己做作业的方法,覆盖了父亲说话的方法。 * @author 窗外赏雪 */ public class Son extends Father{ public int age=15; /** * 重写父类的方法。 */ public void say(){ System.out.println("小孩说话"); } public void doHomeWork(){ System.out.println("小孩做作业"); } /** * 子类构造方法中可以使用super(参数列表)调用超类的构造方法。 * 如果子类的构造方法中没有显式的调用超类构造方法,则在产生子类的实例对象时,系统默认调用超类无参构造方法。 */ public Son(){ System.out.println("我被创建了son"); } }
package com.ez.impl; import com.ez.Father; /** * @author 窗外赏雪(EZ编程网) */ public class Test { public static void main(String[] args) { // 编译时类型和运行时类型一样,因此不存在多态 Father father = new Father(); // 创建父类对象 // 输出40 System.out.println(father.age); father.say(); father.eat(); // 编译时类型和运行时类型一样,因此不存在多态 Son son = new Son(); // 创建子类对象 // 输出15 System.out.println(son.age); son.eat(); son.say(); son.doHomeWork(); /************多态*****************/ // 编译时类型和运行时类型不一样,多态发生 Father obj = new Son(); /* * 输出40----访问的是父类属性,与方法不同的是,对象的属性则不具备多态性: * 如obj引用变量,程序中输出它的age属性时,并不是输出son类里定义的实例属性,而是输出father属性里的实例属性。 */ System.out.println(obj.age); // 执行运行时类型从父类继承到的eat方法 obj.eat(); // 执行运行时类型的say方法 obj.say(); // 因为obj的编译类型是Father,并没有提供doHomeWork方法,所以无法使用运行时类型的doHomeWork() } }
上面程序的main方法中显式创建了3个引用变量,对于前两个引用变量father和son,它们编译时类型和运行时类型完全相同,因此调用它们的属性和方法非常正常,完全没有任何问题。
第三个引用变量obj则比较特殊,它的编译时类型是Father,而运行时类型是Son,当调用该引用变量的say方法(Father类定义了该方法,子类Son覆盖了父类的该方法)实际执行的Son类中覆盖后的say方法,这就是多态。
因为子类其实是一种特殊的父类,因此JAVA允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换,或者被称为向上转型(upcasting),向上转型由系统自动完成。
引用变量在编译阶段只能调用其编译时类型所具有的方法,但运行时则执行它运行时类型所具有的方法。因此,编译JAVA代码时,引用变量只能调用声明该变量所用类里包含的方法。
与方法不同的是,对象的属性则不具备多态性:如上面的obj引用变量,程序中输出它的age属性时,并不是输出Son类里定义的实例属性,而是输出Father属性里的实例属性。
创建子类对象时,系统会隐式为其各自创建对应的父类对象。
相关推荐
java多态、继承练习题,包含题目与答案,............................................................................................................
java 个人对于多态理解和一些笔记。
java 多态
java程序设计中,多态的实现和理解,通过代码演示java程序设计中,多态的实现和理解,通过代码演示
Java多态的讲解
JAVA多态图文详解ppt,详细通过各种举例介绍JAVA多态的ppt
1:java面向对象特征:抽象,封装,继承,多态。 抽象: 封装: 继承: 多态: 写一个类,来完成以上所包含的抽象,封装,继承内容 class LaoYin extends Thread implements ...
java多态import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ComplexListener implements MouseMotionListener,MouseListener,ActionListener{ JFrame f; JTextArea tf; JButton ...
用代码实例和注释向你讲述什么是多态,实例更容易理解
主要介绍了简单了解Java多态向上转型相关原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下