1、了解继承

对象继承实际上就是一种“is - a”的关系,如上图的“PantherMan is a SuperHero?”,是,那么便属于继承的理解。

继承能避免大量重复的程序代码,同时非常利于程序扩展(子类可以在复用父类方法的同时定义额外的功能),也定义了共同的协议(确保子类拥有父类的方法)。

另外,值得注意的是,继承是无法继承下父类的private权限的属性和方法的。
 

2、多态的运行

Java中的多态表现为:
  • 静态的多态:如方法重载,方法名相同,参数不同
  • 动态的多态:如子类覆盖父类方法,将子类实例传于父类的引用,调用的是子类的方法;如实现接口的实例,将其传于接口的引用,调用的是实现类的方法。

另外,不光是引用,参数和返回类型也可以多态,但都限于子类到父类,以小到大,不能逆转。

子类继承父类之后,对于父类方法的覆盖时,访问权限不得降低,且方法头必须相同,即方法名,参数和返回类型相同,例外的是返回类型其实也可以是该类型的子类,必须要记住,子类对象得保证能够执行父类的一切。


 

3、深入多态

我们说继承可以帮助我们定义共同类型的对象,比如Animal父类,Cat和Dog作为子类;

当你new Cat我们知道出现了一只猫,当你new Dog我们知道出现了一只狗,当你new Animal?Animal是什么呢?

所以,有些类本来就不应该被初始化,只是一个抽象的概念,但是我们又要用到它的继承来实现多态,怎么办?使用abstract对它进行抽象化。


抽象类其实相对于接口不同的是,它可以有成员变量和具体的方法,甚至构造方法(尽管它不能被实例化),从上面这种抽象的解释来理解,其实也就比较容易了。它的最大的好处就是为了实现多态,如果某个方法我们的参数不使用父类,那么我们必须为每种子类各写一个相同内容仅仅是参数不同的方法,不光是大量重复的代码,一旦需要改动,那才是可怕。

你要问,那干脆把所有的类型都设置为Object不就行了?反正是终极父类,不是吗?这样,实际上你很可能会意外地要求对象去执行错误类型的动作,所以Java设置了一个对代码的保护机制,即“类型安全检查”,当某个对象以父类作为引用时,Java会把它当作父类类型实例,这代表你只能调用父类中声明的方法(即,编译器是根据引用类型来判断有哪些method可以调用,而不是根据你确实的类型),比如:

//编译器没有在Object中找到run()方法,所以第二行无法编译通过
//所以我们才有更多的范围更小的父类,而不是直接甩手用Object来处理
Object cat = new Cat();
cat.run(); // 编译无法通过
 
1
//编译器没有在Object中找到run()方法,所以第二行无法编译通过  
2
//所以我们才有更多的范围更小的父类,而不是直接甩手用Object来处理
3
Object cat = new Cat();
4
cat.run(); // 编译无法通过

4、认识接口

接口的出现,解决了Java不能多重继承的特性,同时比较独特的是,接口相当于一个特殊的抽象类,它没有实例变量,也没有具体方法的实现,有的只是常量和抽象方法。

可是这样一来,我们无法使用接口来完成所谓的“继承”,因为我们没办法复用代码,那么接口的意义在哪里呢?多态,多态,多态,重要的事情说三遍。它会要求你必须履行你们之间的“合约”,也让Java能够放心地把其实现类当作接口类型去使用。

5、对象的生命周期

在Java中,对象生存在堆(heap)上,实例变量是声明在类中,所以实例变量放在所属对象中。需要注意的是,如果实例变量是基本数据类型,那么变量所需要的空间是在对象中。如果实例变量是引用数据类型,那对象只会留下引用量,而引用对应的真正对象本身所要用到的空间则到堆上去取;

而方法调用及其参数,还有局部变量都生存在栈(stack)上,它们的生命周期直到方法调用至执行结束(如果方法中存在对象局部变量,忘了我们在Java基础中说过的吗?这不过是放了个遥控器般作用的引用,真正的对象只会存在堆上)。

而对象生存在堆(heap)上,它们的生命周期随着引用的结束而结束。如果一个对象没有引用(哪怕一个也没有的时候),那么它就等待着被垃圾回收器给带走。


5.1 栈

方法在栈中被 “堆” 在一起,当你调用一个方法时,方法就会放在栈顶,逐步堆叠,然后再逐步执行。 
 

5.2 堆

不管是实例变量还是局部变量,对象本身都会在堆上。而实例变量存在于对象所属的堆空间上。

如果实例变量是基本数据类型,那么Java会根据数据类型的大小留下对应大小的空间。如果实例变量是引用数据类型,是对象,再次记住,也只是留下了对象的引用量的空间,Java不会在这个对象中为其引用对象再留出空间的。
 

另外,实例变量是有默认值的,原始的默认值是 0 / 0.0 / false;引用的默认值是 null。而局部变量没有默认值。

 

6、构造函数和继承的关系

每个父类都有一个构造函数,且每个构造函数都会在子类对象创建时执行。并且会随着继承链不断调用父类构造函数,最终会调用Object的构造函数。为什么会有如此的一个构造链?想一想,小孩能在父母之前出生吗?


调用父类的构造函数,要使用 super(),如果我们没有编写,编译器也会帮我们自动加上调用。如果想要调用父类的代参构造函数,那么同样给super带参就可以了。

如果想要调用自己类中的其他重载的构造函数,使用this(),但是this和super只能择一,不能同时调用。


《Head First Java》读书笔记(2) - Java面向对象思想的更多相关文章

  1. 【java读书笔记】——java开篇宏观把控 + HelloWorld

    学完java有一段时间了,一直没有做对应的总结,总认为有一种缺憾.从这篇博客開始,将自己平时的学习笔记进行总结归纳,分享给大家. 这篇博客主要简单的介绍一下java的基础知识,基本的目的是扫盲.原来仅 ...

  2. [Java读书笔记] Effective Java(Third Edition) 第 7 章 Lambda和Stream

    在Java 8中,添加了函数式接口(functional interface),Lambda表达式和方法引用(method reference),使得创建函数对象(function object)变得 ...

  3. [Java读书笔记] Effective Java(Third Edition) 第 6 章 枚举和注解

    Java支持两种引用类型的特殊用途的系列:一种称为枚举类型(enum type)的类和一种称为注解类型(annotation type)的接口. 第34条:用enum代替int常量 枚举是其合法值由一 ...

  4. [Java读书笔记] Effective Java(Third Edition) 第2章 创建和销毁对象

      第 1 条:用静态工厂方法代替构造器 对于类而言,获取一个实例的方法,传统是提供一个共有的构造器. 类可以提供一个公有静态工厂方法(static factory method), 它只是一个返回类 ...

  5. [Java读书笔记] Effective Java(Third Edition) 第 4 章 类和接口

    第 15 条: 使类和成员的可访问性最小化 软件设计基本原则:信息隐藏和封装. 信息隐藏可以有效解耦,使组件可以独立地开发.测试.优化.使用和修改.   经验法则:尽可能地使每个类或者成员不被外界访问 ...

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

    程序在实际环境的执行过程中.安全成为须要首先考虑的重要因素之中的一个.这也是用户和程序猿最关心的问题.同一时候,Java语言健壮性也体如今了可以及时有效地处理程序中的错误.准确的说是Java的异常处理 ...

  7. [Java读书笔记] Effective Java(Third Edition) 第 5 章 泛型

    第 26 条:请不要使用原生态类型 声明中具有一个或多个类型参数的类或者接口,就是泛型(generic). 例如List接口只有单个类型参数E, 表示列表的元素类型.这个接口全称List<E&g ...

  8. [Java读书笔记] Effective Java(Third Edition) 第 3 章 对于所有对象都通用的方法

    第 10 条:覆盖equals时请遵守通用约定 在不覆盖equals方法下,类的每个实例都只与它自身相等. 类的每个实例本质上都是唯一的. 类不需要提供一个”逻辑相等(logical equality ...

  9. Java 读书笔记 (十七) Java 重写(Override)与重载(Overload)

    重写(Override) 重写是子类对父类的允许访问的方法的实现过程重新编写,返回值和形参都不能改变,即外壳不变,核心重写. // 如果重写不是相当于重新定义了一个方法?那为什么不直接写,还要exte ...

  10. head first java读书笔记

    head first java读书笔记 1. 基本信息 页数:689 阅读起止日期:20170104-20170215 2. 标签 Java入门 3. 价值 8分 4. 主题 使用面向对象的思路介绍J ...

随机推荐

  1. luogu3384 【模板】树链剖分

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  2. 2017多校第10场 HDU 6178 Monkeys 贪心,或者DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6178 题意:给出一棵有n个节点的树,现在需要你把k只猴子放在节点上,每个节点最多放一只猴子,且要求每只 ...

  3. 2_linux 常用基本命令

    相信当你看到此帖子时,你已不再是当年那个颓废的你,你一定也在追梦的路上奔跑,那么请留下你的“梦”,让我们用心去交流,好吗? 废话不多说,直接说正事! 一.查看磁盘分区 1.fdisk -l  查看磁盘 ...

  4. 第二章 [分布式CMS]

    结构系统:定义的后台 资源云:存在静态资源文件 文档云:文章内容 工具服务:模板.,公共类 Web服务:处理一下数据交互 为什么要做分布式了? 说实话,我也不太清楚,网上说在性能方面比较好,我的理解是 ...

  5. 粗略使用.NetCore2.0自带授权登陆Authorize

    上篇有朋友提及到如果nginx做集群后应该还会有下一篇文章主讲session控制,一般来说就是登陆:本篇分享的内容不是关于分布式session内容,而是netcore自带的授权Authorize,Au ...

  6. 浅谈JS的继承

    JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...

  7. css基础:格式与布局

    1.定位:position:fixed:锁定位置,相当于屏幕位置锁定,不随页面移动. position:absolute:绝对位置,相对于页面定位,随页面移动. position:relative:相 ...

  8. BeautifulSoup练习第一节

    一.pip install beautilfulsoup4 二.主要使用html.parser这个python标准库 三.打印首页博客的时间.打印摘要 # coding:utf-8from bs4 i ...

  9. Ibatis insert语句插入null引发的错误

    公司使用的orm框架为ibatis,其中默认的insert语句一直都是这样写的: <insert id="insert" parameterClass="activ ...

  10. Apache Camel之FTP组件学习

    写在最前面 哎,最近提了离职,手头的活也基本上清理的差不多了.想着这个把月可以舒服的晃悠晃悠的离开,但是运维的小伙伴总是不架势,走之前还是提了个新需求. 先说下需求吧,我们的系统概括的讲就是一个接口系 ...