第二章 (Ⅰ) Java基本语法之数据类型、变量、运算符
一、Java标识符、关键字与命名规则
1、Java标识符:
是为方法、变量或其他用户定义项所定义的名称。
在Java语言中,标识符由数字、字母、$、_ 、以及Unicode字符集中符号大于0xC0的所有符号组合构成(各符号之间无空格)
注:标识符不能由数字开头;标识符可以包含关键字,但不能与关键字重名;Java区分大小写。
例如以下合法与不合法标识符。合法标识符:date、KaTeX parse error: Expected group after '_' at position 13: 2011、_date、D_̲date 等。不合法的标识符:123.com、2com、for、if、fruit 等。
2、关键字:
是对编译器有特殊意义的固定单词。
保留字是为 Java 预留的关键字,它们虽然现在没有作为关键字,但在以后的升级版本中有可能作为关键字。
Java 语言目前定义了 51 个关键字,这些关键字不能作为变量名、类名和方法名来使用。以下对这些关键字进行了分类。
数据类型:boolean、int、long、short、byte、float、double、char、class、interface。
流程控制:if、else、do、while、for、switch、case、default、break、continue、return、try、catch、finally。
修饰符:public、protected、private、final、void、static、strict、abstract、transient、synchronized、volatile、native。
动作:package、import、throw、throws、extends、implements、this、supper、instanceof、new。
保留字:true、false、null、goto、const。
提示:由于 Java 区分大小写,因此 public 是关键字,而 Public 则不是关键字。但是为了程序的清晰及可读性,要尽量避免使用关键字的其他形式来命名。
3、命名规则
二、Java注释
1、单行注释 //
2、多行注释 包含在“/”和“/”之间,能注释很多行的内容。
为了可读性比较好,一般首行和尾行不写注释信息。
注意:多行注释可以嵌套单行注释,但是不能嵌套多行注释和文档注释。
3、文档注释
包含在“/**”和“*/”之间,也能注释多行内容,一般用在类、方法和变量上面,用来描述其作用。注释后,鼠标放在类和变量上面会自动显示出我们注释的内容
注意:文档注释能嵌套单行注释,不能嵌套多行注释和文档注释,一般首行和尾行也不写注释信息。
ps:
Javadoc(文档注释)详解见地址:
http://c.biancheng.net/view/6262.html
三、数据类型
1、
2、Java数据类型转换
(1)自动类型转换
两个条件:两种数据类型彼此兼容
目标类型的取值范围大于源数据类型(低级类型数据转换成高级类型数据)
自动转换的规则是从低级类型数据转换成高级类型数据。转换规则如下:
数值型数据的转换:byte→short→int→long→float→double。
字符型转换为整型:char→int。
例如,下面看起来正确的程序却会引起问题:
byte b = 50;
b = b * 2; // Type mismatch: cannot convert from int to byte
如上所示,第二行会报“类型不匹配:无法从int转换为byte”错误。
该程序试图将一个完全合法的 byte 型的值 502 再存储给一个 byte 型的变量。但是当表达式求值的时候,操作数被自动的提升为 int 型,计算结果也被提升为 int 型。这样表达式的结果现在是 int 型,不强制转换它就不能被赋为 byte 型。确*实如此,在这个特别的情况下,被赋的值将仍然适合目标类型。所以应该使用一个显示的强制类型转换,例如:
byte b = 50;b = (byte)(b*2);
这样就能产生正确的值 100。
注意:char 类型比较特殊,char 自动转换成 int、long、float 和 double,但 byte 和 short 不能自动转换为 char,而且 char 也不能自动转换为 byte 或 short。
(2)强制类型转换
当两种数据类型不兼容,或目标类型的取值范围小于源类型时,自动转换将无法进行,这时就需要进行强制类型转换。
其语法格式如下:(type)variableName
其中,type 为 variableName 要转换成的数据类型,而 variableName 是指要进行类型转换的变量名称,强制转换的实例如下:
int a = 3;double b = 5.0;a = (int)b;
在强制类型转换中,如果是将浮点类型的值转换为整数,直接去掉小数点后边的所有数字;而如果是整数类型强制转换为浮点类型时,将在小数点后面补零。
四、关于常量
常量是指在程序的整个运行过程中值保持不变的量。
1、常量值
(1)整型常量值
Java 的整型常量值主要有如下 3 种形式:
十进制数形式:如 54、-67、0。
八进制数形式:Java 中的八进制常数的表示以 0 开头,如 0125 表示十进制数 85,-013 表示十进制数 -11。
十六进制数形式:Java 中的十六进制常数的表示以 0x 或 0X 开头,如 0x100 表示十进制数 256,-0x16 表示十进制数 -22。
整型(int)常量默认在内存中占32位。
长整型类型则要在数字后面加 L 或 1, 如 697L,表示一个长整型数,它在内存中占 64 位。
(2)实型常量值
Java 的实型常量值主要有如下两种形式。
十进制数形式:由数字和小数点组成,且必须有小数点,如 12.34、-98.0。
科学记数法形式:如 1.75e5 或 32&E3,其中 e 或 E 之前必须有数字,且 e 或 E 之后的数字必须为整数。
Java 实型常量默认在内存中占 64 位,是具有双精度型(double)的值。
单精度型数值一般要在该常数后面加 F 或 f,如 69.7f,表示一个 float 型实数,它在内存中占 32 位(取决于系统的版本高低)。
(3)布尔型常量值
Java 的布尔型常量只有两个值,即 false(假)和 true(真)。
注:不能用0、1代替,且必须为小写。
(4)字符型和字符串常量值
Java 的字符型常量值是用单引号引起来的一个字符,如 ‘e’、E’。
双引号用来表示字符串,像 “11”、“d” 等都是表示单个字符的字符串。
Java 还允许使用一种特殊形式的字符常量值来表示一些难以用一般字符表示的字符,这种特殊形式的字符是以 / 开头的字符序列,称为转义字符。
2、定义常量
Java 语言使用 final 关键字来定义一个常量,其语法如下所示:
final dataType variableName = value
其中,final 是定义常量的关键字,dataType 指明常量的数据类型,variableName 是变量的名称,value 是初始值
常量有三种类型:静态常量、成员常量和局部常量。
静态变量:
public static 修饰的常量作用域是全局的,不需要创建对象就可以访问它,在类外部访问形式为 HelloWorld. PI。这种常量在编程中使用很多。
成员常量,作用域类似于成员变量,但不能修改。
局部常量,作用域类似于局部变量,但不能修改
注:在定义常量时,需要注意如下内容:
-在定义常量时就需要对该常量进行初始化,后面不能改动,否则会提示错误。
-final 关键字不仅可以用来修饰基本数据类型的常量,还可以用来修饰对象的引用或者方法。
-为了与变量区别,常量取名一般都用大写字符。
五、变量
1、声明变量
在 java 中用户可以通过指定数据类型和标识符来声明变量,其基本语法如下所示:
DataType identifier;
或者DataType identifier=value;
DataType:变量类型,如 int、string、 char 和 double 等。
identifier:标识符,也叫变量名称。
value:声明变量时的值。
2、变量赋值
初始化变量有两种方式:一种是声明时直接赋值,一种是先声明、后赋值。多个同类型的变量可以同时定义或者初始化,但是多个变量中间要使用逗号分隔,声明结束时用分号分隔。
3、Java变量的作用域
根据作用域的不同分为:
(1)成员变量
Java 的成员变量有两种,分别是全局变量和静态变量(类变量)。定义在方法体和语句块之外,不属于任何一个方法,作用域是整个类。
(2)局部变量
局部变量是指在方法或者方法代码块中定义的变量,其作用域是其所在的代码块。
可分为以下三种:
方法参数变量(形参):在整个方法内有效。
方法局部变量(方法内定义): 从定义这个变量开始到方法结束这一段时间内有效。
代码块局部变量(代码块内定义):从定义这个变量开始到代码块结束这一段时间内有效。
注、局部变量在使用前必须被程序员主动初始化值。
六、运算符
1、算术运算符
(1)一元运算符:
(2)二元运算符
优先级上*、/、%具有相同运算级别,并高于+、-(+、-具有相同级别)。
算术运算符的运算规则与数学中的运算规则是相同的。
注:进行算术运算时应注意以下两点:
求余运算要求参加运算两个操作数均为整型,不能为其他类型。
两个整数进行除法运算,其结果仍为整数,若整数与实数进行除法运算,则结果为实数。
例如:编写一个程序,输入不同类型的两个数,执行相加、相减、相乘、相除和求余后输出结果
public static void main(String[] args) {
float f1 = 9 % 4;// 保存取余后浮点类型的结果
double da = 9 + 4.5; // 双精度加法
double db = 9 - 3.0; // 双精度减法
double dc = 9 * 2.5; // 双精度乘法
double dd = 9 / 3.0; // 双精度除法
double de = 9 % 4; // 双精度取余
System.out.println("整数的算术运算"); // 整数的加、减、乘、除和取余
System.out.printf("9+4=%d \n", 9 + 4);
System.out.printf("9-4=%d \n", 9 - 4);
System.out.printf("9*4=%d \n", 9 * 4);
System.out.printf("9/4=%d \n", 9 / 4);
System.out.printf("9%%4=%d \n", 9 % 4);
System.out.println("\n浮点数的算术运算"); // 浮点数的加、减、乘、除和取余
System.out.printf("9+4.5f=%f \n", 9 + 4.5f);
System.out.printf("9-3.0f=%f \n", 9 - 3.0f);
System.out.printf("9*2.5f=%f \n", 9 * 2.5f);
System.out.printf("9/3.0f=%f \n", 9 / 3.0f);
System.out.printf("9%%4=%f \n", f1);
System.out.println("\n双精度数的算术运算"); // 双精度数的加、减、乘、除和取余
System.out.printf("9+4.5=%4.16f \n", da);
System.out.printf("9-3.0=%4.16f \n", db);
System.out.printf("9*2.5=%4.16f \n", dc);
System.out.printf("9/3.0=%4.16f \n", dd);
System.out.printf("9%%4=%4.16f \n", de);
System.out.println("\n字符的算术运算"); // 对字符的加法和减法
System.out.printf("'A'+32=%d \n", 'A' + 32);
System.out.printf("'A'+32=%c \n", 'A' + 32);
System.out.printf("'a'-'B'=%d \n", 'a' - 'B');}
保存文件并运行,输出的结果如下:
(3)算术赋值运算符
ps:在使用自增/自减运算时应注意下面几个问题:
-自增/自减只能作用于变量,不允许对常量、表达式或其他类型的变量进行操作。
-自增/自减运算可以用于整型、浮点型、字符串类型。
-在Java1.5以上的版本中,自增/自减运算可以用于基本类型对应的包装器类Byte、Short、Integer、Long、Float、Double 和 Character。
-自增/自减运算结果的类型与被运算的变量类型相同。
2、赋值运算符(=)
语法格式:变量名称=表达式内容
赋值运算符的优先级低于算术运算符,结合方向是自右向左
3、逻辑运算符
逻辑运算符是对布尔型变量进行运算,其结果也是布尔型,即ture或false。
逻辑运算符的优先级为:!运算级别最高,&&高于||运算。!运算符的优先级高于算术运算符,而&&和||运算则低于关系运算符。
结合方向为:!具有右结合性,&、| 具有左结合性。
注:&&和 || 能够采用最优化的计算方式,从而提高效率。在编程时应优先考虑使用。
4、关系运算符
逻辑上的true与false用数字1与0来表示。
关系运算符的优先级为:>、<、>=、<=具有相同的优先级,并且高于 !=、==。
关系运算符的优先级高于赋值运算符而低于算术运算符,结合方向是自左向右。
注:
不要将“==”写成“=”;
由于计算机内存放的实数与实际的实数存在着一定的误差,如果对浮点数进行==(相等)或!=(不相等)的比较,容易产生错误结果,应尽量避免。
5、位运算符
(1)位逻辑运算符
位与运算符位与运算符为 &,其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位同时为 1,那么计算结果才为 1,否则为 0。因此,任何数与 0 进行按位与运算,其结果都为 0。
位或运算符为 |,其运算规则是:参与运算的数字,低位对齐,高位不足的补零。如果对应的二进制位只要有一个为 1,那么结果就为 1;如果对应的二进制位都为 0,结果才为 0。
位异或运算符为^,其运算规则是:参与运算的数字,低位对齐,高位不足的补零,如果对应的二进制位相同(同时为 0 或同时为 1)时,结果为 0;如果对应的二进制位不相同,结果则为 1。
位取反运算符为~,其运算规则是:只对一个操作数进行运算,将操作数二进制中的 1 改为 0,0 改为 1。
(2)位移运算符
左移位运算符为 «,其运算规则是:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
右位移运算符为 »,其运算规则是:按二进制形式把所有的数字向右移动对应的位数,低位移出(舍弃),高位的空位补零。
详解请看:http://c.biancheng.net/view/784.html
(3)复合赋值运算符
6、条件运算符( ?:)
例如:z = x>y ? x : y
如果x>y则z=x否则z=y
7、运算符的优先级
执行的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的约束
ps:何为直接量(字面量) ?
例如
在int a=5;中,为变量a所分配的初始值5就是一个直接量。