《Java编程思想》 作者:Bruce Eckel
虽然这本书是经典,但是对于一个入门java,又没有其他编程经验的人来讲,实在难以看懂,前前后后看了三遍。
第一次什么都不懂的时候硬着头皮看,没看完,看了前面忘了后面,中间很多看不懂。第二次的时候,看懂了很多,但是不知道经典在何处。
第三次,是自己用了这门语言一年后,知道所谓的经典是什么,java的特性都在这里,这书不是从基础的JDK怎么装开始讲起。,大部头的一本书,现代人的话很少去翻了,其实可以当参考书,看哪一部分忘了,直接温故即可。一次在学校看到第四版英文版的,硬着头皮看,看着看着就看不懂了,英语重要就在这里。
一切都是对象。
我的一位朋友以前的签名是,我一直都在面向对象,可是现在连一个对象都没有。
(一)类引用
假如有一个类 电视机类 class TV;
class TV{ int length; //字段,也叫数据成员 int point(){ //方法,也叫成员函数 return 1; } }
TV control , control是一个引用(reference),其实重新看C之后发现这引用就跟指针一样,少了个星号而已。
对象的创建用new。
TV Ccontrol = new TV();
同时,我在看数据结构书时候,注意到了初始化的问题。
TV Control;
此时的Control是对象的一个引用,不是对象本身,但是在赋值成某对象,即上面的初始化之前,其实是保存为null的特殊对象的引用。这也回答了,为什么你每次使用对象的时候,IDE会提示对象的未初始化。
(二)内存分配
这东西放哪里呢,那还是要像C一样看内存分配。
1) 寄存器 。 最快的存储区,处理器内部,根据需求分配,不能自己控制,但是C/C++可以用register。
2)栈(原文堆栈,其实应该翻译成栈更合适,和堆区分开来,因为英文的stack就是堆栈的意思)。 位于通用RAM(Random Access Machine,随机访问存储区,在操作系统,微机原理等计算机的基本组成中都有提到),速度仅次于寄存器。存放基本变量和引用,存在栈中的数据可以共享。但是,栈中的数据大小和生存周期必须确定,这是缺点。
栈存的一个是基本的数据类型,int i = 1; 其实i是一个指向int类型的引用。1存在栈中,i指向1的地址(作用和指针一个样),如果此时有int j = 1; 由于共享性,就不会再开辟
一个新的1的地址。直接让i和j指向同一个地址。
栈也存储对象的引用。
3)堆。存放所有的java对象。
4)常量存储。常量(注意常量和变量,int i =1是变量),字符串,静态区的东西存储在此。
5)非RAM存储。
再来看看一个有趣的对象equals和==问题。
TV Control; //与C++不同的是,C++实际上创建了这个对象,留出了所需要的空间,而java只是创建某一个对象的存储地址的空间。 Control = new TV(); TV AnotherControl = Control; //C++将所有的数据拷贝到Another中,而java只是把地址复制过去。 //所以两者是否==(java中实际上判断引用是否一致,即对象是否相同),既然地址一致,同一个对象,答案为ture。c++却用==来判断对象的数据是否相同,而java用的是equals,一般重写。
(三)作用域问题
{}作用域里决定了变量的声明周期,变量用于作用域之前,所以有时会犯一些低级错误,在作用域之外又再次使用该变量。就会出现can not be resolved,无法解析的问题了。
(四)第一个HelloWorld程序
程序的开头,要用import语句引入程序所需要的类,java.lang是默认导入进每个java文件的,之前一直奇怪lang是什么——language。
public class Hello { public static void main(String[] args) { System.out.println("Hello World!"); } }
其实java也没有那么强大,看,简简单单的HelloWorld要写这么一堆不相关的东西。所以,还是根据需要选择你使用的语言。
(五)编码风格
类名用驼峰标识,首字母大写。几个单词的话就每个单词的首字母大写。
另外加上上次在Google看到的编程风格,
if else while 等语句的使用时,即使是空语句,也要加上{},更容易看。
Java编程思想(一)——一切都是对象