热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

《java编程思想》学习笔记——多态

2019独角兽企业重金招聘Python工程师标准8.1再论向上转型1、多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。2、“封装”通过合并特征和行为

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

8.1再论向上转型

1、多态通过分离做什么和怎么做,从另一角度将接口和实现分离开来。

2、“封装”通过合并特征和行为来创建新的的数据类型。“实现隐藏”则通过细节“私有化”把接口和实现分离开来。

3、继承允许将对象视为它自己本身的类型或其他类型来加以处理。

8.2转机

8.2.1方法调用绑定

1、将一个方法调用同一个方法主体关联起来被称作绑定,若在程序执行前进行绑定(如果有的话,由编译器和连接程序实现),叫做前期绑定。

2、后期绑定也叫做动态绑定或运行时绑定。编译器一直不知道对象的类型,但是方法调用机制能找到正确的方法,并加以调用。 3、java中除了static方法和final方法(private方法属于finla方法)之外,其他所有的方法都是后期绑定。

4、为什么要将某个方法声明为final呢?

(1)防止其他人覆盖该方法。

(2)这样做可以有效的“关闭”动态绑定,或者说,告诉编译器不需要对其进行动态绑定。

8.2.2产生正确的行为

8.2.3可扩展性

8.2.4缺陷:“覆盖”私有方法

1、private方法被自动认为是final方法,而且对导出类是屏蔽的。

2、只有非private才能可以被覆盖。

8.2.5缺陷:域与静态方法

1、只有普通的方法调用可以是多态的。例如:如果你要直接访问某个域,这个访问将在编译期进行解析。

2、如果某个方法是静态的,它的行为就是不具有多态性。

8.3构造器和多态

1、构造器并不具有多态性(它们实际上是static方法,只不过该static声明是隐式的)

8.3.1构造器的调用顺序

1、基类的构造器总是在导出类的构造过程中被调用,而且按照继承层次主键向上链接,以使每个基类的构造器都能得到调用。这是因为:构造器具有一项特殊任务,检查对象是否被正确地构造。

2、只有基类的构造器才具有恰当的知识和权限来对自己的元素进行初始化,因此必须令所有构造器得到调用,否则就不可能构造完整对象。

3、复杂对象调用构造器要遵照下面的顺序

(1)调用基类构造器

(2)按顺序调用成员的初始化方法

(3)调用导出类构造器的主体

若遵循这一规则,那么就能保证所有基类成员以及当前对象的成员对象都被初始化了。

8.3.2继承与清理

1、销毁的顺序应该和初始化顺序相反。

8.3.3构造器内部的多态方法的行为

1、如果在一个构造器的内部调用正在构造的对象的某个动态绑定方法,会发生什么情况呢?

如书上的例子:调用Glyph构造器的时候,Glyph。draw()方法被子类的方法覆盖,所以实际调用的是子类的方法,单radius还没被初始化,所以radius=0

2、编写构造器时有一天有效的准则:用尽可能的方法是对象进入正常状态,如果可以的话,避免调用其他方法

8.4协变返回类型

1、她表示在导出类的被覆盖方法可以返回基类方法的返回类型的某种导出类型。

8.5用继承进行设计

1、用继承表达行为间的差异,并用字段表达状态上的变化。


转:https://my.oschina.net/u/2427561/blog/1570817



推荐阅读
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 2018年人工智能大数据的爆发,学Java还是Python?
    本文介绍了2018年人工智能大数据的爆发以及学习Java和Python的相关知识。在人工智能和大数据时代,Java和Python这两门编程语言都很优秀且火爆。选择学习哪门语言要根据个人兴趣爱好来决定。Python是一门拥有简洁语法的高级编程语言,容易上手。其特色之一是强制使用空白符作为语句缩进,使得新手可以快速上手。目前,Python在人工智能领域有着广泛的应用。如果对Java、Python或大数据感兴趣,欢迎加入qq群458345782。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文探讨了C语言中指针的应用与价值,指针在C语言中具有灵活性和可变性,通过指针可以操作系统内存和控制外部I/O端口。文章介绍了指针变量和指针的指向变量的含义和用法,以及判断变量数据类型和指向变量或成员变量的类型的方法。还讨论了指针访问数组元素和下标法数组元素的等价关系,以及指针作为函数参数可以改变主调函数变量的值的特点。此外,文章还提到了指针在动态存储分配、链表创建和相关操作中的应用,以及类成员指针与外部变量的区分方法。通过本文的阐述,读者可以更好地理解和应用C语言中的指针。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
author-avatar
blue的诱惑的快乐生活_708
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有