标志符
标志符就是类名、方法(函数)名、变(常)量名、包名等的名字。 Java规定,标识符是由字母、下划线(“”)或美元符“$”)开头,后面跟0个或多个字母、下划线(“”)、美元符(“$”)或数字组成的符号序列。 根据此定义,下列单词都是合法的标识符:i count num day Scoll Lock $a789 a89 Java Int
而下列标识符是不合法的:
abc&# a3*4 int b-c #ab class
Java是区分大小写的。int是关键字,而 Int是合法的用户标识
Java的标识符可以是任意长度,但建议不要取得太长,最好不要超过4个单词。因为太长的名字容易输入错误,降低编程效率。
另外,虽然JDK1.5支持用中文给变量命名,不过很少有人采用中文变量名。一个直观的原因就是在中文输入法下,标点符号也是中文的,但Java只支持西文的标点符号,这样输入容易出错。
基本类型
包括整型、浮点型、布尔型、字符型整型(byte、short、int、long)
Java中的整型数据,是以补码的形式存放在内存中的。Java中没有无符号型整数。 字节型 byte 1字节(8位) 默认值是 0 -128~127 短整型 short 2字节 默认值是 0 -32768~32767 基本型 int 4字节 默认值是 0 -2,147,483,648(-2^31)~ 2,147,483,647(2^31 - 1) 长整型 long 8字节 默认值是 0L -9,223,372,036,854,775,808(-2^63)~ 9,223,372,036,854,775,807(2^63 -1)浮点型(float、double)
Java中的浮点数,是按照IEEE-754标准来存放的。 单精度数 float 4字节 有效数字7个十进制位 默认值是 双精度数 double 8字节 有效数字15~16个十进制位 默认值是 字符型(char) Java中的字符型用char来表示。它用两个字节(16个位)来存放个字符。而且存放的并不是 ASCII码,而是Unicode码。默认值为 'u0000',最小值是 布尔型(boolean) 可取true和false两个值,默认值为 false。 单个的boolean 类型变量在编译的时候是使用的 int 类型。而对于boolean 类型的数组时,在编译的时候是作为byte array来编译的所以boolean 数组里面的每一个元件占一个字节,这是确定的常量
字面常量
直接的数字或字符串这种量,如 38整型字面量
如果只有数字[0-9],则是int型的。-128~127可以赋值给byte、short、int型变量,-32768~32767可以赋值给short、int型变量,-2,147,483,648~2,147,483,647可以赋值给int型变量。即根据字面量大小会进行自动类型识别。 如果是数字[0-9][lL] 则是long型的。 如果数字以0开头,则是8进制,以0x或0X开头是十六进制。 如089表示八进制89 0x78表示十六进制78
实型字面量
如果包含[.eE]则是double型的,包含[.eE]并以[fF]结尾则是float型的。 如1E5表示1*10^5 0.33 .78 123.
注意,E前面必须有数字,E后面必须是整数。
浮点数的有效位数是有限的,float型只有7个有效位,double型只有15~16个有效位,超过部分会自动做四舍五入处理。请看下例。
所以字面量中 1234567.456F 和 1234567.45678833F 并没有什么区别,最终都会被识别为1234567.4F。
浮点数并不能准确被存储,如1.3在内存中可能是1.299999也可能是 1.30000001,所以可能(不绝对) 1.3 !== 1.3字符型字面量
字符常量是用单引号(即撇号)括起来的一个字符。如'a'、'D'都是字符常量。 某些特殊的字符,比如回车符、换行符、退格符等,无法直接用单引号括起来。为了表示这些字符,Java提供了一种特殊形式的字符常量,就是以一个“\”开头的字符序列,“\”后面的字符不再是原来的含义,所以又被称为转义序列或换码序列。如 '\n'表示换行,'\r'表示回车,另外还有八进制和十六进制的表示方法,如下:\ddd 八进制字符 (ddd) \uxxxx 16进制Unicode字符 (xxxx)
字符型的变量存储时,就是一个无符号型short类型的整数,即范围为0~65535。
字符串型字面量
Java的字符串常量也是包含在两个引号之间的字符序列(可以是任何 Unicode 字符)。字符串本质上是对象类型。 如 "hello 中国"
布尔型字面量
即 true 和 false。命名常量
final int FEMALE=2;
// 用 final 修饰的是常量,定义时必须有初始值,不可再修改
习惯上,符号常量名用大写(用_线分割单词),普通变量名用小写(用驼峰分割单词),以示区别。建议读者使用符号常量以提高程序的可读性和可维护性。
变量
局部变量
局部变量是指定义在方法体内的变量或者方法体中的语句块中的变量。 定义变量的一般格式是:类型名 标识符1[=初始值1,标识符2=[初始值2,[...]]]
实际上会被编译成:
类型名 标识符1;
标识符1 = 初始值1;
类型名 标识符2;
标识符2 = 初始值2;
....
在 Java中,所有用到的变量都要“先定义,后使用”
一个局部变量在引用之前,必须要显示地初始化,否则将无法通过编译。注意,只要在第一次取值前初始化即可,不用定义变量时就必须初始化。
作用域
它只在定义它的方法中有效,在此方法以外,是无法使用这些变量的。 方法中定义的变量,从定义变量的这一行开始,到本方法的结尾。 语句块中定义的变量,其作用域从定义的行到块语句末尾。 在同一个作用域中,不允许定义两个同名的变量(即使类型不同也会报错)。 不同作用域中可以定义同名变量,程序会读取最近的作用域的那个变量。成员变量
数据类型的转换
基本数据类型,除了布尔类型外,其余类型的数据是可以混合在起运算的。 例如:“10+a+1.5-5.123*'b'”是合法的。不过在运算时,如果某个运算符两侧的数据类型不一致,就必须要转换成同一类型,然后才能运算。 无论是扩展转换还是缩减转换, 都是产生了原数据的一个副本转换的结果不会对原赘据有任何的影响。自动类型转换(扩展转换)
由系统自动进行的类型转换,不会损失精度。转换的基本原则是: 范围小的转换成范围大的,精度小的转换成精度大的。
当双目运算符左右两侧的变量(常量)类型不一致时,必须先转换为一致才可进行运算。
取上图中,两种类型的最近的共同祖先类型。可以是赋值运算符、加号...。 如byte+char ==> int + int byte+short ===> short + short
强制类型转换(缩减转换)
必须由程序员手动指定的类型转换,这种转换多数时候可能会损失精度。
当需要转换为另 一种类型时,按上图中的方向转换时,都需要进行强制转换。
如 int a; byte c = (byte) a;
// 在变量左侧加要转换的目的类型,注意,(byte)的括号是必须的,不写的话会报错
(byte) (a + b);
// 对于表达式,可以用括号括起来
Java在根据程序员的指令进行缩减转换的时候,有一套比较复杂的规则。
原则上是在保证符号的情况下,丢弃掉高字节(靠左边的字节)的内容。
但这么做并不能保证转换的结果符合程序员的预期效果。
浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入
- 不能对boolean类型进行类型转换。
- 2. 不能把对象类型转换成不相关类的对象。