Thinking in Java读书笔记(1-3章)

来源:转载

第一章.对象导论
这一章主要从面向对象概念概括的描述了java技术的相关概念,其中包括以下几个点:
1、对象的概念以及抽象的过程
世界万事万物如果想要在程序中描绘出来都需要一个抽象的过程,一个复杂的系统都是由很多的对象构成,这些对象分别提供自身的服务功能。特定类型的所有对象可以接受同一消息并提供服务,这种概念是OOP思想中最重要的多态特征。
抽象出的类同样也是一个模板,你可以依据这个模板创建任意多个对象。

2、封装以及访问控制
程序开发中往往可以分为类创建者和客户端程序,类创建者往往希望只暴露必须的部分,而隐藏内部实现。这就需要对数据及方法进行访问控制。这样也有另外一个好处,当内部实现修改之后并不会影响到客户端程序。Java用到以下几个关键字及其作用域:
public protected 默认 private
当前类 可访问 可访问 可访问 可访问
同一包 可访问 不可 可访问 不可
子孙类 可访问 可访问 不可 不可
其它包 可访问 不可 不可 不可

3、继承以及复用
类复用包括组合、引用、继承。在程序设计时由于继承可以清晰体现类的层次结构而且这个功能也是面向对象设计最重要的思想之一,但是这种继承关系太多会造成程序复杂,组合则是另外一种灵活的实现思路。一个类只能继承一个父类。
后期绑定:编译器只对方法的参数和返回值进行检查,并不对具体执行那一段代码做限制,当程序运行时才确定具体执行哪一个子类代码。这也是java多态特性的具体体现。

4、容器及泛型的简单概念
如果在不清楚具体需要多少个对象时,往往对于存储对象是比较复杂的,Java提供了集合框架能够很好的解决这一问题。在使用容器时应该根据其特性以及扩展方式比较熟悉才能够很好地运用。
当容器存储对象和取出对象的过程中会对容器中所存放的对象进行类型的判断和转换,有时候并没有明确装入的对象会造成取出对象时类型转换异常。JavaSE5提供了参数化类型(即泛型),这样容器中装入的对象类型在使用方和取出时一目了然。

5、对象的创建和生命周期
Java中采用动态内存分配方式,当需要一个新对象时可以在堆中创建(使用 new关键字)。而对于对象的销毁编译器可以知道对象的的存活时间并自动销毁。Java的垃圾回收器就是用来解决对象的生命周期问题。

6、异常处理
Java内置了异常处理功能,程序员只需要在出现异常的地方抛出并在可能出现异常的地方进行捕获。就可以使得程序运行过程中大大减少其出现错误的概率。

7、并发
对于现在处理器下面多任务的程序运行模式下,对与处理多线程程序会是比较高水平的操作。虽然线程是在单进程下面运行。但是需要处理多个线程之间通信,多线程
并发问题会是一个值得深入研究的问题。

第二章.一切都是对象
第二章的标题就是一切皆对象,在java中用引用操作对象,在java代码中:
1 String s;//这里创建了一个String的引用s,但是没有指向任何的String对象
2 s = new String("hello");//将引用指向通过new创建的String对象
3 s.toUpperCase();//通过引用s向它指向的对象发出信息,即通过引用来操作引用指向的对象,将刚刚创建的String对象中的字符变大写。
4 String str = new String("hello");//在创建的同时初始化对象。
对象在java中是存在什么地方的?内存是怎么分配的呢?
1.寄存器。这是最快的存储区,它位于处理器的内部,而且数量及其有限,所以我们不能直接控制,是按需分配的。
2.堆栈。堆栈位于通用的RAM中,通过堆栈指针来分配或者释放内存,通过堆栈指针的移动来快速有效的分配内存,速度仅次于寄存器,这个地方重要存储java中对象的引用和元数据,在这里,java系统必须知道堆栈内所有项的确切的生命周期,以便来通过移动堆栈指针来释放和分配内存。
3.堆。一种通用的内存池,同样位于RAM中,用于存放所有的java对象。在堆中,java编译器不需要知道存储的数据在堆里的存活时间,这样分配起来比较容易,所以当我们使用new在创建一个新的对象的时候,代码执行,会自动的在堆里进行存储分配。最后他告诉我们的是,灵活是要有代价的,代价就是我们在堆里分配和清理需要比堆栈里面的分配和清理花费更多的时间。
4.常量存储。这里存储程序中永远不会改变的常量。
5.非RAM存储。
java中的基本类型,主要包含八类,包括boolean,char,byte,short,int,long,float,double,基本类型不用通过new来创建,而且它存储在速度更快的堆栈中,存取起来更加的高效。同时也介绍到java基本数据类型的默认值。同时java提供了两个用于高精度计算的类:BigInteget和BigDecimal,前者支持任意精度的整数,后者支持任意精度的浮点数。
6.Java中的数组
Java确保数组会被初始化,而且不能在它的范围之外被访问。当创建一个数组对象时,实际上就是创建一个引用数组,并且每个引用都会自动被初始化为一个特定值,该值拥有自己的关键字null。一旦Java看到null,就知道这个引用还没有指向某个对象。
7.永远不需要销毁对象
作用域:在作用域里定义的变量只可用于作用域结束之前。Java不允许将一个较大的作用域的变量“隐藏”起来
对象的作用域:Java对象不具备和基本类型一样的生命周期。当用new创建一个Java对象时,它可以存活于作用域之外。但是其引用的作用域终点就消失了,然而,引用所指向的对象仍继续占据内存空间。
Java的垃圾回收器,用来监视用new创建的所有对象,并辩别那些不会再被引用的对象。随后,释放这些对象的内在空间,以便供其他新的对象使用。

8.创建新的数据类型
字段和方法,Java中新的数据类型由字段和方法组成,字段可以是基本数据类型,也可以是任意类型的对象。当变量作为类的成员使用是java才能够给定其默认值,复杂对象类型默认值为null,基本数据类型都有其相应的默认值(具体参照书本)。
9.注释和嵌入式文档
Java中有几种类型的注释一种是类似于c的注释/*~~~~~*/ .一种是单行注释如//
~~~~~ 。还有一种是文档注释如/**~~~~*/这种注释可以是用javadoc编译生成html文档。
10.Static关键字
使用static变量和方法有两种方式:一种是通过一个对象去调用,另一种是通过类名直接调用(这是由于类静态变量和方法在类加载的时候已经编译)
11.练习题



第三章.操作符

Java中操作符和其他语言操作符都是类似的,然而在操作真实的数据的时候还是有很多地方需要注意的地方,比如/分母部分不能是0,X++以及X—操作符与++X及—X的异同,在这些细节点上面还是需要注意的。
java操作符共分为九种:1、赋值(=)2、算术运算符(+, -, *, /, %)3、关系操作符(< ,> ,<= , >=, ==, !=)4、逻辑操作符(&&,||,!)5、按位操作符(&,|,~,^)6、移位操作符(<<,>>,>>>)7、一元加、减操作符(-,+)8、自动递增递减运算符(++,--)9、三元操作符if-else(boolean-exp ? value0 : value1)。几乎所有的操作符都只能操作java“基本类型”,例外的操作符是=,==和!=操作符能操作所有对象,String类可以支持+,+=操作符。
1、操作符优先级
学过数学的都应没问题了,这里不再谈了
2、可以同时进行运算与赋值操作的操作符有:算术运算符(+=, -=, *=, /=, %=,)、移位操作符(<<=,>>=,>>>=)和按位操作符(&=,|=,^=)
3、整数除法中,除数与被除数可以的类型(char、byte 、short 、int 、long、 float 、double),除法结果取除数与被除数类型最大的,默认是int,如果除数与被除数的类型都是(char、byte 、short 、int 、long、 float) 类型,哪么得到的会直接去掉结果的小数位,而不是四舍五入。
4、关系运算符==和!=比较的是对象的引用,equals()的默认行为也是比较对象的引用,但大多数java类库都实现了equals()方法,使它变成比较对象的内容,而非比较对象的引用。所有如果是自己创建的新类要覆盖equals()方法,否则还是比较对象的引用。“基本类型(如int,long等)”,非包装器类型(如Integer,Long等)只能用==和!=比较,没有equals()方法。
5、逻辑操作符(&&,||,!)操作只可应用于布尔值。使用逻辑操作符时,有可能出现一种“短路”现象,即逻辑表达式有可能一部份不必计算就知运算结果的。
6、按位操作符用来操作整数基本类型中的单个“比特”(bit),即二进制位。但对于布尔型作为一种单比特值对待,只能执行按位(&,|,^)运算,不能执行按位~的操作,并且不会中途“短路”这是跟逻辑操作符不同的,结果也是布尔型数据。
7、如果对char,byte或者short类型的数值进行移位处理,哪么在移位进行之前,它们会被转换成int类型,并且得到的结果也是int类型的值。所以在进行>>>=运算是要特别小心,有可能得到的不是正确的结果。
8、java允许任何基本数据类型转换成别的基本数据类型,但布尔型除外,后者根本不允许进行任何类型的转换处理。在执行窄化转换时,总是对数字执行截尾,如果要得到四舍五入的结果,就需要使用java.lang.Math中的round()方法。
9、如果对基本数据类型执行算术运算或按位运算时,只要类型比int小(char,byte,short ),运算之前就会转成int,最终结果也是int类型。如果想把结果赋值给较小的类型,必须进行类型转换。通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型。



分享给朋友:
您可能感兴趣的文章:
随机阅读: