为什么要上溯造型

这个程序看起来也许显得有些奇怪。为什么所有人都应该有意忘记一个对象的类型呢?进行上溯造型时,就可能产生这方面的疑惑。而且如果让tune()简单地取得一个Wind句柄,将其作为自己的自变量使用,似乎会更加简单、直观得多。但要注意:假如那样做,就需为系统内Instrument的每种类型写一个全新的tune()。假设按照前面的推论,加入Stringed(弦乐)和Brass(铜管)这两种Instrument(乐器):
 

//: Music2.java
// Overloading instead of upcasting

class Note2 {
  private int value;
  private Note2(int val) { value = val; }
  public static final Note2
    middleC = new Note2(0),
    cSharp = new Note2(1),
    cFlat = new Note2(2);
} // Etc.

class Instrument2 {
  public void play(Note2 n) {
    System.out.println("Instrument2.play()");
  }
}

class Wind2 extends Instrument2 {
  public void play(Note2 n) {
    System.out.println("Wind2.play()");
  }
}

class Stringed2 extends Instrument2 {
  public void play(Note2 n) {
    System.out.println("Stringed2.play()");
  }
}

class Brass2 extends Instrument2 {
  public void play(Note2 n) {
    System.out.println("Brass2.play()");
  }
}

public class Music2 {
  public static void tune(Wind2 i) {
    i.play(Note2.middleC);
  }
  public static void tune(Stringed2 i) {
    i.play(Note2.middleC);
  }
  public static void tune(Brass2 i) {
    i.play(Note2.middleC);
  }
  public static void main(String[] args) {
    Wind2 flute = new Wind2();
    Stringed2 violin = new Stringed2();
    Brass2 frenchHorn = new Brass2();
    tune(flute); // No upcasting
    tune(violin);
    tune(frenchHorn);
  }
} ///:~

这样做当然行得通,但却存在一个极大的弊端:必须为每种新增的Instrument2类编写与类紧密相关的方法。这意味着第一次就要求多得多的编程量。以后,假如想添加一个象tune()那样的新方法或者为Instrument添加一个新类型,仍然需要进行大量编码工作。此外,即使忘记对自己的某个方法进行过载设置,编译器也不会提示任何错误。这样一来,类型的整个操作过程就显得极难管理,有失控的危险。
但假如只写一个方法,将基础类作为自变量或参数使用,而不是使用那些特定的衍生类,岂不是会简单得多?也就是说,如果我们能不顾衍生类,只让自己的代码与基础类打交道,那么省下的工作量将是难以估计的。
这正是“多形性”大显身手的地方。然而,大多数程序员(特别是有程序化编程背景的)对于多形性的工作原理仍然显得有些生疏。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索class
, static
, instrumentation
, instruments
, play
, public
, 一个
void
上溯造型、java上溯造型、上溯的意思、上溯到一千八百四十年、三角上溯模型,以便于您获取更多的相关知识。

时间: 2024-09-20 21:29:04

为什么要上溯造型的相关文章

内部类和上溯造型

迄今为止,内部类看起来仍然没什么特别的地方.毕竟,用它实现隐藏显得有些大题小做.Java已经有一个非常优秀的隐藏机制--只允许类成为"友好的"(只在一个包内可见),而不是把它创建成一个内部类. 然而,当我们准备上溯造型到一个基础类(特别是到一个接口)的时候,内部类就开始发挥其关键作用(从用于实现的对象生成一个接口句柄具有与上溯造型至一个基础类相同的效果).这是由于内部类随后可完全进入不可见或不可用状态--对任何人都将如此.所以我们可以非常方便地隐藏实施细节.我们得到的全部回报就是一个基

上溯造型的问题

在第6章,大家已知道可将一个对象作为它自己的类型使用,或者作为它的基础类型的一个对象使用.取得一个对象句柄,并将其作为基础类型句柄使用的行为就叫作"上溯造型"--因为继承树的画法是基础类位于最上方. 但这样做也会遇到一个问题,如下例所示(若执行这个程序遇到麻烦,请参考第3章的3.1.2小节"赋值"): //: Music.java // Inheritance & upcasting package c07; class Note { private int

什么是上溯造型(java)

之所以叫作这个名字,除了有一定的历史原因外,也是由于在传统意义上,类继承图的画法是根位于最顶部,再逐渐向下扩展(当然,可根据自己的习惯用任何方法描绘这种图).因素,Wind.java的继承图就象下面这个样子: 由于造型的方向是从衍生类到基础类,箭头朝上,所以通常把它叫作"上溯造型",即Upcasting.上溯造型肯定是安全的,因为我们是从一个更特殊的类型到一个更常规的类型.换言之,衍生类是基础类的一个超集.它可以包含比基础类更多的方法,但它至少包含了基础类的方法.进行上溯造型的时候,类

java的上溯造型

继承最值得注意的地方就是它没有为新类提供方法.继承是对新类和基础类之间的关系的一种表达.可这样总结该关系:"新类属于现有类的一种类型". 这种表达并不仅仅是对继承的一种形象化解释,继承是直接由语言提供支持的.作为一个例子,大家可考虑一个名为Instrument的基础类,它用于表示乐器:另一个衍生类叫作Wind.由于继承意味着基础类的所有方法亦可在衍生出来的类中使用,所以我们发给基础类的任何消息亦可发给衍生类.若Instrument类有一个play()方法,则Wind设备也会有这个方法.

rtti在java造型前的检查

迄今为止,我们已知的RTTI形式包括: (1) 经典造型,如"(Shape)",它用RTTI确保造型的正确性,并在遇到一个失败的造型后产生一个ClassCastException违例. (2) 代表对象类型的Class对象.可查询Class对象,获取有用的运行期资料. 在C++中,经典的"(Shape)"造型并不执行RTTI.它只是简单地告诉编译器将对象当作新类型处理.而Java要执行类型检查,这通常叫作"类型安全"的下溯造型.之所以叫"

java下溯造型与运行期类型标识

由于我们在上溯造型(在继承结构中向上移动)期间丢失了具体的类型信息,所以为了获取具体的类型信息--亦即在分级结构中向下移动--我们必须使用 "下溯造型"技术.然而,我们知道一个上溯造型肯定是安全的:基础类不可能再拥有一个比衍生类更大的接口.因此,我们通过基础类接口发送的每一条消息都肯定能够接收到.但在进行下溯造型的时候,我们(举个例子来说)并不真的知道一个几何形状实际是一个圆,它完全可能是一个三角形.方形或者其他形状. 为解决这个问题,必须有一种办法能够保证下溯造型正确进行.只有这样,

SUN核心解析--常规程序编写--集合类

上次关于JAVA的文章<SUN核心解析--常规程序--基本类>从简单基本类简单说名了JAVA的部分原理以及JAVA的底层对于编写优秀代码的重要性,但是就知识面是较窄的,包括今天说的集合类,也只是皮毛而已,只是从我个人的角度,由一点点实践希望可以在这方面起到一点抛砖引玉的作用,下面进入正题:   首先我从自己的角度来说,对于JAVA的内存管理思想(因为从我的角度来说不知道内存大致怎么样的,学习集合类只是应付一些常规开发而已,对集合类的底层根本一无所知,也许通过本文对集合类还是不太理解,但是大致原

在Java中应用设计模式--Factory Method

设计 在设计模式中,Factory Method也是比较简单的一个,但应用非常广泛,EJB,RMI,COM,CORBA,Swing中都可以看到此模式的影子,它是最重要的模式之一.在很多地方我们都会看到xxxFactory这样命名的类,那么,什么是Factory Method,为什么要用这个模式,如何用Java语言来实现该模式,这就是本文想要带给大家的内容. 基本概念 Factory Method是一种创建性模式,它定义了一个创建对象的接口,但是却让子类来决定具体实例化哪一个类.当一个类无法预料要

JAVA编程思想 课程进展 一

编程 第1章 对象入门 "为什么面向对象的编程会在软件开发领域造成如此震憾的影响?" 面向对象编程(OOP)具有多方面的吸引力.对管理人员,它实现了更快和更廉价的开发与维护过程.对分析与设计人员,建模处理变得更加简单,能生成清晰.易于维护的设计方案.对程序员,对象模型显得如此高雅和浅显.此外,面向对象工具以及库的巨大威力使编程成为一项更使人愉悦的任务.每个人都可从中获益,至少表面如此.如果说它有缺点,那就是掌握它需付出的代价.思考对象的时候,需要采用形象思维,而不是程序化的思维.与程序