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

第二章 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等,以后我们会介绍它的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值