首页 Java程序设计精讲一 第二章 数据和表达式
文章
取消

Java程序设计精讲一 第二章 数据和表达式

Java程序设计精讲一 第二章 数据和表达式1

1 基本语法元素

1.1. 空白、注释及语句

  1. 空白

    可看作空白:换行符、回车符、空格键、水平定位键(Tab) Java程序的元素之间可以插入任意数量的空白,编译器会忽略掉多余的空白。

  2. 注释

    Java中的3种注释形式∶

    • //在一行内的注释︰一般用它对声明的变量、一行程序的作用进行简短说明。
    • /*—行或多行的注释*/︰多用来说明方法的功能、设计逻辑及基本思想等。
    • /** 文档注释 */︰一般地,在公有类定义或公有方法头的前面会使用这样的注释。注释中以符号@开头的特定的标签(Tags)标识出方法的不同方面。例如,使用@param标识参数,@return标识返回值,而@throws表示方法抛出的异常。
  3. 语句、分号和块

    • 语句是Java程序的最小执行单位

    • 程序的各语句间以分号;分隔。
    • 大括号{}包含的一系列语句称为语句块,简称为块。

1.2. 关键字

abstractbooleanbreakbytecase
castcatchcharclassconst
continuedefaultdodoubleelse
extendsfalsefinalfinallyfloat
forfuturegenericgotoif
implementsimportinnerinstanceofint
interfacelongnativenewnull
operatorouterpackageprivateprotected
publicrestreturnshortstatic
strictfpsuperswitchsynchronizedthis
throwthrowstransienttruetry
varvoidvolatilewhile 

目前尚未使用的有:cast、const、future、generic、goto、inner、operator、outer、rest、var等。

1.3. 标识符

1.3.1. 标识符

字母、数字、下划线( _ )或美元符( $ )组成的字符串,其中数字不能作为标识符的开头关键字不能作为标识符标识符区分大小写,长度没有限制。除以上所列几项之外,标识符中不能含有其他符号。在程序中,标识符可用作变量名、方法名、接口名和类名等。

1.3.2. Unicode码

Java源代码使用的是Unicode码,而不是ASCII码。Unicode码用16位无符号二进制数表示一个字符,因此,Unicode字符集中的字符数可达65535个,比通常使用的ASCII码字符集(通常最多只有255个)大得多。汉字也是字符,所以可以出现在标识符中。

1.4. Java编程风格

1.4.1. 编程风格

增加必要的注释和空格,采用缩进格式。除此之外,定义的各种标识符也要遵从惯例,注意大小写。变量的名字应该表示变量的用途。对if-else或for结构中的所有语句要使用一对大括号括起来,每行只写一条语句。

1.4.2. 命名约定

  1. 类名或接口名∶多为名词,含有大小写,每个单词的首字母大写。如HelloWorld、Customer、SortClass等。
  2. 方法名︰多是动词,含有大小写,首字母小写,其余各单词的首字母大写。尽量不要在方法名中使用下划线。如getName、setAddress、searchKey等。
  3. 常量名︰简单类型常量的名字应该全部为大写字母,单词与单词之间用下划线分隔,对象常量可使用混合大小写。如BLUE_COLOR。
  4. 变量名∶所有的实例变量、类变量、终极变量和静态变量等都使用混合大小写,首字符为小写,后面单词的首字母用大写。变量名中尽量不要使用下划线。如balance、orders、by Percent等。

2 基本数据类型

image-20230311214617125

2.1. 整数类型byte、short、int和long

2.1.1. 4种整型量

整数类型整数长度字节数表示范围
**byte**8位1-2 ^5^ ~ 2^7^ - 1 (-128~127)
**short**16位2-2^15^ ~ 2^15^ - 1 (-32768~32767)
**int**32位4-2^31^ ~ 2^31^-1 (-2147483648~2147483647)
**long**64位8-2^63^ ~ 2^63^ - 1 (-9223372036854775808~9223372036854775807)

2.1.2. 整型量的表示

十进制以1~9开头的数字
八进制以0开头的数,用0~7表示
十六进制以0x或0X开头的数,用0~9 和 A~F 或 a~f 表示

2.1.3. 整型常量

整型常量是 int型。如果想表示一个长整型常量,需要在数的后面明确写出字母“L”。

2.1.4. 特殊的整型常量

类型最大值最小值
intInteger.MAX_VALUEInteger.MIN_VALUE
longLong.MAX_VALUELong.MIN_VALUE

2.2. 浮点数类型float和double

2.2.1. 2种浮点数类型

 浮点数类型浮点数长度字节数表示范围
单精度浮点数float32位41.4e - 45f ~ 3.4028235e + 38f
双精度浮点数double64位84.9e-324d ~ 1.7976931348623157e + 308d

如果数值常量中包含小数点、指数部分(字符E或e),或数的后面跟有字母F (或e )或字母D(或f ),则为浮点数。浮点型常量在默认情况下是double型的,除非用字母F明确说明它是float型的。

2.2.2. 特殊的浮点数常量

 float类型double类型
最大值Float.MAX_VALUEDouble.MAX_VALUE
最小值Float.MIN_VALUEDouble.MIN_VALUE
正无穷大Float.POSITIVE_INFINITYDouble.POSITIVE_INFINITY
负无穷大Float.NEGATIVE_INFINITYDouble.NEGATIVE_INFINITY
0/0Float.NaNDouble.NaN

2.3. 字符型char

2.3.1. 2种char类型

单个字符用char类型表示。一个char表示一个Unicode字符,其值用16位无符号整数表示,范围为0~65535。char类型的常量值必须用一对单引号('')括起来,分为普通字符常量和转义字符常量两种。使用单引号括住一个字符,表示一个普通的字符常量。

2.3.2. 常用的转义字符及其含义

转义字符含义转义字符含义
\b退格键(Backspace)\\反斜杠 \
\n换行符\'单引号 ‘
\r回车符\"双引号 “
\t水平制表符(Tab)  

image-20230312222051985

2.4. 布尔类型booblean

布尔类型也称作逻辑类型。boolean类型有两个常量值:true和false,它们全是小写,计算机内部使用8位二进制数表示。

3 表达式

3.1. 操作数

3.1.1. 常量

只有简单数据类型和String类型才有相应的常量。

3.1.2. 变量的声明及初始化

  1. 变量在使用之前要先声明。变量声明的基本格式为︰类型 变量名1 [=初值1] [,变量名2 [ = 初值2]]…;
  2. 声明变量的地方有两处:
    • 在方法内,定义的变量称为自动变量,也称为局部变量、临时变量或栈变量。
    • 在类定义内,定义的变量就是类的成员变量。

3.1.3. 说明

简单数据类型的变量在说明之后,系统自动在内存分配相应的存储空间。说明引用后,系统只分配引用空间,程序员要调用new来创建对象实例,然后才分配相应的存储空间。

3.1.4. Java程序中不允许将未经初始化的变量用作操作数

  1. 对于自动变量,如果变量声明时没有进行初始化,则在变量使用之前必须使用赋值语句进行赋值。

  2. 对于其中的成员变量,程序员可以显式进行初始化,也可以由系统自动进行初始化,自动初始化时,系统按下表默认值初始化各成员变量:

    类型初始值类型初始值
    byte(byte)0double0.0
    short(short)0char‘\u0000’ (null)
    int0boobleanfalse
    long0L所有引用类型null
    float0.0f  

3.1.5. 变量的作用域

变量的作用域是指可访问该变量的代码范围。

  1. 类中定义的成员变量的作用域是整个类。
  2. 方法中定义的局部变量的作用域是从该变量的声明处开始到包含该声明的语句块结束处,块外是不可使用的。但同一个块中如果定义两个同名变量,则会引起冲突。

3.1.6. 数学函数

Java语言提供了数学函数类Math,下面列出其包含的几个常用的数学函数。

1
2
3
4
5
6
7
8
Math.sin(0)        //正弦函数,返回0.0,这是double类型的值
Math.cos(0)        //余弦函数,返回1.0
Math.round(6.6)    //四舍五入取整,返回7
Math.sqrt(144)     //开平方函数,返回12.0
Math.pow(5, 2)     //计算乘方,返回25.0
Math.max(560, 289) //求最大值函数,返回560
Math.min(560, 289) //求最小值函数,返回289
Math.random()      //返回0.0-1.0之间双精度的一个随机数值

3.2. 运算符

3.2.1. 算数运算符

算术运算符包括通常的加(+)、减( -)、乘(*)、除(/)、取模(% ),完成整型和浮点型数据的算术运算。

  1. 取模︰

    • 允许对浮点数进行取模操作。例如,3%2的结果是1,15.2%5的结果是0.2。
    • 还可以用于负数,结果的符号与第一个操作数的符号相同,例如,5%-3的结果是2,-5%-3的结果是-2,-5%3的结果是-2。
  2. “++”和“- -”称为加1和减1运算符 有前缀形式和后缀形式,含义略有不同。如++i和i++的执行顺序是不一样的,++i在i使用之先加1,i++在i使用之后再加1。–i与i–的情况与此类似。

3.2.2. 关系运算符

关系运算符用来比较两个值,包括6种:大于(>)、大于等于( >=)、小于(< ).小于等于(<=)、等于(==)和不等于(!= ) Java允许“==”和“!=”两种运算用于任何数据类型。

3.2.3. 逻辑运算符

  • 逻辑运算符包括逻辑与(&&)、逻辑或(Ⅱ)和逻辑非(!)。
  • 前两个是二元运算符,后一个是一元运算符。
  • Java对逻辑与和逻辑或提供“短路”操作功能。

3.2.4. 位运算符

位运算符用来对二进制位进行操作,包括按位取反( ~ )、按位与(&)、按位或(|)、异或(^)、右移(»)、左移(«)及无符号右移(»>)。位运算符只能对整型和字符型数据进行操作。

1
2
3
4
// 按位与(&)示例:
int xValue = 27 , yVar = 28;xValue = xValue & 4;
yVar = 4 & yVar;
// 先都转化为二进制再进行与运算。最终结果:xValue=0 ; yVar=4。
  • Java两种右移运算符

    1. 运算符“»”执行算术右移,它使用最高位填充移位后左侧的空位。右移的结果为:每移一位,第一个操作数被2整除一次,移动的次数由第二个操作数确定。

    2. 逻辑右移运算符(也称无符号右移运算符)>>>只对位进行操作,而没有算术含义,它用0填充左侧的空位。

      注意:

      算术右移不改变原数的符号,而逻辑右移不能保证这一点。

      “»>”运算符只用于整型,它只对int或long值起作用。如果用于short或byte值,则在进行“ »>”操作之前,使用符号扩展将其提升为int型,然后再移位。

      一个数右移32位等于它本身,相当于 右移(32%32)0位。

      1
      2
      3
      4
      5
      6
      7
      
      128 >> 1       //64
      256 >> 4       //16
      -256 >> 4      //-16
      0xa2 >>> 2     //40  10100010 
      (byte) 0xa2 >> 2       //-24
      (byte) 0xa2 >>> 2      //1073741800
      (byte) 0x80 >> 2       //-32
      
      难点:
      1
      2
      3
      4
      5
      6
      7
      
      (byte) 0xa2 >> 2       //-24
      /*
      0xa2 -> 162 <0..0 1010 0010>
      (byte) 0xa2 -> <1010 0010补码形式转为原码> --> -94 <1101 1110>
      (byte) 0xa2 >> 2 -> -24 1110 1000 // 补码形式 转为原码 
       */  
      (byte) 0xa2 >>> 2      //1073741800    
      

3.2.5. 其他运算符

  1. 扩展赋值运算符(+=、-=、*=、/ =、%=、& =、|=、^=、>>=、<<=和>>>=)。

    如果有赋值语句: var = var op expression; 其中,var是变量,op是算术运算符或位运算符,expression为表达式,则使用扩展赋值运算符可表示为: var op = expression; 例如: x = x* 3等价于x *= 3

  2. 条件运算符( ? ∶ )。是三元运算符,它的一般形式为:逻辑表达式?语句1:语句2;逻辑表达式得到一个逻辑值,根据该值的真假决定执行什么操作。如果值为真,则执行语句1,否则执行语句2。语句1和语句2需要返回相同类型的值,且不能是void。

  3. 点运算符(.)。

  4. 实例运算符(instanceof)。

  5. new运算符。

  6. 数组下标运算符([])。

3.2.6. 运算符的优先级

如果表达式中含有多种运算符,则要按运算符的优先次序依次从高向低进行,同级运算符则根据结合律自左至右或自右至左进行。括号可以改变运算次序。

运算符的优先级由高到低

运算符的优先级由高到低

3.3. 表达式的提升和转换

允许整型、浮点型、字符型数据进行混合运算。运算时,不同类型的数据先转换为同一种类型,然后再进行运算。

3.3.1. 自动类型转换

转换的一般原则是位数少的类型转换为位数多的类型,这称作自动类型转换。能够进行自动类型转换的类型顺序为: byte short char int long float double。排在前面的类型可以自动转换为排在后面的类型。 示例:

1
2
3
4
long bigval = 6;	//6是整型量,该语句正确
int smallval=99L;	//99L是长整型量,该语句错误
float z = 12.414F;	//12.414F是浮点量,该语句正确
float z1 =12.414;	//12.414是双精度量,该语句错误

3.3.2. 强制类型转换

当位数多的类型向位数少的类型进行转换时,需要在程序中明确指明,这种转换称为强制类型转换。 一般地,“高级”类型(即表示范围较大的数据类型)转换为“低级”类型(即表示范围较小的数据类型)时,会截断高位内容,因此会导致精度下降或数据溢出。转换时,目标类型用括号括起来,放到要修改的表达式的前面。为避免歧义,被转换的整个表达式最好也用括号括起来。 示例:

1
2
3
int i = 3;
byte b = (byte) i;long bigValue =99L;
int squashed = (int) ( bigValue);
本文由作者按照 CC BY 4.0 进行授权

Java程序设计精讲一 第一章 Java概述

Java程序设计精讲二 第三章 流程控制语句