Java核心技术卷1——每日笔记

第3章 Java的基本程序设计结构

3.1 一个简单的Java应用程序

  1. 源代码的文件名必须与公共类的名字相同,并用.java作为拓展名。
  2. 点号(.)用于调用方法。

3.2 注释

文档注释法:

/**
 *  注释内容
 *
 *
 *
 */

3.3数据类型

java有8种基本类型,四个整型(int 、short、long、byte)、两种浮点类型(float、double)、1种字符类型char(用于表示Unicode编码的代码单元)和一种表示真值的boolean类型。

3.3.1整型

  1. 长整数整型后缀 L 或 l ,十六进制数值前缀 0x 或 0X ,八进制数值前缀0,很显然八进制很容易混淆所以最好不要使用八进制常数。

    二进制前缀0b或0B。并且可以为数字字面量加下划线,如1_000_000,java编译器会自动去除这些下划线。

  2. java没有任何无符号(unsigned)形式的int、long、short或byte类型。

  3. 若要进行无符号运算,可调用Byte.toUnsignedInt(b)来得到一个0到255的int值,实现无符号的效果,最终再转化为byte即可。

    并且在Integer和Long类种都提供了处理无符号除法和求余数的方法。

3.3.2 浮点类型

  1. float后缀 F 或 f ,没有后缀F的浮点数值默认为double类型,但double也可加后缀 D 或 d 。

  2. 表示溢出和出错情况的三个特殊的浮点数值:

    • 正无穷大
    • 负无穷大
    • NaN

    例如,一个正整数除以0的结果为正无穷大。计算0/0或负数的平方根结果为NaN。

    常量**Double.POSITIVE_INFINTY、Double.NEGATIVE_INFINTY和Double.NaN(**以及相应的Float类型的常量)分别表示这三个特殊的值,但在实际应用中很少遇到。

    不能通过‘==’来检测一个特定值是否等于特殊值。

    只能通过Double.isNaN方法来判断,如

    if(x == Double.NaN) //错误的
    if(Double.isNaN( x )) //正确的
    
  3. 浮点数值不适用于无法接受舍入误差的金融计算。

    例子:代码System.out.println(2.0-1.1);

    ​ 将会打印出0.899999999999999,而不是人们期望的0.9。

    ​ 主要原因是浮点数值采用二进制系统表示,而在二进制系统无法精确地表示分数1/10。

    ​ 就好像十进制无法精确地表示分数1/3一样。

    解决:如果在数值计算中不允许有任何舍入误差,就应该使用BigDecimal类。

3.3.3 char类型

  1. char类型原本用于表示单个字符。

    但如今有些Unicode字符可以用一个char值描述,另外一些Unicode字符则需要两个char值。

  2. char类型的字面量值用单引号扩起来,字符串String用双引号。

  3. char类型的值表示为十六进制值,范围从 u0000 到 uFFFF。

    转义序列u还可以出现在加引号的字符常量或字符串之外(其他转义序列不行)。

  4. 特殊字符的转义序列:

    转义序列 名称 Unicode值
    b 退格 u0008
    t 制表 u0009
    n 换行 u000a
    r 回车 u000d
    " 双引号 u0022
    单引号 u0027
    \ 反斜杠 u005c

    警告:

    • Unicode转义序列会在解析代码之前得到处理。

      例如"u0022+u0022"并不是有引号(U+0022)包围加号构成的字符串,实际上u0022会在解析之前转换为",这会得到 “” + “”,也就是一个空串。

    • 更隐秘的是注释中的u.

      // u000A is a newline

      会产生一个语法错误,因为读程序时u000A会替换为一个换行符。

      类似地,下面这个注释

      // look inside c:users

      也会产生一个语法错误,因为u后面并没有跟着4个十六进制数。

3.3.4 Unicode 和 char 类型

  1. 各个国家拥有不同的字符编码机制,产生了两个问题:

    一是对于任意给定的代码值,在不同的编码方案有可能对应不同的字母。

    二是采用大字的语言其编码长度有可能不同。

  2. 而设计Unicode编码的目的就是要解决这些问题。

    现在16位的char类型以及不能满足所有Unicode字符的需要了。

下面利用一些专用术语来解释Java语言从Java5开始如何解释这个问题。

  1. 码点(codepoint)是指一个编码表中的某个字符对应的代码值。

  2. 在Unicode标准中,码点采用十六进制书写,并加上前缀U+,例如U+0041就是拉丁字母的码点。

  3. Unicode的码点可以分为17个代码平面(code plane)。

    第一个代码平面成为基本多语言平面(basic multilingual pane),包括码点从U+0000到U+FFFF的“经典”Unicode代码;

    其余的16个平面的码点从U+10000到U+10FFFF,包括辅助字符(supplementary character)。

  4. UTF-16编码采用不同长度的编码表示所有Unicode码点。

    在基本多语言平面中,每个字符用16位表示,成为代码单元(code unit);

    而辅助字符编码为一对连续的代码单元。

    采用这种编码对表示的各个值落入基本多语言平面中未用的2048个值范围内,通常成为替代区域(surrogate area)

    (U+D800~U+DBFF 用于第一个代码单元,U+DC00~U+DFFF用于第二个代码单元)。

    这样的设计,使得我们可以从中迅速知道一个代码单元是一个字符的编码,还是一个辅助字符的第一或第二部分。

  5. 在Java中,char类型描述了UTF-16编码中的一个代码单元。

  6. 我们强烈建议不要在程序中使用char类型,除非确实需要UTF-16代码单元。

    最好将字符串作为抽象数据类型处理。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>