《Java编程思想》阅读笔记1
本人应该算是学过java吧,但是很长一段时间都是在用C,连C++用的都少了;因此这里写的算是对一些小点的整理吧,不管怎样,对自己还是蛮有用的,借用书的章节:
1.一切都是对象
(1)用引用操纵对象
书中讲到的是“每种编程语言都有自己的操纵内存中元素的方式”在Java里这一切得到了简化,因为一切都被视为对象,但操纵的标识符实际上是对象的一个名字,也可以说是引用;既然是名字,那么就可以有别名。因此需要注意了,比如String类型,当通过将str1=str2时,实际上是创建了对象的引用(或者说起了个别名),其中一个的改变会影响到另一个;由此可扩展到其它类型的对象,需要注意和基本数据类型如int之类的区别,如果也是一直用着c的人,会想到函数参数传递时地址的传递,返回来又印证了“操纵内存中元素的方式”。
(2)特例:基本类型
在java中,似乎int、char、boolean等类型是不用new创建的,而且比较特殊的是boolean类型,其所占的存储空间的大小没有明确指定,且在位运算时表示一个二进制位;对特殊也有构成一般的,那就是“基本类型具有的包装器类,使得可以在堆中创建一个非基本对象,用来表示基本类型”,比如char--Character boolean--Boolean,这就需要注意的是包装器类是类,创建对象是需要分配空间的,而基本数据类型是不需要的,因此在类的声明中就有区别了:java中在类的成员变量都会赋以默认初值,比如java中声明的数组也会被初始化,防止越界;但是对象却是要在new分配后才完成初始化的,如果声明中不小心把boolean写成了Boolean,后续的使用中可能就会引起错误。
2.控制执行流程
(1)foreach语法
控制执行流程中的for、while、if-else等没什么说的,foreach倒还是比较有意思的,在C#中用到过,觉得挺方便;在Java SE5中也引入了它,相当于是访问这一类型中的所有元素,比如一数组中的所有成员;用的还是for语句,举个例子:
int a[] = new int[10];
//... 赋初始值
for(int b:a)
System.out.println(b);
将会依次输出数组a中的值。
(2)标签
在Java中除了break、continue外,还保留了标签的使用,把书上的例子搬来,基本就很清楚了:
label1:
outer-iteration{
inner-iteration{
//...
break; //跳出内部循环(迭代)
//...
continue; //继续内部循环
//...
continue label1 //继续外部循环
//...
break label1 //跳出外部循环(跳出两层迭代)
}
}
3.初始化与清理
(1)重载
对于重载,可以理解为函数调用时根据传入的参数类型或个数不同而调用不同的函数(函数名相同,但是参数类型不同),或者说产生不同的行为。在C++中,重载是包括参数的类型和个数;在Java中如果参数顺序不同,也算是重载;那么我们理解的时候可以想着编译器没有那么聪明,只不过是把函数名按照把参数包含在内的方法起了个名,也就是原函数名_参数类型列表,这样不就搞定了么;至于返回值么,都不认为可以区别重载,用上面的名字方法很好理解,因为你调用的时候是看不到返回值的。这里会遇到另一个问题,在Java中布是有数据类型的向上转型么,这个的影响怎样呢?:肯定是先匹配完全对应的,没有了再转型匹配;再没有就错误了;
(2)this关键字
“可能为类写了多个构造器,有时可能想在一个构造器中调用另一个构造器,以避免重复代码。可用this关键字做到这一点”,在一个构造器中只能使用一次,且要在其最开始处。
(3)初始化顺序
在变量定义散布于方法定义之间,它们仍旧会在任何方法(包括构造器)被调用之前得到初始化;可以利用的是static,在类的内部使用static{静态初始化语句},保证初始化的一次执行。
(4)枚举类型
java中的枚举类型(enum),在创建枚举类型时,编译器会自动添加如toString(),ordinal()(声明的顺序),values()等方法,enum可以说是一个类,而且能够在switch中使用的类。
(5)finalize()
垃圾回收相当于是对对象不用后的处理,但却是系统来做,不再用什么析构函数了;系统怎么知道什么时候不用了,因此一般回收都没有在在写的helloword程序运行中执行,即使你好像使用了finalize,它只是在回收时调用,而是否回收你只能等了,或者用过System.gc().