楼主: omencathay

[精华] Think in java读书笔记

[复制链接]
论坛徽章:
5
开发板块每日发贴之星
日期:2005-09-20 01:02:25开发板块每日发贴之星
日期:2005-09-25 01:02:23会员2006贡献徽章
日期:2006-04-17 13:46:34奥运会纪念徽章:拳击
日期:2008-08-15 14:59:34马上有车
日期:2014-03-06 20:08:58
151#
发表于 2004-5-28 17:53 | 只看该作者
最初由 omencathay 发布
[B]

两种定义字符串变量的方式,应该没有什么不同

new 的作用在于新创建一个对象实例 [/B]


   我觉的老兄这一次说的不对,这两种确实是是定义字符串变量的
两种方式,但这两者之间还是有一点区别的.
  先来看一看这个例子:
    String str1=new String("Java";
    String str2="Java"
   如果有下面的一些操作
    str1.equals(str2),此表达式的结果会为true
    可是如果使用比较运算符来判断,例:
    str1==str2
    你得到的结果会是false.因为str1和str2是两个不同的对象,而比较
运算符比较的是两个对象的内存地址,所以才会得到false这个结果。
   现在有另外一个字符串对象
   String str3="Java";
   问题现在出来了,现在比较str2==str3时,你发现答案是true.为什么?
   因为字符串是每个程序中一定会用到的对象,Java为了加强程序的运行速度,所以设计了两种不同的方法来生成字符串对象,一种是调用String类的构造函数,另一种是使用双引号"".这两种方法
生成的字符串对象,在内存中存放的方法是不一样的。使用构造
函数的方法所生成的对象,就像其他类生成的对象一样,有自己的独立空间;而之所以有双引号的方法,主要是为了加快程序运行的速度,所以Java会把这类字符串放在一个字符串缓冲池(String Pool)中,当用双引号产生字符串对象时,电脑先去字符串缓冲池中查找有没有相同的字符串已经放在里面了,如果有就直接拿出来用,如果没有就产生一个新的字符串放到字符串缓冲池中。
  说了这么多,不知道大家明白了我的意思没有,双引号代表把字符串放的一个缓冲迟中,而类的构造函数却不是。

使用道具 举报

回复
论坛徽章:
0
152#
发表于 2004-6-7 15:17 | 只看该作者

感谢刀魂兄

感谢刀魂兄,收藏……

使用道具 举报

回复
论坛徽章:
0
153#
发表于 2004-7-8 17:49 | 只看该作者
我今天在书店犹豫了好久,到底是买jjhou的中文版呢还是买英文原版,最后还是买了jjhou的中文版,毕竟自己的英文水平不怎么样,等有钱了,把那本英文的也买下来。

现在开始和大家一起学习TJ2了

使用道具 举报

回复
论坛徽章:
0
154#
发表于 2004-7-13 15:14 | 只看该作者

Re: Array using

最初由 omencathay 发布
[B]
//prt("a3["+i+"]["+j+"]["+k+"]="+a3[j][k]);
在a4的array中,有时候会出现异常,不知道是什么原因,提示错误:
java.lang.ArrayIndexOutOfBoundsException: 3

        at arrays.Arrays.main(Arrays.java:44)
[/COLOR] [/B]


由于a3的维数是自动生成,所以各维数小于a2的相应维数,自然就引用溢出异常了。

我也是刚开始接触,不对之处请拍砖。

使用道具 举报

回复
论坛徽章:
0
155#
发表于 2004-7-13 16:25 | 只看该作者
最初由 xyj0323 发布
[B]

   我觉的老兄这一次说的不对,这两种确实是是定义字符串变量的
两种方式,但这两者之间还是有一点区别的.
  先来看一看这个例子:
    String str1=new String("Java";
    String str2="Java"
   如果有下面的一些操作
    str1.equals(str2),此表达式的结果会为true
    可是如果使用比较运算符来判断,例:
    str1==str2
    你得到的结果会是false.因为str1和str2是两个不同的对象,而比较
运算符比较的是两个对象的内存地址,所以才会得到false这个结果。
   现在有另外一个字符串对象
   String str3="Java";
   问题现在出来了,现在比较str2==str3时,你发现答案是true.为什么?
   因为字符串是每个程序中一定会用到的对象,Java为了加强程序的运行速度,所以设计了两种不同的方法来生成字符串对象,一种是调用String类的构造函数,另一种是使用双引号"".这两种方法
生成的字符串对象,在内存中存放的方法是不一样的。使用构造
函数的方法所生成的对象,就像其他类生成的对象一样,有自己的独立空间;而之所以有双引号的方法,主要是为了加快程序运行的速度,所以Java会把这类字符串放在一个字符串缓冲池(String Pool)中,当用双引号产生字符串对象时,电脑先去字符串缓冲池中查找有没有相同的字符串已经放在里面了,如果有就直接拿出来用,如果没有就产生一个新的字符串放到字符串缓冲池中。
  说了这么多,不知道大家明白了我的意思没有,双引号代表把字符串放的一个缓冲迟中,而类的构造函数却不是。 [/B]


既然使用构造函数的方法所生成的对象,就像其他类生成的对象一样,有自己的独立空间,那么str3和str2代表不同对象,str3==str2怎么会相同呢
不明白,希望再说一下

使用道具 举报

回复
论坛徽章:
0
156#
发表于 2004-7-13 16:30 | 只看该作者

Re: 关于初始化过程

最初由 flyx 发布
[B]tij上的例子,看看下面的程序输出结果是什么
偶觉得这个例子很不错

答案
static Insect.x1 initialized
static Beetle.x2 initialized
[/B]


麻烦再说一下这两个的来历,先谢过!

使用道具 举报

回复
论坛徽章:
0
157#
发表于 2004-7-14 00:11 | 只看该作者
to zdr
你看清楚阿
str2和str3并不是由new方法产生的,也就并不代表不同的对象了,因此,他们才可能指向同一个对象的

使用道具 举报

回复
论坛徽章:
0
158#
发表于 2004-7-14 00:12 | 只看该作者
最初由 flyx 发布
tij上的例子,看看下面的程序输出结果是什么
偶觉得这个例子很不错

答案
static Insect.x1 initialized
static Beetle.x2 initialized


这个我也不明白,=待高手指点

使用道具 举报

回复
论坛徽章:
0
159#
发表于 2004-7-16 14:55 | 只看该作者
static Insect.x1 initialized
static Beetle.x2 initialized

感觉象是初始化STATIC的变量,父类到子类地进行。
等待高人指点。

使用道具 举报

回复
论坛徽章:
55
生肖徽章:虎
日期:2006-09-06 21:14:232011新春纪念徽章
日期:2011-01-25 15:41:502011新春纪念徽章
日期:2011-01-25 15:42:152011新春纪念徽章
日期:2011-01-25 15:42:332011新春纪念徽章
日期:2011-01-25 15:42:56管理团队成员
日期:2011-05-07 01:45:082012新春纪念徽章
日期:2012-01-04 11:49:542012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:182012新春纪念徽章
日期:2012-02-13 15:11:18
160#
发表于 2004-7-16 15:03 | 只看该作者

Re: 关于初始化过程

最初由 flyx 发布
[B]tij上的例子,看看下面的程序输出结果是什么
偶觉得这个例子很不错

class Insect {
  int i = 9;
  int j;
  Insect() {
    prt("i = " + i + ", j = " + j);
    j = 39;
  }
  static int x1 =
    prt("static Insect.x1 initialized";
  static int prt(String s) {
    System.out.println(s);
    return 47;
  }
}

public class Beetle extends Insect {
  int k = prt("Beetle.k initialized";
  Beetle() {
    prt("k = " + k);
    prt("j = " + j);
  }
  static int x2 =
    prt("static Beetle.x2 initialized";
  public static void main(String[] args) {
    prt("Beetle constructor";
    Beetle b = new Beetle();
  }
}


答案
static Insect.x1 initialized
static Beetle.x2 initialized
Beetle constructor
i = 9, j = 0
Beetle.k initialized
k = 47
j = 39 [/B]


个人认为:

初始化的过程是从super class到class。从static开始的。所以首先是两个static。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表