Thinking in java学习笔记(一)--前三章

以后准备从事java方面的工作,也是为了面试笔试能得到一个好成绩,打算读一下本书,并记录一下学习心得。

一.对象入门

思考对象的时候,需要采用形象思维,而不是程序化的思维。

1. 隐藏必要的内容

对类创建者这来说,目标是从头构建一个类,只向客户程序员开放有必要开放的东西(接口:规定了可对一个特定的对象发出哪些请求),其他所有细节都隐藏起来。
“ public”(公共)意味着后续的定义任何人均可使用。而在另一方面,
“ private”(私有)意味着除您自己、类型的创建者以及那个类型的内部函数成员,其他任何人都不能访问后续的定义信息。
“friendly ”(友好的)涉及“包装”或“封装”(Package)的概念即 Java 用来构建库的方法。若某样东西是“友好的”,意味着它只能在这个包装的范围内使用(所以这一访问级别有时也叫作“包装访问”)。
“protected”(受保护的)与“private”相似,只是一个继承的类可访问受保护的成员,但不能访问私有成员。

2.一切都是对象

我们操作对象时,其实是操作指向一个对象的句柄。无论如何初始化句柄。

2.1java内存:

1. 寄存器:最快的保存区域,处理器内部,无直接控制权。
2. 堆栈(stack):驻留于常规 RAM(随机访问存储器)区域,但可通过它的“堆栈指针”获得处理的直接支持。
3. 堆(heap):一种常规用途的内存池(也在 RAM 区域),其中保存了 Java 对象。
4. :静态存储:指“位于固定位置”(尽管也在 RAM 里)。程序运行期间,静态存储的数据将随时等候调用。可用 static 关键字指出一个对象的特定元素是静态的。
5. :常数存储。常数值通常直接置于程序代码内部。
6. :非 RAM 存储。若数据完全独立于一个程序之外,则程序不运行时仍可存在,并在程序的控制范围之外。
通过一个例子来说明java内存以及调用函数时,堆和堆栈是怎么分配的。
内存分配
这里只关注堆和栈,其余的都并额外开销。
从图中可以看到,heap是向下分配的,地址越来越大。当new一个对象,在堆里申请空间。
而栈是向上分配的,地址越来越小。在run()中,当把一个new对象复制给一个对象句柄时,便会在栈中创建栈帧,而这个句柄则指向对象创建的地址。
这里写图片描述
接下来创建的p2,也是指向100c(随机),p2对象的地址。

这里写图片描述
上面说到,当进行函数调用时,会创建一个栈帧。如图,this表示指向对象本身(通过地址1000知道是p1这个对象),函数里的参数,局部变量也会在栈中申请空间,并进行操作。

这里写图片描述
当函数执行结束,java的垃圾自动回收机制就会收回函数move分配的栈空间,使这部分空间出栈,继续执行下面的语句。

这里写图片描述
这里有一个new了一个line对象(p1,p2用作参数),可以看到,堆里beg点存储了p1点的地址。而给句柄ln赋值,在栈中开辟空间,指针上移,参数p1,p2也在栈中获得空间,存储了地址。

这里写图片描述
上面所用的地址都是个随机值,不用去管具体存储了什么值,只需关注它指向了哪里。
上面这个过程简单的介绍了java创建对象,执行函数时内存的分配情况。

Java 有一个特别的“垃圾收集器”,它会查找用 new 创建的所有对象,并辨别其中哪些不再被引用。随后,它会自动释放由那些闲置对象占据的内存,以便能由新对象使用。

2.2 static关键字

通常,我们创建类时会指出那个类的对象的外观与行为。除非用 new 创建那个类的一个对象,否则实际上并未得到任何东西。只有执行了 new 后,才会正式生成数据存储空间,并可使用相应的方法。
但是,当只想用一个存储区域来保存一个特定的数据——无论要创建多少个对象,甚至根本不创建对象。另一种情形是我们需要一个特殊的方法,它没有与这个类的任何对象关联。也就是说,即使没有创建对象,也需要一个能调用的方法。
static(静态)关键字。一旦将什么东西设为 static,数据或方法就不会同那个类的任何对象实例联系到一起。提供了一种不用new对象,也能使用数据成员和成员函数的方式。

2.3 javadoc

javadoc:它采用了部分来自 Java 编译器的技术,查找我们置入程序的特殊注释标记。它不仅提取由这些标记指示的信息,也将毗邻注释的类名或方法名提取出来。这样一来,我们就可用最轻的工作量,生成十分专业的程序文档。
javadoc 命令都只能出现于“/**”注释中。

主要通过两种方式来使用 javadoc:嵌入的 HTML,或使用“文档标记”。其中,“文档标记”(Doc tags)是一些以“@”开头的命令,置于注释行的起始处(但前导的“*”会被忽略)。

类文档标记:@version, @author,@param(参数及说明),@return(返回值的意义), @exception(异常说明)

2.4 编码样式

类名:一个非正式的 Java 编程标准是大写一个类名的首字母。若类名由几个单词构成,那么把它们紧靠到一起(也就是说,不要用下划线来分隔名字)。此外,每个嵌入单词的首字母都采用大写形式。
其余:对于其他几乎所有内容:方法、字段(成员变量)以及对象句柄名称,可接受的样式与类样式差不多,只是标识符的第一个字母采用小写。

3. 控制程序流程

3.1自动递增和递减

通常将其称为“前缀版”和“后缀版”。
“前递增”表示++运算符位于变量或表达式的前面;
“后递增”表示++运算符位于变量或表达式的后面。
“前递减”意味着–运算符位于变量或表达式的前面;
“后递减”意味着–运算符位于变量或表达式的后面。

对于前递增和前递减(如++A 或–A),会先执行运算,再生成值。
而对于后递增和后递减(如 A++或 A–),会先生成值,再执行运算。

3.2 关系运算符

若想对比两个对象的实际内容是否相同,此时,必须使用所有对象都适用的特殊方法equals() 。但这个方法不适用于“主类型”,那些类型直接使用==和!=即可。注意,主类型赋值和对象赋值的不同,对象赋值操作的是句柄。

3.3 短路

操作逻辑运算符时,我们会遇到一种名为“短路”的情况。这意味着只有明确得出整个表达式真或假的结论,才会对表达式进行逻辑求值。
比如 (3 < 4)&& (4 < 2 )&& (3< 5),这个例子,到4 <2为假,即可判断整个表达式为假,而不必计算后续内容。

3.4

Math.random() 的输出中包括了 0.0。或者用数字语言表达,输出值范围是[0,1) 。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值