1、对象的存储:Java中所有对象的存储空间都是在堆中分配的,但是这个对象的引用却是在堆栈中分配,也就是说在建立一个对象时从两个地方都分配内存,在堆中分配的内存实际建立这个对象,而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。堆的特点是灵活性,但为此牺牲了高效性,可以在运行时动态地分配存储;堆栈的特点是高效性,但缺乏灵活性,在编译时刻必须知道所要分配的空间大小。堆像个大馒头,可以根据你的食量随便吃,吃饱了算;堆栈像是吃大锅饭,每个人都是定食定量的,你必须告诉厨子你的饭量,厨子据此做饭,然后你们就排队打饭吧。它们没有孰优孰劣之分,各自不同特点有不同的应用。
2、Java的设计在很多方面都基于安全的考虑,减少语言上的混乱,所以喜欢的人很多,属于大众情人型。如:运行时数组下标检查、严格的类型检查,还有消除变量隐藏语法。
int x = 10;
{
int x = 12; //不合法的!想想看,这种变量隐藏是多么危险,多么不容易察觉,而且多么多余!
}
有人说,Java是C++ 再++ 再--,即Java = C++++--。加入了C++没有的新特性,消除了C++混乱危险的特性。《Thinking in Java》中总是拿C++来做对比,开涮,大家别忘了,他也是那本经典的《Thinking in C++》的作者!最终投靠到我们Java阵营里来了,呵呵。
3、static方法常常拿来做“牧羊人”的角色,负责看护与其隶属同一类型的实例群。看看main方法就可以理解这一含义了。
1、逻辑表达式的短路会获得潜在的性能提升,有点智能了,不会傻乎乎地一算到底了。利用这点能写出高效的代码,如:用||连接的表达式,把为true可能性大的语句放在前面;用&&连接的表达式,把为false可能性大的语句放在前面。
2、从按位操作符可以看出Java的历史痕迹,一个跨平台的语言怎么会牵扯到位操作呢?Java最初是用来开发嵌入式机顶盒的。j2me嵌入式开发也是Java的强项之一,老本行嘛。现在买手机基本都会看支持Java吗?Java无处不在地渗透着。
3、在作者的工具箱中有这样两个工具printBinaryInt()和printBinaryLong(),并且给出了一个很复杂的实现。这里我给用Java的类库给简化一下吧。
static void printBinaryInt(String s, int i) {
System.out.println(s + ", int:" + i + ", binary:");
System.out.print(" ");
System.out.print(Integer.toBinaryString(i));
System.out.println();
}
当然作者的目的是讲解位操作。
4、字符串的连接。
int i=1,j=2,k=3;
System.out.println(i+j+k);
输出了6。
int i=1,j=2,k=3;
System.out.println(""+i+j+k);
输出了123。有趣吧?这是因为从左到右的运算顺序。