《Head First Java》读书笔记——7 继承与多态

  (一)继承范例

  1、范例一:

 1 pulic class Doctor{
 2         boolean worksAtHospital;
 3         void treatPatient(){
 4             //执行检查
 5         }
 6     }
 7     public class FamilyDoctor extends Doctor{
 8         boolean makesHouseCalls;
 9         void giveAdvice(){
10             //提出诊断
11         }
12     }
13     public class Surgeon extends Doctor{
14         void treatPatient(){
15             //进行手术(重写了父类的该方法)
16         }
17         void makeIncision(){
18             //截肢
19         }
20     }

  

  2、范例二:设计动物仿真程序的继承树

  有狮子、犀牛、老虎、狗、猫、狼六种动物,设计过程如下。
  (1)找出具有共同属性和行为的对象,用继承来防止子类中出现重复的程序代码;有5个实例变量:picture(动物图片的名称),food(动物所吃的食物),hunger(代表饥饿程度的int值),boundaries(代表动物活动范围区域的长宽),location(动物在活动区域中的X与Y坐标);还有4个方法:makeNoise():动物发出声音的行为程序;eat():动物遇到事物时的行为程序;sleep():睡眠的行为程序;roam():不在进食或睡眠时候的行为程序(注:roam,漫步)
  (2)设计代表共同状态与行为的类(父类)——Animal,Animal中包含了①中的共同属性和行为;
  (3)决定子类是否需要让某项行为(也就是方法的实现)有特定不同的运作方式,比如对于eat()方法,有些动物吃素,有些动物吃肉,那么不同的动物就要重写父类的这个方法。
  (4)通过寻找使用共同行为的子类来找出更多抽象化的机会,比如猫和老虎和狮子都属于猫科动物,狗和狼都属于犬科动物,那么可以抽象出猫科动物类和犬科动物类。
  (5)完成类的继承层次。

  (二)继承的方法调用

  1、最低阶原则

  调用对象引用的方法时,会调用到与该对象类型最接近的方法,换句话说,会顺着继承树从下往上找起,最终会调用找到的第一个满足的方法,如下图所示(如果在继承树中都没有找到该方法,那么编译都不会通过)。

  2、Has-A测试:属性测试,如狗有年龄属性。
      Is-A测试:继承测试,测试继承结构的合理性,如猫是动物—>cat extends Animal
    注:继承概念下的Is-A是个单向的关系,方向不能反。如猫是动物,但动物不一定是猫。

  3、如果子类不想完全覆盖掉父类的某个方法,而是在父类的该方法上再增添内容,那么可以在子类的方法中使用super,例如:

 1 public class Animal{
 2     public void walk(){
 3         //Animal的通用walk行为
 4     }
 5     //...
 6 }
 7 public class Cat extends Animal{
 8     public void walk(){
 9         super.walk();
10         //Cat独有的其他walk行为
11     }
12 }

  4、继承的权限

  (1)下面这4种权限,左边是最受限制的,越往右边限制程度越小。
      private  default  protected  public
   (2)public类型的成员会被继承,private类型的成员不会被继承。任一类的成员包含有自己定义出来的变量和方法,再加上从父类继承下来的任何东西。

  (三)继承的其他总结

  1、继承的意义

  (1)避免了重复的程序代码;
  (2)定义出共同的协议,也就是类的对象之间共同遵守的”合约“。继承可以确保某个父类型之下的所有类都会有父类所持有的全部可继承的方法。
  2、继承VS组合

  (1)组合即为不使用继承,而是在类中先创建其他类的对象,再通过其他类的对象调用其方法,实现代码的复用。
  (2)组合比继承更灵活一些。
  (3)“is-a”的关系使用继承,如“鸟是动物”鸟类用继承,继承动物类。“have-a”的关系使用组合,如“鸟有爪子”,鸟类用组合,组合爪子类。

  (四)多态的基本概念

  1、一般声明引用和创建对象的方法:三步曲,重点在于引用类型与对象的类型要相符,在下面的例子中两者都为Dog。

  (1)声明一个引用变量(创建遥控器)
  (2)创建对象(在堆上创建对象)
  (3)连接对象和引用(设定遥控器)

  2、在多态下,引用与对象可以是不同的类型,如: Animal myDog = new Dog();  在运用多态时,引用类型可以是实际对象类型的父类。

  3、参数和返回类型也可以多态:

 1 //参数多态:
 2 public void doWalk(Animal a){
 3     a.walk();
 4 }
 5 //参数a为Animal类型,调用doWalk方法时,参数可以为Animal的任一子类的对象。
 6
 7 //返回类型多态:
 8 public Animal getSomething( ){
 9     Dog d = new Dog( );
10     //一些代码...
11     return d;
12 }
13 //通过多态,可以编写出引进新型子类时也不必修改的程序。

  4、遵守合约:覆盖的规则

  (1)参数必须要一样,且返回类型必须要兼容;
  (2)不能降低方法的存取权限,如从public改为private就是降低了权限。

  5、设计子类最多能设计多少层?

    A:没有严格层数规定,但建议层次少一点比较好。

  6、有三种方法可以防止某个类被做出子类:

       第1种是存取控制:非public的类只能被同一个包的类做出子类;
     第2种是使用final修饰类,这表示该类是继承树的末端,不能被继承;
     第3种是让类只拥有private的构造方法。
     注:将整个类标识为final表示没有任何的方法可以被覆盖。

  7、方法的重载

  (1)普通方法和构造方法都可以重载。
  (2)定义:是指同一个类中可以定义有相同的名字但参数不同的多个方法。调用时会根据不同的参数表选择对应的方法。
  (3)两同三不同:同一个类,同一个方法名;参数列表参数的类型、个数、顺序不同。
  (4)只有返回值类型不同不构成重载!只有形参名称不同也不构成重载!
  (5)典型的方法重载:

1 System.out.println(String str);
2 System.out.println(int i);
3 System.out.println(double d);
4 System.out.println();

  8、方法的重载(overload)与多态:重载的意义是两个方法的名称相同,但参数不同,所以重载与多态毫无关系。重载的方法与覆盖的方法不一样。

  9、方法的重写

  (1)与重载没有半毛钱关系!
  (2)在子类中可以根据需要对从基类继承来的方法进行重写。
  (3)重写方法必须和被重写的方法具有相同的方法名称、返回值和参数列表。

  【本章结束】

时间: 2024-10-29 19:10:48

《Head First Java》读书笔记——7 继承与多态的相关文章

Java学习笔记-4.继承与多态

一.继承机制 1.继承:允许一个类作为另一个类的扩充版本 2.单继承:一个类只继承了一个父类    多继承:一个类继承了多个父类 Java只支持单继承,C++支持多继承 二.类的继承 1.形式: class SubClass extends BaseClass { //子类类体,定义子类的新成员 } Java中所有的类都直接或间接地继承类 java.lang.Object 2.构造方法 (1)显式构造方法    形式:super(参数表); 系统执行到这条语句时,会根据参数表判断调用父类中哪个构

新标准C++程序设计读书笔记_继承和多态

简单继承的例子: 1 #include <iostream> 2 #include <string> 3 using namespace std; 4 5 class CStudent 6 { 7 private: 8 string name; 9 string id; //学号 10 char gender; //性别,'F'代表女, 'M'代表男 11 int age; 12 public: 13 void PrintInfo(); 14 void SetInfo( const

think in java 读书笔记

java中没有单独函数的概念,依赖类的方法. java中优化了向前引用,类可以在调用者之后. java中包的命名方法实际上是网址的倒转. c++中因为存在全局变量和函数所以会存在一个变量名冲突的问题,但是java中不存在全局变量,不同程序设计者通过不同的类将相同名字的变量和方法隔离. static关键字 通常,我们创建类时会指出那个类的对象的外观与行为.除非用new 创建那个类的一个对象,否则实际上并 未得到任何东西.只有执行了new 后,才会正式生成数据存储空间,并可使用相应的方法. 但在两种

Effective Java读书笔记(4 类和接口)

4.1 使类和成员的可访问性最小化 要区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰的隔离开来,然后模块之间只通过API进行通信,一个模块不需要知道其他模块内部的工作情况,这个概念被称为信息隐藏或封装,是软件设计的基本原则之一. 4.2 在公有类中使用访问方法而非公有域 坚持面向对象程序设计思想:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改

Effective Java 读书笔记(2创建和销毁对象)

第一章是引言,所以这里不做笔记,总结一下书中第一章的主要内容是向我们解释了这本书所做的事情:指导Java程序员如何编写出清晰.正确.可用.健壮.灵活和可维护的程序. 2.1考虑用静态工厂方法代替构造器 静态工厂方法与构造器相比有四大优势: (1)静态工厂方法有名称,具有适当名称的静态工厂方法易于使用.易于阅读: (2)不必每次在调用它们的时候都创建一个新的对象: (3)可以返回原返回类型的任何子类型的对象: (4)在创建参数化类型实例的时候,它们使代码变得更加简洁. 同时静态工厂方法也有两大缺点

Java学习笔记之继承

一.继承的基础 在Java术语中,被继承的类叫超类(superclass),继承超类的类叫子类(subclass). 举例说明: 1 class Box 2 { 3 public double width; 4 public double height; 5 public double depth; 6 7 //重载构造方法 8 public Box(Box ob) 9 { 10 width = ob.width; 11 height = ob.height; 12 depth = ob.dep

【java读书笔记】——java的异常处理

程序在实际环境的运行过程中,安全成为需要首先考虑的重要因素之一,这也是用户和程序员最关心的问题.同时,Java语言健壮性也体现在了能够及时有效地处理程序中的错误,准确的说是Java的异常处理机制为解决安全问题提交了一份满意的答卷. 先从整体上看一下本文要介绍的内容,然后进行详细的分析: 1.异常的概念 异常又称为例外,是特殊的运行错误对象,对应着Java语言特定的运行错误处理机制. 上面的概念是书本上说的,下面我谈一下自己的看法 其实异常处理机制提供了统一的机制来识别和响应程序错误,异常可以为我

Effective Java读书笔记(3对于所有对象都通用的方法)

3.1 覆盖equals时请遵守通用约定 什么时候应该覆盖Object.equals()方法呢? 如果类具有自己特有的"逻辑相等"概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法. Object.equals()方法具有自反性.对称性.传递性.一致性和与null比较返回false的特点. 实现高质量equals方法的诀窍: (1)使用==操作符检查"参数是否为这个对象的引用".如果是,则返回true,这

think in java 读书笔记 3 —— 数据报

目录 think in java 读书笔记 1 ——移位 think in java 读书笔记 2 —— 套接字 概要 1. 数据报基本知识 1. 数据报基本知识 之前套接字中例子使用的都是“传输控制协议”(TCP),亦称作“基于数据流的套接字”.根据该协议的设计宗旨,它具有高度的可靠性,而且能保证数据顺利抵达目的地.换言之,它允许重传那些由于各种原因半路“走失”的数据.而且收到字节的顺序与它们发出来时是一样的.当然,这种控制与可靠性需要我们付出一些代价:TCP 具有非常高的开销. 还有另一种协