《Java编程思想》读书笔记-类与对象
欢迎各位读者关注我的微信公众号,共同探讨Java相关技术。生命不止,学习不休!

也许你慢慢地对程序有了这样的认识:程序只是一些列带有方法的对象的组合,这些方法以其它对象为参数,可在任何地方返回,并发送消息给其他对象。这样的认识,目前来说,是对的。
一览焦点
- Java中的类
- 新建的对象去了哪里
- 谁来安置无家可归的对象
- 总结
Java中的类
决定了对象的外观与行为。Java中用class关键字来对类进行定义。
在Java中,允许程序员定义一个新的数据类型来满足其应用的需求。其形式为class后跟上新类型的名称。比如:
class NewTypeName {
//class definition
}
通过以上代码,你就定义了一个新的名为NewTypeName的数据类型。类型名称可以由程序员自己定义,而class关键字是必须的、大小写敏感的,一定不能写错。但是单纯地定义一个空类定义的类,是没有任何意义的。
类最基本的作用,在于通过类获取到相应的对象,在向对象发送消息时,以期望对象做某些特定的事情。
类的内部结构
在对类进行定义后,就可以在类中设置以下两种类型的元素:字段和方法。
先导概念
- 引用:Java中一切皆对象,因此采用一个指向对象的
引用来操纵对象。- 引用具有操作对象的能力
- 引用不一定需要有一个对象与之关联
- 基本数据类型:Java中对于小而简单的变量,采用对象的形式表示会导致原本轻量的变量变得无比厚重且耗费内存空间。所以Java中定义了8种基本数据类型,其直接
存储值,并置于虚拟机栈中。每种基本数据类型所占存储空间大小恒定不变。- 所有数值类型都有正负号
- boolean类型所占用的存储空间的大小没有明确指定,仅能取字面值true或false
- 基本数据类型都有其对应的包装类型
- 对于高精度的数字,需要用BigInteger(支持任何精度的整数)或BigDecimal(支持任何精度的定点数)来表示,二者没有对应的基本类型
- 基本数据类型如下表
| 基本类型 | 大小 | 包装类型 |
|---|---|---|
| boolean | - | Boolean |
| char | 16bit | Character |
| byte | 8bit | Byte |
| short | 16bit | Short |
| int | 32bit | Integer |
| long | 64bit | Long |
| float | 32bit | Float |
| double | 64bit | Double |
字段
字段可以是基本数据类型中的一种,也可以是任何类型的对象,可以通过其引用与其所指向的对象。如果是对某个对象的引用,那么必须通过初始化使其与一个实际的对象关联。
如何引用对象中的某个字段
对象名称.字段名称示例
class NewTypeName {
int i;
int j;
int k; public static void main(String [] args) {
NewTypeName type = new NewTypeName();
//此处type是对象的名称,其是一个引用,i/j/k分别是NewTypeName这个类中的字段
type.i = 1;
type.j = 2;
type.k = 3;
}
}
基本成员默认值
- 如果是基本数据类型并作为类的成员使用时,即使没有初始化,也会确保其有一个默认值,默认值如下表所示:
| 基本类型 | 默认值 |
|---|---|
| boolean | false |
| char | ‘\u0000’(null) |
| byte | 0 |
| short | 0 |
| int | 0 |
| long | 0l |
| float | 0.0f |
| double | 0.0d |
- 如果是基本类型且作为方法的局部变量使用时,获取的默认值可能为人一直
- 如果是引用类型,在没有进行初始化的情况下,默认为null
方法
Java中方法用来表示用
用来做某些事情的方式。方法的基本构成部分包括:方法名称、参数、返回值和方法体
一个方法的基本形式
ReturnType methodName(String arg1, Integer arg2) { /* Method Body */ }
构件解析
- 返回类型:描述方法在调用之后返回的值
- 方法名称:程序员自定义的方法的名称
- 参数列表:描述了要从外部传递给方法体的参数的类型和名称
- 方法体:描述一个方法实际要做的事情
方法名称和参数列表合起来称为“方法签名”,其唯一确定地标识出某个方法
在Java中,参数总是以值的形式进行传递。如果是基本数据类型,则传递的是类型的真值;如果是引用类型,则传递的是引用的值。Java中不存在引用传递。
return关键字在Java的方法中表示返回,存在如下两种情况:
- 如果返回类型不为void,则在return后要跟上与返回类型相兼容的值
- 如果返回类型为void,则return关键字的作用只是用来退出方法,不必在return后跟任何返回值
新建的对象去了哪里
在Java中,创建了一个引用变量后,最安全的方案就是为其绑定一个实际存在的对象,能有效防止恼人的NullPointerException(空指针异常);
对象来自哪里
Java中通过new操作符来实现对象的创建,其基本形式为:
new NewTypeName();
其中new关键字,表示向堆中申请内存;NewTypeName表示一个数据类型,在申请到内存空间后,会以这个数据类型为模板进行对象的实例化;实例化完成后,会对对象中的字段进行默认值填充。
对象存储到什么地方
在Java中有5个不同的地方可以进行数据存储:
- 寄存器:位于处理器内部,是最快的存储区,不能由程序进行直接控制
- 虚拟机栈:位于随机访问存储器(RAM)中,通过栈指针的移动进行内存分配以及内存回收,遵循上释放下分配的原则;这一区域主要存放基本数据类型及数据引用
- 堆:位于RAM中,是一种通用的存储池,对象存储的地方。在此处,编译器不需要知道存储的数据在堆里的生命周期,而由垃圾回收期进行管理
- 常量存储:常量值通常直接存放在程序代码内部
- 非RAM存储:可完全存活于程序外的数据。如流对象和持久化对象
谁来安置无家可归的对象
无家可归的对象,意味着没有引用指向该对象,该对象找不到它的归属。
在大多数语言中,都存在作用域的概念。作用域决定了在其内部定义的变量名的可见性和生命周期。在Java中不允许嵌套的作用域中,较小的作用域拥有与较大的作用域相同的变量,如下代码无法通过编译:
//此处的代码无法实际运行,只做演示
{
int x = 11;
{
int x = 12;
}
}
Java中贯彻了一切都是对象的观念。对象不具备和基本数据类型一样的生命周期。对象可以存活于作用域之外。
如以下代码:
{
String s = new String("Hello World");
}//运行到这里,s已经在作用域之外
在上述代码中,在超过作用域之后,引用变量s的生命周期已经结束,但”Hello World”这个String对象却依旧存在。其生存于堆中,只是我们再没有引用变量来指向这个对象了,因此这个对象对于我们来说是不可见的。
那么另外一个问题是,Java是如何来保障这些没有引用变量指向的对象不会把内存塞爆的呢?Java采用了垃圾回收器,用来监视所有用new关键字创建的对象,如果一个对象不再被引用,那么垃圾收集器便会在随后的内存回收活动中销毁该对象,并释放其所占用的内存。因此,Java程序员是不需要太在乎内存的回收的。
总结
本文主要以Java的类为切入点,描述了从类到对象的创建,然后到对象的存放和销毁的整个流程。由于我们大多数的时间都是在创建新的类来满足我们的业务需求,因此一个类的内部结构异常重要,好的结构能最大化地提升程序运行效率。这涉及到后面讲解的设计模式,在此只对类的构成作一个了解。
在下一节中,我们尝试运用目前已学习的内容,来完成我们的第一个Java程序。
《Java编程思想》读书笔记-类与对象的更多相关文章
- Java编程思想读书笔记 第一章 对象导论
抽象过程 纯粹的面向对象程序设计方式: 万物皆为对象: 对象可以存储数据,还可以在其自身执行操作 程序是对象的集合: 通过发送消息告诉彼此要做的 每个对象都有自己的由其它对象构成的存储:可以在程序中构 ...
- JAVA编程思想读书笔记(四)--对象的克隆
接上篇JAVA编程思想读书笔记(三)--RTTI No1: 类的克隆 public class MyObject implements Cloneable { int i; public MyObje ...
- JAVA编程思想读书笔记(三)--RTTI
接上篇JAVA编程思想读书笔记(二) 第十一章 运行期类型判定 No1: 对于作为程序一部分的每个类,它们都有一个Class对象.换言之,每次写一个新类时,同时也会创建一个Class对象(更恰当的说, ...
- JAVA编程思想读书笔记(五)--多线程
接上篇JAVA编程思想读书笔记(四)--对象的克隆 No1: daemon Thread(守护线程) 参考http://blog.csdn.net/pony_maggie/article/detail ...
- JAVA编程思想读书笔记(二)--容器
接上篇JAVA编程思想读书笔记(一) 第八章.对象的容纳 No1: java提供了四种类型的集合类:Vector(矢量).BitSet(位集).Stack(堆栈).Hashtable(散列表) No2 ...
- Java编程思想读书笔记(一)【对象导论】
2018年1月7日15:45:58 前言 作为学习Java语言的经典之作<Java编程思想>,常常被人提起.虽然这本书出版十年有余,但是内容还是很给力的.很多人说这本书不是很适合初学者,我 ...
- Java编程思想读书笔记之内部类
现在是够懒得了,放假的时候就想把这篇笔记写出来,一直拖到现在,最近在读<Java编程思想>,我想会做不止这一篇笔记,因为之前面试的时候总会问道一些内部类的问题,那这本书的笔记就从内部类开始 ...
- <Java编程思想>读书笔记(1)-对象导论、一切都是对象
1.面向对象编程:OOP (Object-oriented Programming) 2.Alan Kay 总结的面向对象语言5个基本特性: 1) 万物皆为对象 2) 程序是对象的集合,他们通过发送消 ...
- Java编程思想读书笔记(二)【一切都是对象】
begin 2018年1月9日17:06:47 第二章 一切都是对象 Java语言假设我们只进行面向对象的程序设计. 2.1 用引用操纵对象 每种编程语言都有自己的操纵内存元素的方式 操纵内存元素的方 ...
- Java编程思想读书笔记
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
随机推荐
- springboot redis key乱码
原写法: @Autowired private RedisTemplate redisTemplate; 写入redis后,查看key值 127.0.0.1:6379> keys * 1) &q ...
- c语言判断闰年作业
#include <stdio.h> int main() { int year,a; printf("请输人年份y:\n"); scanf("%d" ...
- 小白的python之路10/29 文件归档
一打包解包文件 [root@localhost ~]# cd /test/[root@localhost test]# touch a.txt b.txt c.txt[root@localhost t ...
- LVS初始使用步骤
LVS是Linux Virtual Server的简称,也就是Linux虚拟服务器, 是一个由章文嵩博士发起的自由软件项目,它的官方站点是www.linuxvirtualserver.org. 现在L ...
- sass中文注释的解决方法和一些简单用法
最近用sass来编写项目中的css,发现不能添加中文注释,报错如下 于是查阅了一下发现需要在scss文件顶部加上@charset "utf-8"即可解决. 在此顺便记录一些sass ...
- rnn应用
Weather Recognition plays an important role in our daily lives and many computer vision applications ...
- 远程连接SqlServer 数据库时提示 "在与SQL Server 建立连接时出现与网络相关的或特定实例的错误" 解决方法
前言 由于在之前的职业生涯中, 无论是数据库还是开发环境, 都是前人弄好的,自己只管使用就好啦.并不知安装过程中会出现各种各样的错.最近接触服务器之后,开发环境以及配置各方面都是从头到脚开始安装到配置 ...
- 如何使用VMware安装rhel6.4操作系统(详细步骤)
第一步,打开VMwareWorkStation11创建新的虚拟机.如下图所示. 第二步,点击文件,然后选新建虚拟机.,新建虚拟机向导,选择自定义. 第三步,选择虚拟机硬件兼容性.选择WorkStati ...
- 设置ul的指定li 样式
设置ul的最后li 的样式 .custom-consumerIndex .card-content .list-block ul li:last-child .item-inner { border- ...
- myeclipse 修改用户名密码
当在一台公共的电脑上开发程序时,就需要涉及到更改svn用户名和密码,不然直接用本机用户密码提交,有点不妥. win7系统解决方案: C:\Documents and Settings\Administ ...