【Java】《Java编程的逻辑》第4章 类的继承 笔记+感悟分享
1.继承可以复用代码,公共的属性和行为可以放到父类中,而子类只需要关注子类特有的就可以了;另一方面,不同子类的对象可以更方便的被统一管理。
2.super可以引用父类非私有的变量。
(这句话对于Java的非初学者倒是了解,主要是super确实不能引用父类的私有属性,这是不被允许的,这点需要注意呀)
3.可以说,多态和动态绑定是计算机程序的一种重要的思维方式,使得操作对象的程序不需要关注对象的实际类型,从而可以统一处理不同对象,但又能实现每个对象的特有行为。
4.静态绑定在程序编译阶段就被确定,而动态绑定则需要等到程序运行时才能确定。
(多态对于面向对象的初学者可能有点“玄学”,在我个人看来:
首先,多态基于继承,一般来讲狭义上的多态是基于子类继承父类体现出来的。
然后,看下面的一行代码:
SuperClass sup = new SubClass();
在李刚老师的《疯狂Java讲义》中,左边的SuperClass被称为编译时类型,右边的SubClass被称为运行时类型,如果马俊昌老师的讲解和李刚老师的讲解结合一下,想来是不难以理解的)
5.实例变量、静态变量、静态方法、private方法,都是静态绑定的。
6.当有多个重名函数时,在决定要调用哪个函数的过程中,首先是按照参数类型进行匹配的,换句话说,寻找在所有重载版本中最匹配的,然后才看变量的动态类型,进行动态绑定。
(注意在匹配的时候,如果有同类型的单参数的和不定长参数的两个重载函数时,使用匹配的单参数会优先匹配单参数函数,而不是不定长函数)
7.一个父类变量能不能转换成一个子类变量,取决于这个父类变量的动态类型(即引用的对象类型)是不是这个子类或者这个子类的子类。
(向下转型的时候-instanceof要用好,防止运行时异常java.lang.ClassCastException)
8.重写时,子类只能提升(或者保持)父类方法的可见性(访问权限)而不能降低。
private < (默认)< protected < public
(这个要记得啊……也是常识……)
9.final修饰的不能被继承。
(常识……)
10.继承中,用好protected可以便于实现模板模式(一种设计模式),具体的实现由子类提供。
11.继承为什么具有破坏力呢?
主要是因为继承可能会破坏封装,而封装可以说是程序设计的第一原则;另外,继承可能没有反映出is-a关系。
12.什么是封装?
封装就是隐藏实现细节,提供简化接口。
使用者只需关注怎么使用而不需要关注内部是怎么实现的。实现细节可以随时修改而不影响使用者。函数是封装,类也是封装。通过封装,才能在更高的层次上考虑和解决问题。可以说,封装是程序设计的第一原则,没有封装,代码之间就会存在着各种实现细节的依赖,这在构建和维护复杂程序时是难以想象的。
13.继承可能会破坏封装是因为子类和父类可能存在着实现细节上的依赖。
子不知道父类方法的实现细节,就难以正确的进行扩展,甚至引发错误。
子类扩展父类的时候,仅仅知道父类能做什么是不够的,还需要知道父类是怎么做的,而父类的实现细节也不能随意修改,否则可能影响子类。
更具体地说,子类需要知道父类可重写方法之间的依赖关系,而且这个依赖关系,父类不能随意改变。
即使这个依赖关系不变,封装还是可能会被破坏。
父类不能随意设置public方法,因为给父类增加public方法就是在给所有子类增加,而子类可能必须要重写该方法才能保证方法的正确性。
总结一下:
对于子类而言,通过继承实现是没有安全保障的,因为父类修改内部实现细节,它的功能就可能会被破坏;而对于父类而言,让子类继承和重写方法,就可能丧失随意修改内部实现的自由。
11.继承是用来反映is-a关系的,但是Java并没办法约束,父类有的属性和行为,子类不一定都适用,子类还可以重写父类的方法,实现与父类预期完全不一样的行为。
但对于父类引用操作子类对象的程序而言,它是把对象当做父类对象来看待的,期望对象符合父类中声明的属性和行为。如果不符合,结果是什么呢?混乱。
【Java】《Java编程的逻辑》第4章 类的继承 笔记+感悟分享相关推荐
- 【Java】《Java编程的逻辑》第3章 类的基础 笔记+感悟分享
1.通过类实现自定义的数据类型,封装该类型的数据所具有的的属性和操作,隐藏实现细节,从而在更高的层次(类和对象层次,而非基本数据类型和函数类型的层次)上考虑和操作数据,是计算机程序解决复杂问题的一种重 ...
- Java并发编程-无锁CAS与Unsafe类及其并发包Atomic
[版权申明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/72772470 出自[zejian ...
- Java程序设计(2021春)——第三章类的重用笔记与思考
Java程序设计(2021春)--第三章类的重用笔记与思考 本章概览: 3.1 类的继承(概念与语法) 3.2 Object类(在Java继承最顶层的类) 3.3 终结类和终结方法(只能拿来用,不可以 ...
- Visual C++ 2008入门经典 第九章类的继承和虚函数
// 第九章类的继承和虚函数 //.cpp: 主项目文件. //1 继承如何与面向对像的编程思想适应 //2 根据现有类定义新类 //3 使用protected关键字为类成员指定新的访问特性 //4 ...
- 《深入理解Java虚拟机》第六章 类文件结构 — 读书笔记
1. 概述 计算机只认识0和1,我们编写的程序需要经编译器翻译为由0和1构成的二进制文件才能被计算机执行.伴随着虚拟机和大量建立在虚拟机上程序语言的出现,将程序编译为本地字节码文件已不再是唯一的选择, ...
- 第五章 类的继承和super的使用调用父类构造方法
类的继承 mammals dogs cats humans lions tigers leopards 人是哺乳动物,因为人都具有哺乳动物的所有特征,但哺乳动物却不一定是人.哺乳动物类和人类之间就存在 ...
- div不继承父类样式_Python编程思想(27):类的继承
-----------支持作者请转发本文-----------李宁老师已经在「极客起源」 微信公众号推出<Python编程思想>电子书,囊括了Python的核心技术,以及Python的主要 ...
- Visual C++ 2008入门经典 第九章类的继承和虚函数(二)
//9.6.7 虚析构函数 /*#include "stdafx.h" #include <iostream> using namespace std; using n ...
- C#图解教程 第七章 类和继承
类和继承 类继承 访问继承的成员 所有类都派生自object类 屏蔽基类的成员 基类访问 使用基类的引用 虚方法和覆写方法 覆写标记为override的方法 覆盖其他成员类型 构造函数的执行 构造函数 ...
最新文章
- JAVA常见算法题(十三)
- 阿里云大数据MaxCompute计算资源分布以及LogView分析优化
- linux native分区,怎么将硬盘格式分区为Linux Native格式的
- 链式存储结构 php,【PHP 实现数据结构】链式队列
- 60-100-340-使用-DataSource-hive相关-Flink加载hive数据源
- csv处理数据后存入数据库
- javascript class
- java.io.IOException: Too many open files错误解决方案
- [unity3d]Assetbundle使用示例2(支持多平台)
- Rancher Kubernetes Engine(RKE)正式发布:闪电般的Kubernetes安装部署体验 1
- 编辑php程序推荐的软件,手机上如何才能编辑程序代码?(软件推荐)
- MicroPython-GPRS教程之TPYBoardv702GPRS功能测试
- SAP编辑器ABAP代码添加模板
- file_operation(文件操作)file(文件)inode(节点)
- CSDN的这些人,醒醒吧
- 解决WEPE(微pe)安装win11时这台电脑不符合Windows所需的最低系统要求
- Android消息处理机制之二:消息中obtain源代码剖析
- 使用r语言进行excel表格的分类与汇总
- ROCK Pi 4B+ 快速上手指南(Windows 平台)
- linux怎么查看是不是centos版本
热门文章
- 1119. Pre- and Post-order Traversals (30)
- 两点之间最短路径:弗洛伊德算法
- (None resource)-Binary system
- solr 3.5 配置及应用(二)
- 将多选框中的值,用String接收,并用‘,’隔开,到后台去循环这个数据
- 计算机一级表格样式在哪儿,word表格样式在哪 word表格样式在哪里
- oracle数据库生产,从安装系统到oracle数据库生产环境(centos6.8)搭建
- 修改form_Vue通过阿里云oss的url连接直接下载文件并修改文件名
- dt程序网站服务器配置,ZKWeb 官网与演示站点的部署步骤 (Linux + Nginx + Certbot)
- location php,Nginx服务器中的location配置详解