Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.6)
2017-06-01 21:46
726 查看
4.2.6多态的实现机制是什么
多态是面向对象程序设计中代码重用的一个重要机制,它表示当同一个操作作用在不同对象时,会有不同的语义,从而产生不同的结果。(基础知识参见我前面的博客http://blog.csdn.net/qq_28814687/article/details/72722792 )在Java中,多态主要有以下两种表现方式:
1>方法的重载(overload)。重载是指同一个类中有多个同名的方法,但这些方法有着不同的参数,因此在编译时就可以确定到底调用哪个方法,它是一种编译时多态。重载可以被看做一个类中的方法多态性。
2>方法的覆盖(override)。子类可以覆盖(重写)父类的方法,因此同样的方法会在父类与子类中有着不同的表现形式。在Java语言中,基类的引用变量不仅可以指向基类的实例对象,也可以指向其子类的实例对象。同样,接口的引用变量也可以指向其实现类的实例对象。而程序调用的方法在运行期才动态绑定(绑定指的是将一个方法调用和一个方法主体连接到一起),就是引用变量所指向的具体实例对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的类型中定义的方法。通过这种动态绑定的方法实现了多态。由于只有在运行时才能确定调用哪个方法,因此通过方法重写实现的多态也可以被称为运行时多态。
代码如下:
class Base{ public Base(){ g(); } public void f(){ System.out.println("Base f()"); } public void g(){ System.out.println("Base g()"); } } class Derived extends Base{ public Derived(){ System.out.println("Derived Structor!"); } public void f(){ System.out.println("Derived f()"); } public void g(){ System.out.println("Derived g()"); } } public class Polymorphic { public static void main(String[] args){ Base b = new Derived(); b.f(); b.g(); } }
运行结果如下:
Derived g()
Derived Structor!
Derived f()
Derived g()
根据运行结果可以看到Base b = new Derived;语句调用了两个方法,首先调用了父类Base的构造器Base(),然后调用了子类Derived的构造器Derived()。这里为什么会这样呢?这是因为Derived类继承了Base类,D的构造函数里面就会隐式的有一个super(),代表了父类的构造函数,这时候父类的构造函数调用了g()方法,但是由于这时候是向上转型,此时的子类会忘记它和父类不同的方法,重写父类中的方法,所以,调用的g()方法就已经被子类重写过了;然后调用子类的构造方法Derived()。
这时候就可以理解后面两条语句为什么是Base类名.方法却调用了Derived类的方法,就是因为向上转型时的方法重写。
(关于子类调用父类的构造器,参见博客 http://blog.csdn.net/qq_28814687/article/details/72781820 中的子类调用父类的构造器)
(关于实现多态时的向上转型,参见博客 http://blog.csdn.net/qq_28814687/article/details/72722792 中的多态例题)
相关文章推荐
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.3-4.2.5)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.10-4.2.11)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.1-4.2.2)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.2面向对象技术(4.2.7-4.2.9)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.3关键字(4.3.4-4.3.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.4基本类型与运算(4.4.1)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.7输入输出流(4.7.1-4.7.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.6异常处理(4.6.1-4.6.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.8 Java平台与内存管理(4.8.1-4.8.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.1)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.2)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.11Java数据库操作(4.11.1-4.11.8)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.10多线程(4.10.1-4.10.4)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.5字符串与数组(4.5.1-4.5.3)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.5字符串与数组(4.5.4-4.5.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.3关键字(4.3.7-4.3.9)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.4基本类型与运算(4.4.5-4.4.10)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.7输入输出流(4.7.4-4.7.6)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.11-4.1.12)
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.6-4.1.7)