【摘抄】【JAVA编程思想第四版】——第一章 对象导论

【摘抄】【JAVA编程思想第四版】——第一章 对象导论,第1张

  1. Java用三个关键字在类的内部设定边界:public、private、protected。这些访问指定词(access specifier)决定了紧跟其后被定义的东西可以被谁使用。public表示紧随其后的元素对任何人都是可用的,而private这个关键字表示除类型创建者和类型的内部方法之外的任何人都不能访问的元素。private就像你与客户端程序员之间的一堵砖墙,如果有人试图访问private成员,就会在编译时得到错误信息。Protected关键字与private作用相当,差别仅在于继承的类可以访问protected成员,但是不能访问private成员。稍后将会对继承进行介绍。
    Java还有一种默认的访问权限,当没有使用前面提到的任何访问指定词时,它将发挥作用。这种权限通常被称为包访问权限,因为在这种权限下,类可以访问在同一个包(库构件)中的其他类的成员,但是在包之外,这些成员如同指定了private一样。
  2. 最简单地复用某个类的方式就是直接使用该类的一个对象,此外也可以将那个类的一个对象置于某个新的类中。我们称其为“创建一个成员对象”。新的类可以由任意数量、任意类型的其他对象以任意可以实现新的类中想要的功能的方式所组成。因为是在使用现有的类合成新的类,所以这种概念被称为组合(composition),如果组合是动态发生的,那么它通常被称为聚合(aggregation)。组合经常被视为“has一a"(拥有)关系,就像我们常说的“汽车拥有引擎”一样。
  3. 遗憾的是,这样做还是有很多麻烦:在创建了一个类之后,即使另一个新类与其具有相似的
    功能,你还是得重新创建一个新类。如果我们能够以现有的类为基础,复制
    它,然后通过添加和修改这个副本来创建新类那就要好多了。通过继承便可
    以达到这样的效果,不过也有例外,当源类(被称为基类、超类或父类)发
    生变动时,被修改的“副本”(被称为导出类、继承类或子类)也会反映出这
    些变动(如右图所示)。
    (这张UML图中的箭头从导出类指向基类,就像稍后你会看到的,通常
    会存在一个以上的导出类。)
    类型不仅仅只是描述了作用于一个对象集合上的约束条件,同时还有与其他类型之间的关系。两个类型可以有相同的特性和行为,但是其中一个类型可能比另一个含有更多的特性,并且可以处理更多的消息(或以不同的方式来处理消息)。继承使用基类型和导出类型的概念表示了这种类型之间的相似性。一个基类型包含其所有导出类型所共享的特性和行为。可以创建一个基类型来表示系统中某些对象的核心概念,从基类型中导出其他类型,来表示此核心可以被实现的各种不同方式。
  4. 当继承现有类型时,也就创造了新的类型。这个新的类型不仅包括现有类型的所有成员(尽管private成员被隐藏了起来,并且不可访问),而且更重要的是它复制了基类的接口。也就是说,所有可以发送给基类对象的消息同时也可以发送给导出类对象。由于通过发送给类的消息的类型可知类的类型,所以这也就意味着导出类与基类具有相同的类型。在前面的例子中,“一个圆形也就是一个几何形”。通过继承而产生的类型等价性是理解面向对象程序设计方法内涵的重要门槛。
  5. 再来看看几何形状的例子。整个类族(其中所有的类都基于相同的一致接口)在本章前面已有图示。为了说明多态,我们要编写一段代码,它忽略类型的具体细节,仅仅和基类交互。这段代码和具体类型信息是分离的(decoupled),这样做使代码编写更为简单,也更易于理解。而且,如果通过继承机制添加一个新类型,例如Hexagon(六边形),所编写的代码对Shape(几何形)的新类型的处理与对已有类型的处理会同样出色。正因为如此,可以称这个程序是可扩展的。
如果用Java来编写一个方法(后面很快你就会学习如何编写):
void dosomething(Shape shape){
  shape.erase();
  //...
  shape.draw():
)

这个方法可以与任何Shape对话,因此它是独立于任何它要绘制和擦除的对象的具体类型的。
如果程序中其他部分用到了doSomethlng()方法:

Circlec circle==new Circle():
Triangle trlangle = new Triangle();
Line line = new Line():
doSomethlng(circle);
doSomethlng(triangle);
doSomethlng(line);

对doSomethlng()的调用会自动地正确处理,而不管对象的确切类型。
这是一个相当令人惊奇的诀窍。看看下面这行代码:

doSomethlng(circle);

当Circle被传入到预期接收Shape的方法中,究竟会发生什么。由于Circle可以被doSomethlng()
看作是Shape,也就是说,dosomethin()可以发送给Shape的任何消息,Circle都可以接收,那
么,这么做是完全安全且合乎逻辑的。
6. Java的垃圾回收器被设计用来处理内存释放问题(尽管它不包括清理对象的其他方面).垃
圾回收器“知道”对象何时不再被使用,并自动释放对象占用的内存。这一点同所有对象都是继承自单根基类Object以及只能以一种方式创建对象(在堆上创建)这两个特性结合起来,使得用Java编程的过程较之用C++编程要简单得多,所要做出的决策和要克服的障碍也要少得多。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/874032.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-13
下一篇 2022-05-13

发表评论

登录后才能评论

评论列表(0条)

保存