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。有趣吧?这是因为从左到右的运算顺序。

Feedback

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-16 22:03 by zhrb
new一个数组,数组变量是存放在栈,数组本身是不是存放在堆中呢?
还有就是是不是有一个叫做方法区的地方?对象在堆区,那么类是在什么区?

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 09:38 by 翔南
@zhrb
栈存的是引用,堆存的是实质的东西
"new一个数组,数组变量是存放在栈,数组本身是不是存放在堆中呢?"
是对的
但第二个问题我就不知道了

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 09:39 by 翔南
3、static方法常常拿来做“牧羊人”的角色,负责看护与其隶属同一类型的实例群。看看main方法就可以理解这一含义了。

这是什么意思...
没明白

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 10:26 by tomlove
为什么没有一个 留言板 呢?

搞的每次留言都在评论里面~~~!!!

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 10:28 by tomlove
出道题,大家研究一下:

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 11:31 by tomlove
楼主在csdn上有空间没?

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 12:58 by zhrb
可能是类似工厂模式的东西吧,你可以查查相关的资料@翔南

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 18:03 by Raylong
@zhrb
数组对象的引用在栈里,数组对象本身在堆中。java中的类是动态加载的,需要的时候才加载,这样可以节省内存空间。
下面是网上找到的资料,共同学习一下: 在Java虚拟机中,被装载类型的信息存储在一个逻辑上被称为方法区的内存中。当虚拟机装载某个类型时,它使用类装载器定位相应的class文件,然后读入这个class文件,然后将它传输到虚拟机中,紧接着虚拟机提取其中的类型信息,并将这些信息存储到方法区。该类型中的类(静态)变量同样也是存储在方法区中。方法区的大小不必固定,可以根据需要动态调整。方法区也可以被垃圾收集,因为虚拟机允许通过用户定义的类装载器来动态扩展Java程序,因此,一些类也会成为“不再引用”的类。 原文参见:http://blog.csdn.net/mimicimim/archive/2007/10/08/1815880.aspx

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 18:04 by Raylong
@翔南
第二个问题请参看:http://blog.csdn.net/mimicimim/archive/2007/10/08/1815880.aspx
我也是第一次知道方法区,大家一起学习一下吧。

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 18:09 by Raylong
@翔南
我们一般会写public static void main(String[] args){}函数吗?通常我们用这个main函数进行该类的测试,主要当然是测试方法了,方法里面有实质的算法,而且每个类都写一个main函数测试。牧羊人就是这个意思吧。另外在Java类库中的许多工具都是static,可以拿来就用,不必生成对象,这正是静态方法,也就是类方法的作用吧。

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 18:10 by Raylong
@tomlove
有留言板啊,可是没人往里面写呢……

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 19:00 by Raylong
@tomlove
这个是我写的,初步测试了一下,还没学junit所以测试得不够全面,结果不知对不对……
public class BallTest {
// 球的初始高度
private double height;

// 球第N次弹起的高度
private double bounceHeight;

// 球弹落过程走过的路程
private double bounceDistance;

// 带设置球初始的高度的构造函数
public BallTest(double height) {
this.height = height;
bounceDistance = height;
bounceHeight=height;
}

// 默认构造函数,就是你要求的100
public BallTest() {
height = 100;
bounceDistance = height;
bounceHeight=height;
}

// 计算球弹落过程走过的路程,参数是你说的落地的次数
public double bounceDistance(int dropGroundTimes) {
double distance = height;
if (dropGroundTimes == 1) {
return bounceDistance;
} else if (dropGroundTimes > 1) {
for (int i = dropGroundTimes; i > 1; i--) {
bounceDistance += distance;
distance /= 2;
}
return bounceDistance;
} else {
System.out.println("illegal number");
return 0;
}
}

// 计算球第N次弹起的高度
public double bounceHeight(int dropGroundTimes) {
if (dropGroundTimes > 0) {
for (int i = dropGroundTimes; i > 0; i--) {
bounceHeight /= 2;
}
return bounceHeight;
} else {
System.out.println("illegal number");
return 0;
}
}

public static void main(String[] args) {
BallTest ball = new BallTest();
System.out.println(ball.bounceDistance(10));
System.out.println(ball.bounceHeight(10));
}

}

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 19:02 by Raylong
@tomlove
我的firefox一进csdn就假死,不知道为什么,所以不在csdn了,你可以看出我是多么喜欢ff了吧 呵呵

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 19:05 by zhrb
@Raylong
谢谢你的资料,不知道 这个所谓的方法区是不是可以和堆区、栈区并列的概念。呵呵

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 19:21 by Raylong
@zhrb
呵呵 我在考虑是不是要深入地研究jvm的机制,不然很多概念都是模糊的。
昨天看了一段教程,里面提到移位运算。“移位运算的效率要比正常的乘法要高。所以遇见乘以或者除以2的整数次幂时,可以用移位操作。”作者说,他的一个朋友的同事是清华的研究生,他在做乘除法就用移位操作。细节地方才能体现高手高明的地方啊!

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-17 23:23 by zhrb
很多常用技巧是挺不错的,上回看了一些java本身常用类库编写的代码,那个技巧用的真好.呵呵
@Raylong

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-18 07:35 by Raylong
@zhrb
是啊,常看看库的源文件对编程是很大的提高呢,网上找的代码质量参差不齐,没有保证。Java类库有些东西的算法是许多专家一起研究的结果,比如生成随机数。很高深有点看不懂 呵呵

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-19 10:56 by 翔南
谢谢Raylong 和zhrb的讲解
看来偶要好好学习一下JVM的运行机制了
要不好多东西虽然会用,但不知道为什么要这么用..

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-19 12:25 by tomlove
@Raylong
呵呵,写的不错了阿。我在 第n次反弹多高?
的算法和你的一样,你的更简洁一些~~~

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-20 11:19 by Raylong
@tomlove
simple is good!呵呵 简单就不容易出错!

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-20 14:33 by tomlove
@Raylong
我是用 等比数列 求N项和的公式 和 等比数列的N项公式作的

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-20 15:40 by Raylong
@tomlove
贴出来看看吧,程序语言只是工具,要想高效的算法,还得看数学方面。

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-20 20:58 by tomlove
呵呵,我只是在纸上写了一下算法,没有编译。----- :( 是不是很懒? 的向你学习了

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-10-21 00:31 by zhrb
@tomlove
其实我也觉得写一个公式就好了...
类似于高中常作的题目一样

# re: 读书笔记《Thinking in Java》-第二、三章-07/10/16  回复  更多评论   

2007-12-08 15:38 by wǒ愛伱--咾婆
你驳壳做的..相当的不错哦..呵呵..Java真的很棒...学习啊转了你写的那经典文章....谢谢啊

只有注册用户登录后才能发表评论。


网站导航: