java 多态[编程思想之8.2.1]

将一个方法调用同一方法主体关联进来就叫做绑定。如果在程序执行前进行绑定由编译器和连接程序实现,叫做前期绑定。这个是在面向过程的语言中不需要选择就默认的绑定方式。现在我对面各过程语言已经很模糊了,高中是只知道面向过程依稀记得那时用的好像是什么Fox或Fox什么的。

在运行时根据对象的类型进行绑定,叫做后期绑定也称动态绑定或运行时绑定。如果一种语言想实现后期绑定,,就必须具有某种机制,以便在运行时能判断对象的类型,从面调用恰当的方法。也就是说编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法体,产加以调用。后期绑定机制随语言的不同而有所不同,介是只要想一下就会得知,不管怎样都必须在对象中安置某种“类型信息”。

Java中除了static和final方法(private方法属于final方法)之外,其他所有方法都是后期绑定。所以java中所有方法都是通过动态绑定实现多态的,所以就可以编写只与基类打交道的程序代码了,并且这些代码对所有的导出类都可以正确运行。或者说是发送消息给某个对象,让该对象去断定应该做什么事。

上例子说话:

package com.ebao.java.dynamic.binding;

public class Shape {
 public void draw(){}
 public void erase(){}
}

public class Circle extends Shape {
 public void draw(){
  System.out.println("========Circle.draw()==");
 }
 public void erase(){
  System.out.println("========Circle.erase()==");
 }
}

public class Square extends Shape {
 public void draw(){
  System.out.println("========Square.draw()==");
 }
 public void erase(){
  System.out.println("========Square.erase()==");
 }
}

public class Trangle extends Shape {
 public void draw(){
  System.out.println("========Trangle.draw()==");
 }
 public void erase(){
  System.out.println("========Trangle.erase()==");
 }
}

import java.util.Random;

public class RandomShapeGenerator {
 private Random ran = new Random(47);
 public Shape next(){
  switch(ran.nextInt(3)){
   default:
   case 0:return new Circle();
   case 1:return new Square();
   case 2:return new Trangle();
  }
 }
}

public class TestShape {
 private static RandomShapeGenerator gen = new RandomShapeGenerator();
 public static void main(String[] args){
  Shape[] s = new Shape[9];
  for(int i=0;i<s.length;i++){
   s[i] = gen.next();
  }
  for(Shape shp:s)
   shp.draw();
 }
}

运行结果:

========Trangle.draw()==
========Trangle.draw()==
========Square.draw()==
========Trangle.draw()==
========Square.draw()==
========Trangle.draw()==
========Square.draw()==
========Trangle.draw()==
========Circle.draw()==

RandomShapeGenerator是一种“工厂”(factory),在每次调用next()方法时,它可以为随机选择的Shape对象产生一引用。请注意向上转型是在return语句里发生的。每个return语句取得一个指向某个Circle、Square、Triangle的引用,并将其以Shape类型从next()方法中发送出去。所以无论什么调用next()方法时,是绝对不可能知道具体类型到底是什么的。因为我们总是只能获得一通用的Shape引用。所以随机选择很好的说明了,在编译时,编译器不需要获得任何特殊信息就能进行正确的调用。对draw()方法的所有调用都是通过动态绑定进行的。

示例二: 创建一个包含两个方法的基类。在第一个方法中可以调用第二个方法。然后产生一个继承自该类的导出类,且覆盖基类中的第二个方法。为该导出类创建一个对象,将其向上转型到基类开并调用第一个方法。

package com.ebao.java.dynamic.binding;

public class Shape1 {
 public void draw(){
  System.out.println("-------------------Shape1.draw()");
  this.erase();
 }
 public void erase(){
  System.out.println("-------------------Shape1.erase()");
 }
}

public class TestShape1 extends Shape1 {
 public void erase(){
  System.out.println("-------------------TestShape1.erase()");
 }
 public static void main(String[] args){
  Shape1 s1 = new TestShape1();
  s1.draw();
 }
}

运行结果:

-------------------Shape1.draw()
-------------------TestShape1.erase()

由此可看出向上转型后的引用不管调用的方法有没有被导出类覆盖,整个过程中只要涉及到的方法被导出类覆盖了,动态绑定的就是导出类的方法。

时间: 2024-10-10 05:30:56

java 多态[编程思想之8.2.1]的相关文章

关于java 的编程思想与心得

在C++委员会会议上我所能找到的,是C++社区里最聪明的一群人,群英荟萃,为我答疑解惑.我很快意识到,这种方式之好,远超我在任何一门研究生课程中之所得.如果考虑到研究生的机会成本,这还是一笔在财务上要划算得多的生意. 我被深深吸引住了,坚持出席了有大约8年的时间.在我走后,委员会仍继续前行:虽标准仍未制定完成,但彼时Java已经出现了,还有一些其他(语言)的草案也问世了(这是技术刺激成瘾者的毛病——我的确钻研某一门语言,但我也一直在寻找更有生产力的手段:那些前景看起来很光明的语言特性可以毫不费力

Java面向对象编程思想

面向对象三个特征:封装.继承.多态封装:    语法:属性私有化(private).提供相对应的get/set 的方法进行访问(public). 在set/get的方法中对属性的数据 做相对应的业务逻辑的判断    思想:封装外面的程序不能直接访问本类的属性,需要通过本类提供的方法间 接访问本类的属性,从而提高代码的安全性.    涉及到的其他的知识点:    构造方法:用来描述对象创建过程,可以通过构造方法快速创建对象.    this关键字:代表本类对象,调用本类的属性.方法.构造方法.  

读书笔记 之java编程思想

本阶段我正在读java的编程思想这本书,这本书只是刚读了第一章的一部分,有些有些要记得所以记录下来, 我认为要记得有就是复用这样可以对对象进行增强,将一个类作为下一个类中基本类型,这样达到的服用的目的,起到对类的增强的作用.继承对于面向对象编程更是重中之重.多态的使用,原来不是很理解,原来就是浅显认为就是重载,这里边讲到了伴随着多态的可互换对象,当调用方法时传入的参数是一个基类,但当调用这个方法时将不同的子类传入这个方法,这个方法会自动的知道该调用哪一个代码去执行,这个叫做后期绑定,当子类传入函

JAVA编程思想导论(猜字谜游戏1.0)

一. 引言 本章将借用一个简易的猜字谜游戏,向读者简单介绍JAVA面向对象的部分知识以及实现思路. 二. 面向对象思想导论 为了了解什么是面向对象,我们需要解决以下几点问题(如图2.1所示): 面向对象是什么? 面向对象的特征(或者说表现形式). 为什么要面向对象(它与面向过程的区别). 面向对象该怎么做? 众所周知,计算机的编程语言是始于对机器的模仿,即以代码的形式控制机器完成人们希望所能达到的任务或者效果,故而所有编程语言都提供了抽象机制. 而这种抽象机制实际上可以这么认为——人们所能够解决

Java编程思想(五) —— 多态(上)

上一章,Java编程思想(四) -- 复用类里面讲到了向上转型,感觉和多态放在一起写更好. 多态,polymorphism.一个重要的特性,篇幅太长了,分上下两篇写. (1)向上转型 class TV{ public static void show(TV tv){ System.out.println("TV"); } } public class LeTV extends TV{ public static void main(String[] args) { LeTV letv

Java编程思想之8多态

这一章看下来,感觉比较混乱.乱感觉主要乱在8.4  8.5. 开始读的时候,感觉8.1 8.2 8.3都挺乱的.读了两遍后发现前三节还是比较有条理的. 8.1主要讲了什么是多态,多态的好处. 8.2主要讲了什么情况会发生多态?? 8.3主要讲了构造器内部里面的方法调用会发生多态. 8.4就一页,而且感觉一般用不到.用到了再看也行. 8.5也很简单,相当于一个总结,一个补充(向下转型) 我主要根据书上的内容,总结两个内容: 1.什么是多态,多态的好处: 2.什么情况下会发生多态?为什么这些情况下会

《Java编程思想(第4版)》pdf

下载地址:网盘下载 内容简介 编辑 本书赢得了全球程序员的广泛赞誉,即使是最晦涩的概念,在Bruce Eckel的文字亲和力和小而直接的编程示例面前也会化解于无形.从Java的基础语法到最高级特性(深入的面向对象概念.多线程.自动项目构建.单元测试和调试等),本书都能逐步指导你轻松掌握.[1] 从本书获得的各项大奖以及来自世界各地的读者评论中,不难看出这是一本经典之作.本书的作者拥有多年教学经验,对C.C++以及Java语言都有独到.深入的见解,以通俗易懂及小而直接的示例解释了一个个晦涩抽象的概

Java编程思想重点笔记(Java开发必看)

Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面 试过程中,而且在大型项目开发中也是常用的知识,既有简单的概念理解题(比如is-a关系和has-a关系的区别),也有深入的涉及RTTI和JVM底层 反编译知识. 1. Java中的多态性理解(注意与C++区分) Java中除了static方法和final方法(private方法本质上属于final方法,因为不能被子类访问)之外,其它所有的方法都是动态绑定,这意

【java编程思想--学习笔记(四)】对象导论

写这篇博客的前言: 长话短说,我希望通过阅读<java编程思想>来使我的代码 简洁可用 . 目的的层次不同,首先具体的目标是,了解Java的特性和巩固Java的基础. 更抽象的目的如下: 1.期待以巩固基础的方式,使代码优美,简洁,高效. 2.使自己写的模块能够开放适度,好用. 3.形成一种对代码是否优美的审美观. 于是<Java编程思想>第一章 对象导论 由此开始. 1.1 抽象过程 java 相对于命令式语言的优势在于只针对于待解问题建模.后者所做的主要抽象要求所做问题基于计算