《我在北大青鸟的180天》/Java部分/第二章

Underwind 2005-04-06 10:30:09
写在前面的废话:
本书正在创作中,发表这些节选的目的是想收集广大网友的宝贵意见(由于csdn不能贴图,不支持html,所以有些内容阅读不便,请见谅)。
另外,如果有哪位达人可以帮助本书出版,也请与我联系
email:fuyj@seeyon.com
或登陆我的网站:www.designersky.com
----------------------------------------------------------------------------
第二章 Java编程基础
第一章讲的还比较顺利,但是学生回家自己安装Java环境时却几乎都遇到了困难,有安装顺序不对的,有环境变量没配制好的,有JBuilder无法运行的,不一而足,这算是正常现象吧,我第一次配置Java环境的时候也费了好多功夫呢。
今天要讲的都是基础知识,比较零碎,包含了注释,基本数据类型,字符串等,一点一点看吧。
从注释讲起,Java破天荒地将人们一直忽略的注释也作了升级,除了传统的单行注释和多行注释外,Java还支持文档注释。文档注释对于不爱写文档的程序员是个大好消息,在软件公司中,程序员的任务除了编写代码外,还要负责编写相应的文档,其中一种就是程序接口描述的文档,它通常用来描述你的程序都干了些什么,里面包含哪些方法。很显然,当程序员满怀激情写完这些代码后再编写这些文档是相当枯燥的,而文档注释可以让你在写程序的同时完成这些文档的编写,觉得不可能?那看看下面的代码吧:
/**
* 一个演示文档注释的例子
* <p>Title: 文档注释演示</p>
* <p>Description: 一个演示文档注释的例子</p>
* <p>Copyright: Copyright (c) 2005</p>
* @author Underwind
* @version 1.0
*/
public class Person {
/**
* name 姓名
*/
public String name;

/**
* 通过传入姓名构造一个Person对象
* @param name String 姓名
*/
public Person(String name) {
this.name = name;
}

/**
* 跑步方法,传入需要跑的距离,返回跑这段距离的时间<BR>
* 如果在跑步的过程中不小心跌倒,回抛出跌倒异常
* @param meters int 需要跑的距离(单位:米)
* @throws FallException 跌倒异常
* @return double 跑完的时间(单位:秒)
*/
public double run(int meters) throws FallException {
return meters/10;
}
}
当然,这个类中的代码只是演示,看明白文档注释的写法了吗?一般我们在类的开始部分写一段文档注释,说明这个类是干什么用的,谁在什么时候写的,然后在类的每个成员前也都写一段文档注释(有些人认为私有成员前不需要写,我觉得不妥),说明这个成员有什么用。看看生成的文档:


我建议在JBuilder里面写文档注释,以写一个方法的注释为例,先将方法的声明写好,然后在方法声明的上一行输入/**后按回车,JBuilder会自动生成注释的框架。在JBuidler X版本中,通过选择Wizards菜单下的Javadoc可以在下次编译的自动生成html格式的文档。当然,也可以在Dos环境下使用javadoc.exe手工编译,不过比较麻烦( 搜索互联网,了解Javadoc)。
下来讲讲Java中的基本数据类型,byte,short,long之类的,有什么特别吗?有的!与C/C++相比,Java中数据类型的好处就是规范化了数据类型的长度。比如:C/C++中,一个int型的变量占多少个字节,这个是要取决于运行环境的,所以在某些机器上int型可以表示-32768~32767的数字,在某些机器上则可能更大些,这种不一致是C/C++语言跨平台运行的一大障碍(想想为什么?)。而Java则解决了这个问题,无论在哪一台机器上,Java的数据类型长度是固定的。
注意Java是一种强类型的语言,对于不同类型之间的转换要求很严格,比如写int i = 3.3是错误的,应该写成int i = (int)3.3。再说说char型,都知道char型里面能保存一个字符,那它能不能保存一个中文字符呢?答案是可以的,因为Java是以Unicode编码格式保存字符的,而不是传统的ASCII码,Unicode编码用两个字节来表示字符,无论是英文还是中文( 搜索互联网,了解Unicode编码)。
学生们一片感慨,怎么连注释和基本数据类型都能讲出这么多东西啊!呵呵,耐心,还有更多的东西呢。
说完基本型再说说我们最常用的一种非基本型:String(字符串)。String在Java中是一个类,我们通过定义String对象就可以方便的使用字符串了,String类中提供了一些常用的字符串操作方法,这些在JavaScript里面讲过了,不再多说,如果你都忘了,快把书往前翻吧。重点要讲一下字符串的比较,观察下面的代码:
String a = “Hello”;
String b = “Hello”;
String c = new String(“Hello”);
String d = new String(“Hello”);
System.out.println(a==b);
System.out.println(b==c);
System.out.println(c==d);
System.out.println(a.equals(b));
System.out.println(b.equals(c));
System.out.println(c.equals(d));

猜猜结果?是true,false,false,true,true,true。分析一下原因,要引出一个概念:字符串池。
何谓“字符串池”,这是Java为了提高内存利用率而采用的措施:当遇到String a = “Hello”这样的语句时,Java会先在字符串池中寻找是否已经存在Hello这个字符串,如果没有,则建立字符串Hello对象,然后变量a指向这个地址(是的,Java中表面无指针,但是大家心里要有指针这个概念);然后遇到语句String b = “Hello”,这时字符串池中已经有Hello了,所以直接让变量b也指向这个地址,省去了重新分配的麻烦。而在Java中,操作符“==”对于两个基本型来说,是判断其内容是否相同,对于两个对象来说,则是判断其地址是否相同,所以a==b返回true。那么String c = new String(“Hello”)又如何处理呢?如果是这种写法,则不会去访问字符串池,而是先为变量c开辟空间,然后将值写入空间。所以a==c返回false;c==d同样返回false。至于String的equals方法,因为它比较的不是对象的地址,而是对象的值,所以都返回true就不奇怪的(关于equals方法的详细讨论在第四章)。
提问:如前所述,变量a和b指向同一个地址,那么如果执行语句a = “Hi”,会不会改变变量b的值?
回答:不会,Java会在字符串池中寻找Hi,如果找到了,则让变量a指向这个新地址,如果没有找到,则新建Hi对象,然后让让变量a指向它。此操作不会影响变量b的值。
这节课的内容很多都是细节,不知道也不会对编程造成太大的影响,不过知道了会让代码更完善。
接下来是运算符,常见的就不说了,出现了一个新的运算符instanceof,用来判断一个对象是否属于某个类,这个操作符在以后讲到多态的时候会用到。
下来讲讲数组,在Java中定义数组也是比较方便的,通常有这两种写法:int a[] = new int[10]或者int[] a = new int[10],两种写法没有什么区别。但是要注意一点,如果你要定义一个对象数组,比如下例:
class Person {
public String name;
public int age;
}

public class TestArray {
public static void main(String[] args) {
Person persons[] = new Person[10];
persons[0].name = "tom";
}
}

这个程序是正确的吗?运行一下,就会报NullPointException(空指针异常),为什么呢?Java中,数组也是一个对象,而不像C++中,数组只是一个地址,所以Person persons[] = new Person[10]这一句用来给数组对象分配内存空间的,而数组中每一个Person对象还没有被分配空间,因此数组中的每一个对象(比如persons[0])都是null,使用persons[0]的name属性时自然会报空指针异常。如何解决呢?很简单,在使用persons[0]之前加上这一句:persons[0] = new Person()。
程序结构也不多说了,大凡一门编程语言,无外乎三种结构:顺序、分支、循环,Java也不会例外,说一下“包”(Package),包也是Java提出的概念,C++里面没有的,为什么要把一个类放到包里呢?我们可以举Windows下文件管理的例子,磁盘里面有很多的文件,都堆在根目录下是很愚蠢的做法,我们需要建立若干个文件夹,将文件分门别类的放进去。包就是这个作用,当我们建立的类很多时,都堆积在一起不容易管理,有了包之后,我们就可以方便的对类进行管理。唯一麻烦的一点就是如果你要在一个类访问另外一个包的类,就必须引入(import)这个类,呵呵。
实际上Java已经提供了很多有用的类,我们一直再用它,回想一下,我们输入文字用的System,定义字符串用的String,都是Java为我们提供的,这些类被称之为JFC,就是Java基础类库,也叫Java API,我们要使用这些类,也需要把它们引入(import)。
那为什么我们的程序里面并没有import xxx.String或者import xxx.System呢,因为这两个类同属于java.lang这个包,这个Java中最重要的一个包,每一个类默认都会去引用它,所以我们可以直接使用String和System。java.lang包中常用的类还有Math, Runtime, Object等,以后我们会介绍它的。
...全文
562 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
momeng2003 2005-04-10
  • 打赏
  • 举报
回复
收藏。。。。。。。。。。。
mnbvc874 2005-04-08
  • 打赏
  • 举报
回复
楼主的学费没白交呵
Underwind 2005-04-08
  • 打赏
  • 举报
回复
结贴以后还能回复吗?测试之。
apollo333 2005-04-08
  • 打赏
  • 举报
回复
顶一下。很不错的。继续吧。
zhou_lion 2005-04-08
  • 打赏
  • 举报
回复
楼主是老师吧~
拜读过第一章和这一章了,个人感觉,做教案,学生讲义也许不错,但是不适合出书,没有哪个出版社会印这些东西的。当然,只是我个人看法。
Lernen2005 2005-04-07
  • 打赏
  • 举报
回复
不错
kaka1987 2005-04-07
  • 打赏
  • 举报
回复
呵呵,好多期望啊。
每个人的口味都不一样。
也没办法,中国人人多!
iamfunction 2005-04-07
  • 打赏
  • 举报
回复
写的很好,期待下面的章节~~
zhujiangxiong 2005-04-07
  • 打赏
  • 举报
回复
cc
Underwind 2005-04-07
  • 打赏
  • 举报
回复
这不已经发表在网上了嘛,当然本文不能和Think in Java相提并论。
NetVer 2005-04-07
  • 打赏
  • 举报
回复
我感觉如果我去听这课的话要疯掉了
太乱了
psl2002 2005-04-07
  • 打赏
  • 举报
回复
这么好的文章,应该做的象《Think In java》那样发表在网上。
zhkchi 2005-04-07
  • 打赏
  • 举报
回复
持续关注
gengqi 2005-04-07
  • 打赏
  • 举报
回复
学习
yesunan 2005-04-07
  • 打赏
  • 举报
回复
关于JAVA的注释放到最后可能比较好一点~和讲包那一块放再一起~
yesunan 2005-04-07
  • 打赏
  • 举报
回复
是不是这个只是节选啊~?还又更详细的内容?~~
yesunan 2005-04-07
  • 打赏
  • 举报
回复
太棒了~继续等第三章,希望能更详细一些,呵呵~
zishuchen 2005-04-07
  • 打赏
  • 举报
回复
顶顶
pqds 2005-04-07
  • 打赏
  • 举报
回复
恩!写的不错!
中午起来睡不着,来这里溜达,终于明白了,没有复习这个就睡觉!
好了!现在安心了!
我也是刚从ACCP毕业的!让我学到了很多没有的东西!
楼主能有这个思想很不错!只是希望能坚持下去!
OnlyFor_love 2005-04-07
  • 打赏
  • 举报
回复
这篇文章写的不错!能让我们这些初学者真正明白了“==”和“equals()”的机理!
加载更多回复(18)

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧