第十一章 继承和多态

  

  11.1 引言

    面向对象的编程允许你从已经存在的类中定义新的类,这称为继承。

  11.2 父类和子类

    1.继承使得你可以定义一个通用的类(既父类),之后扩充该类为一个更加特定的类(既子类)。

    2.在Java术语中,如果类C1扩展自另外一个类C2,那么就将C1成为次类(subclass),将C2称为超类(superclass)。超类也称为父类(parent class)或基类(base class),次类又称为子类(child class)、扩展类(extended class)或派生类(derived class)。子类从它的父类中继承可访问的数据域和方法,还可以添加新数据域和新方法。

    3.下面是关于继承应该注意的几个关键点:

  • 和传统的理解不同,子类并不是父类的一个子集。实际上,一个子类通常比它的父类包含更多的信息和方法。
  • 父类中的私有数据域在该类之外是不可访问的。因此,不能再子类中直接使用。但是,如果父类中定义了公共访问器/修改器,那么可以通过这些公共的访问器/修改器来访问和修改它们。
  • 不是所有的“是一种”(is-a)关系都该用继承来建模。例如:正方形是一种矩形,但是不应该定义一个Square类来扩展Recangle类,因为width和height属性并不适合于正方形。应该定义一个继承自GeomtricObject类的Square类,并为正方形的边顶定义一个side属性。
  • 继承是用来为“是一种”关系(is-a)建模的。不要仅仅为了重用方法这个原因而盲目地扩展一个类。例如:尽管Person类和Tree类可以共享类似高度和重量这样的通用属性,但是从Person类扩展出Tree类毫无意义。一个父类和它的子类之间必须存在“是一种”(is-a)关系。
  • 某些程序设计语言是允许从几个类派生出一个子类的。这种能力称为多重继承(multiple inheritance)。但是在Java中是不允许多重继承的。一个Java类只能直接继承一个父类。这种限制称为单一继承(single inheritance)。如果使用extends关键字来定义一个子类,它只允许有一个父类。然而,多重继承是可以通过接口来实现的。

  11.3 使用super关键字

    1.关键字super指代父类,可以用于调用父类中的普通方法和构造方法。

    2.关键字super是指super关键字所在的类的父类。关键字super可以用于两种途径:

      a.调用父类的构造方法。

      b.调用父类的方法。

    11.3.1 调用父类的构造方法

     1.构造方法用于构建一个类的实例。不同于属性和普通方法,父类的构造方法不会被子类继承。它们只能使用关键字super从子类的构造方法中调用。

      调用父类构造方法的语法是:

super()或者super(parameters);

    2.语句super()调用父类的无参构造方法,而语句super(arguments)调用父类的构造方法。语句super()和语句super(arguments)必须出现在子类的构造方法的第一行,这是显示调用父类构造方法的唯一方式。

    

    11.3.2 构造方法链

     1.构造方法可以调用重载的构造方法或父类的构造方法。如果他们都没有被显示地调用,编译器就会自动的将super()作为构造方法的第一条语句。

     2.在任何情况下,构造一个类的实例是,将会调用沿着继承链的所有父类的构造方法。当构造一个子类的对象时,子类构造方法会在完成自己的任务之前,首先调用它的父类的构造方法。如果父类继承自其他类,那么父类构造方法 又会在完成自己任务之前,调用它自己的父类的构造方法。这个过程持续到沿着这个继承体系结构的最后一个构造方法被调用为止。这就是构造方法链(constructor chaining)。

     3.一般情况下,最好能为每个类提供一个无参构造方法,以便于对该类进行扩展,同时避免错误。 

    11.3.3 调用父类的方法

     关键字super不仅可以引用父类的构造方法,也可以引用父类的方法。所用语法如下:

super.方法名(参数);

     

  11.4 方法重写

     1.要重写一个方法,需要在子类中使用和父类一样的签名以及一样的返回值类型来对该方法进行定义。

       2.子类从父类中继承方法。有时,子类需要修改父类中定义的方法的实现,这称作方法重写(method overriding)。

     3.以下几点值得注意:

  • 仅当实例方法是可访问时,它才能被覆盖。因为私有方法在它的类本身以外是不能访问的,所以它不能被覆盖。如果子类中定义的方法在父类中是私有的,那么这两个方法完全没有关系。
  • 与实例方法一样,静态方法也能被继承。但是,静态方法不能被覆盖。如果父类中定义的静态方法在子类中被重新定义,那么在父类中定义的静态方法将被隐藏。可以使用语法:父类名.静态方法名(SuperClassName.staticMethodName)调用隐藏的静态方法。

  11.5 方法重写与重载

    1.重载意味着使用同样的名字但是不同的签名来定义多个方法。重写意味着在子类中提供一个对方法的新的实现。

    2.注意以下问题:

  • 方法重写发生在通过继承而相关的不同类中;方法重载可以发生在同一个类中,也可以发生在由于继承而相关的不同类中。
  • 方法重写具有同样的签名和返回值类型;方法重载具有同样的名字,但是不同的参数列表。     

  11.6 Object类及其toString()方法

    1.Java中的所有类都继承自java.lang.Object类。

    2.如果在定义一个类时没有指定继承性,那么这个类的父类就被默认为是Object。

    3.调用一个对象的toString()会返回一个描述该对象的字符串。默认情况下,它返回一个由该对象所属的类名、at符号(@)以及该对象十六进制形式的内存地址组成的字符串。

  11.7 多态

    1.多态意味着父类的变量可以指向子类对象。

    2.面向对象程序设计的三大支柱是封装、继承和多态。

    3.定义两个有用的术语:子类型和父类型。一个类型实际上定义了一种类型。子类定义的类型称为子类型(subtype),而父类定义的类型称为父类型(supertype)。

    

  11.8 动态绑定

    1.方法可以在沿着继承链的多个类中实现。JVM决定运行时调用哪个方法。

    2.方法可以在父类中定义而在子类中重写。

    3.思考下面的代码:

 

Object o=new GeometricObject();
System.out.println(o.toString());

    这里的o调用哪个toString()呢?

    为了回答这个问题,我们首先介绍两个术语:声明类型和实际类型。一个变量必须被声明为某种类型。变量的这个类型称为它的声明类型(declared type)。这里,o的声明类型为Object。一个引用类型变量可以是一个null值或者是一个对声明类型实例的引用。

    实例可以使用声明类型或它的子类型的构造方法创建。变量的实际类型(actual type)是被变量引用的对象的实际类。这里,o的实际类型是GeomtricObject,因为o指向使用new GeomtricObject()创建的对象。o调用哪个toString()方法由o的实际类型决定。

    这称为动态绑定(dynamic binding)。

      4.匹配方法的签名和绑定方法的实现是两个不同的问题。引用变量的声明类型决定了编译时匹配哪个方法。在编译时,编译器会根据参数类型、参数个数和参数顺序找到匹配的方法。一个房法可能在沿着继承链的多个类中实现。Java虚拟机在运行时动态绑定方法的实现,这是由变量的实际类型决定的。

  11.9 对象转换和instanceof运算符

  1. 对象的引用可以类型转换为另外一种对象的引用,这称为对象转换。

  2. 总是可以将一个子类的实例转换为一个父类的变量,称为向上转型(upcasting),因为子类的实例永远是它的父类的实例。当把一个父类的实例转换为它的子类变量(称为向下转型(downcasting))时,必须使用转换记号"(子类名)"进行显示转换,向编译器表明你的意图。为使转换成功,必须确保要转换的对象是子类的一个实例。如果父类不是子类的一个实例,就会出现一个运行异常ClassCastException。在尝试转换之前确保该对象是另一个对象的实例,这是可以利用运算符instanceof来实现的。

     1 public class CastingDemo {
     2
     3     public static void main(String[] args) {
     4
     5         Object object1=new CircleFromSimpleGeomtricObject(1);
     6         Object object2=new RectangleFromSimpleGeomtricObject(1,1);
     7
     8         displayObject(object1);
     9         displayObject(object2);
    10
    11     }
    12
    13     public static void displayObject(Object object){
    14         if(object instanceof CircleFromSimpleGeomtricObject){
    15             System.out.println("The circle area is: "+((CircleFromSimpleGeomtricObject) object).getArea());
    16             //diameter直径
    17             System.out.println("The circle diameter is: "+((CircleFromSimpleGeomtricObject)object).getDiameter());
    18         }else if(object instanceof RectangleFromSimpleGeomtricObject){
    19             System.out.println("The rectangle area is: "+((RectangleFromSimpleGeomtricObject) object).getArea());
    20         }
    21     }
    22
    23 }

    Object o=new Student();//向上转换
    Student b=(Student)o;//向下转换

  3. 对象成员访问运算符(.)优先于类型转换运算符。使用圆括号保证在点运算符(.)之前进行转换,例如:((Circle)object).getArea();

  4. 对基本类型值进行转换不同于对对象引用进行转换。转换基本类型值返回一个新的值。例如:int age=45;byte newAge=(byte)age;

  11.10 Object类的equals方法

  1. 在Object类中定义的另外一个常用的方法是equals方法。它的签名是:

    public boolean equals(Object 0)

  2. 这个方法测试两个对象是否相等。调用它的语法是:

    object1.equals(object2);

  3. Object类中equals方法的默认实现是:

    public boolean equals(Object obj){return (this==obj);
    }

  11.11 ArrayList类

  1. ArrayList对象可以用于存储一个对象列表。
  2. ArrayList类可以创建一个数组存储对象,但是这个数组一旦创建,它的大小就固定了。

  11.12 对于列表有用的方法

  1. Java提供了方法,用于数组创建列表、对列表排序、找到列表中的最大和最小元素,以及打乱一个列表。
  2. Arrays类中的静态方法asList返回一个列表,该列表传递给ArrayList的构造方法用于创建一个ArrayList。

  

  11.14 protected数据和方法

  1.一个类中的受保护成员可以从子类访问。

  2.我们已经使用过关键字private和public来指定是否可以从类的外部访问数据域和方法。私有成员只能在类内访问,而公共成员可以被任意的其他类访问。

  3.经常需要允许子类访问定义在父类中的数据域或方法,但不允许非子类访问这些数据域和方法。可以使用关键字protected完成该功能。父类中被保护的数据域或方法可以在它的子类中访问。

类中成员的修饰符 在同一类内可以访问 在同一包类可以访问 在子类内可访问 在不同包可访问
public
protected
(default)
private

    

    

  11.15 防止扩展和重写

  1.一个被final修饰的类和方法都不能被扩展。被final修饰的数据域是一个常数。

  2.修饰符public、protected、private、static、abstract以及final可以用在类和类的成员(数据和方法)上,只有final修饰符还可以用在方法中的局部变量上。方法内部的最终局部变量就是常量。

  

          

转载于:https://www.cnblogs.com/yang-young-young/p/6486828.html

Java语言程序设计(基础篇) 第十一章 继承和多态相关推荐

  1. Java语言程序设计 基础篇 原书第10版 ,梁勇著,百度云链接及密码

    一本好书,对java小白来说是一本非常不错的书.第一次分享,请大家多多指教, Java语言程序设计 基础篇 原书第10版 ,梁勇著 链接:https://pan.baidu.com/s/1-MN_AS ...

  2. JAVA程序设计第十版梁勇著答案_0031 Java学习笔记-梁勇著《Java语言程序设计-基础篇 第十版》英语单词...

    第01章 计算机.程序和Java概述 CPU(Central Processing Unit)*中央处理器 Control Unit*控制单元 arithmetic/logic unit /ə'rɪθ ...

  3. 《java语言程序设计-基础篇》笔记一

    第一章.计算机.程序和java概述 中央处理器 CPU由两部分组成:控制单元和算术/逻辑单元 控制单元用于控制和协调除CPU之外其他组件的动作 算术/逻辑单元用于完成数值运算和逻辑运算 每台计算机都有 ...

  4. [转载] java语言程序设计-基础篇

    参考链接: Java中的决策制定(if,if-else,switch,break,continue,jump) 第1章,计算机.程序和Java概述 包括[每个java初学者都应该搞懂的问题] http ...

  5. java语言程序设计-基础篇

    第1章,计算机.程序和Java概述 包括[每个java初学者都应该搞懂的问题] http://blog.csdn.net/haobo920/article/details/5784990 1,java ...

  6. Java语言程序设计(基础篇) 第二章

    第二章 基本程序设计 2.2 编写简单的程序 1.变量名尽量选择描述性的名字(descriptive name). 2.实数(即带小数点的数字)在计算机中使用一种浮点的方法来表示.因此,实数也称为浮点 ...

  7. java语言程序设计基础篇14.6答案_《Java语言程序设计-基础篇》答案-第15章

    第15章 异常和断言 复习题 15.1 答:略 15.2 答:声明异常是为了在方法中产生异常时,以便通知方法的调用者. 在方法声明的头部使用关键字throws 声明,一个方法可以声明多个异常.如: p ...

  8. Java语言程序设计(基础篇) 第十章 面向对象思考

    第十章 面向对象思考 10.2 类的抽象和封装 1.类的抽象是指将类的实现和类的使用分离开,实现的细节被封装并且对用户隐藏,这被称为类的封装. 2.从类外可以访问的方法和数据域的集合以及预期这些成员如 ...

  9. 《java语言程序设计 基础篇》原书第10版 PDF版 梁勇著 戴开宇译

    方式一:百度网盘 网址:https://pan.baidu.com/s/1eg3iCmnFj-r8x_RlmLkKcw 提取码:cx32 或者: 方式二:腾讯微云 链接:https://share.w ...

最新文章

  1. 从0搭建一个Springboot+vue前后端分离项目(二)使用idea进行页面搭建+页面搭建
  2. kafka分区及副本在broker的分配
  3. python槽格式里填啥_用于填充插槽的网络挂钩
  4. Java迭代器的一般用法
  5. linux parted命令,Linux分区之parted命令详解
  6. React中最基础的jsx语法
  7. 相亲交友App,婚恋交友App,开源源码可搭建H5公众号小程序App,支持个性化定制
  8. 获得浏览器设置的语言
  9. 用类描述计算机CPU的速度和硬件的容量
  10. java写一个接口_一个标准的java接口写法是怎样的?java对外接口怎么写?
  11. 芯片前沿 | 云端芯片功耗问题日益严重
  12. 关于WIN10开机启动慢的一些问题解决
  13. inventor如何画心_Illustrator | 如何画一个心型图案
  14. subversion linux 服务器端搭建 源码安装
  15. openssl心脏滴血漏洞
  16. ue4-摄像机动画Matinee(多图慎入)
  17. 【笔记】最后14堂星期二的课
  18. 社交电商平台实际包含的意义是一种工具,而不是固定的模式。
  19. AT89C51单片机交通灯仿真图+代码
  20. 二手书 | 让闲置的书籍不再孤单!

热门文章

  1. 试验一下纯手写blog
  2. 《Fast R-CNN》阅读笔记
  3. linux释放内存后设备起不来,Linux-Memory小记
  4. python判断最小公倍数
  5. python判断水仙花数
  6. c mysql查询年月日_mysql查询指定日期时间内的sql语句及原理
  7. 后端用的nodejs怎么打包_你怎么也想象不到,平板玻璃、玻璃瓶这些竟可以用PET塑钢带打包!...
  8. 萌新的Python练习菜鸟100例(十八)求s=a+aa+aaa+aaaa+aa...a的值
  9. JDBC 编程的分析
  10. SAP License:SAP 移动类型详解