第1章 对象导论
OOP:Object-orientedProgramming
1、对象三要素:状态、行为、标识。
标识是指每一个对象在内存中都有一个唯一的地址。
2、对象可以看做是“服务提供者”。
3、类只暴露必要部分,而隐藏其他部分(迪米特原则)
4、一旦类被创建并测试完,那么它就应该(在理想情况下)代表一个有用的代码单元。
代码复用是OOP优点之一。
5、在建立新类时,应该先考虑组合(简单灵活),而不是继承。
6、单根继承结构保证所有对象都具备某些基本操作。
7、容器中存储的是对象引用。
8、为什么引进参数化类型(范型)?
如果没有,容器存储的对象是通用类型Object,存入时要向上转型,取出时要向下转型。
向上/向下转型和运行时的检查都需要额外的运行时间。
9、c++中对象的创建是在栈或静态存储区中,java对象的创建是在堆中。
因为堆中存储空间是在运行时被动态管理的,所以需要大量的时间在堆中分配存储空间,这可能要远远大于栈中创建存储空间的时间。在栈中创建存储/释放存储空间通过各需要一条汇编指令(栈顶指针的上下移动),而堆中依赖存储机制的设计。
10、java垃圾回收器受益于两点:单根基类和对象只在堆上创建。
11、通常来讲,当创建类时,就是在描述那个类的对象的外观与行为。除非用new创建那个类的对象,否则,实际上并未获得任何对象。
第2章 一切都是对象
1、 用引用操纵对象
注:可以拥有一个引用,并不一定需要关联一个对象。(没有电视机,可以只有遥控器)
例:String s; //创建的只是引用,而不是对象。
而String s = new String(“abc”); //创建引用并关联对象
2、 一旦java看到null,就知道这个引用还没有关联对象,在使用引用之前,必须关联一个对象。
3、 Java中的基本类型------存储在栈中、存储空间大小固定、有符号(正负数)
整数类型 | byte | 1B | Byte |
short | 2B | Short | |
int | 4B | Integer | |
long | 8B | Long | |
浮点数类型 | float | 4B | Float |
double | 8B | Double | |
字符类型 | char | 2B | Character |
布尔类型 | boolean | --- | Boolean |
void | void | --- | Void |
两个高精度类:BigInteger和BigDecimal
4、 Java确保数组会被初始化,且不能越界访问。这种范围检查,是以每个数组上少量的内存开销及运行时的下标检查为代价的。
5、 类成员变量的基本类型,有默认值,但是在方法中,这种局部变量没有默认值,可能是个随机分配的值,不用担心这个时候编译时会有错误。
6、 Java中任何传递对象的场合,传递实际上都是对象的引用。
7、 Static时,表明这个域或方法不会与包含它的那个类的任何对象实例关联在一起。
所以,即使没有创建那个类的任何对象,也可以调用static方法或访问static域。
当创建多个对象时,static域只存一份。
使用类名引用static变量或方法是首选方式。
Static方法的一个重要作用就是在不创建任何对象的前提下就可以调用它。
8、 java.lang是默认导入到每个java文件中的。
9、 类名首字母大写。
第3章 操作符
1、 java中“+”操作符有“字符串连接”的作用,也起到“字符串转换”的作用
2、 对一个对象进行操作时,我们真正操作的是对对象的引用。
3、 对于对象,==比较的是对象引用,equals比较的是对象内容。
基本类型,直接用==即可。
注:equals()的默认行为是比较引用的,在创建的类中,要复写equals,例String中就是。
4、&&、||是短路的逻辑操作符,&、|是位操作符。
5、Integer或Long类的静态方法toBinaryString(),把整型数转换为二进制串
6、对于是布尔类型的&&或||,可用&或|,但是就没有短路效果了。
7、移位操作
a. 左移<<:低位补0
例:byte b = -1; //b = 11111111
b<< 4; // b = 11110000
b. 有符号右移>>:高位补符号
c. 无符号右移>>>:高位补0
注:若对byte / char / short 进行移位,那么在移位之前,会提升为int,并且得到的结果也是int。
注:对基本类型执行算术运算或位运算,只要类型比int小(如char/short/byte),那么在运算前,先提升为int。通过表达式最大类型决定了结果的类型。
8、在将float或double强制转换为int时,总是截尾,也是是去小数
若要四舍五入,用java.lang中Math.round(value);
9、java没有sizeof
第4章 控制执行流程
1、 java不允许将一个数字作为布尔值使用。
如,int a = 1; if(a) {} //编译不通过
改为if (a == 1) {}
2、 for的简洁形式:for(int x : f) //注f可是数组或容器
3、 String中一个重要方法:toCharArray();返回char数组。
4、 switch(产生整数值的表达式){ } //它可以为int char short byte
case后适当加break;
整数值表达式可用enum生成。
5、 随机生成一个小写字母
Random rand = new Random();
Int c = rand.nextInt(26) + ‘a’;
System.out.println((char)c);
第5章 初始化与清理
构造器确保初始化,jvm负责清理
1、 构造器是static方法,与类同名。它没有返回值,与返回值是void不同。
2、 Java中,“创建”与“初始化”是捆绑在一起的。
3、 区分重载方法:一是参数个数,二是参数类型。(返回值区分行不通)
4、 如果你写的类中没有构造器,那么编译器会自动帮你创建一个默认构造器。如果你写了,则不会创建默认的了。
5、 Applea = new Apple();
Apple b = new Apple();
a.peel(1); b.peel(2);====>内部表示==>Apple.peel(a, 1);Apple.peel(b, 2);
6、 this关键字:方法的内部获得对当前对象的引用。
使用场景:<1>构造器中调用构造器,只能调用一次,且放在第一行。
<2> this.s = s;
7、 static方法是没有this的方法。Static方法内部不能调用非static方法,反过来可以。Static方法的主要用途是用类调用static方法。
8、 static方法有全局函数的性质,慎用。
9、 jvm一般用于new对象的回收,对于非new对象获得的内存,如malloc,用finalize()方法。
Finalize()工作原理:一旦垃圾回收器准备好释放对象占用的内存时,将首先调用finalize(),并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存。
当资源充足时,垃圾回收不一定发生,finalize()不一定被调用,所以它不是进行普通的清理工作的合适场所。
通常,不能指望finalize(),必须创建其它的清理方法,并且明确地调用它们。
10、 记住:无论是垃圾回收还是finalize(),都不保证一定会发生。若jvm并未面临内存耗尽,它是不会浪费时间去执行垃圾回收的。
11、 判断对象是否存活主要有两种方法:一是引用计数,二是可达性分析
可达性分析思想:对任何活的对象,一定能最终追溯到其存活在堆栈或静态存储区中的引用。
12、初始化顺序:static初始化---->默认初始化---->基类构造器---->声明顺序显示初始化---->自身构造器
13、无论创建多少个对象,static数据只存一份。
14、静态初始化只在class对象首次加载时进行一次
15、编译器不允许指定数据大小,可定义数组int[]a;
new时候可以指定,如int[]a = new int[10];
分配内存并初始化int[] a = {1,2, 3} 或 int[] a = new int[] {1, 2, 3};
所有数组都有一个默认成员length,获取数组元素个数,a.length
16、可变参数列表:void f (String… str); 表明f的参数str是可变长度的String列表
17、枚举类型enum:
Public enum Abc {
NOT, MILD, HOT
}
其实,enum是个特殊的类,有一些特殊的方法,如values(), ordinal()
与switch的配合使用。
Public class Test {
Abcabc;
Voidf() {
Switch(abc){
caseNOT:
caseMILD:
caseHOT:
}
}
}