Java复习三 ---- 数据类型和运算符
概述
Java语言是一门强类型的语言.强类型包含两个方面 :
- 所有的变量必须先声明后使用
- 指定类型的变量只能接受与之匹配的值
而且强类型语言可以在编译时发现程序中的错误,从而提高程序的健壮性
Java提供了丰富的基本数据类型 : byte char int short long double float boolean
Java还提供了功能丰富的运算符 : 包括所有的算术运算符, 位运算符, 比较运算符, 逻辑运算符.
注释
编写程序时总需要为程序添加一些注释,用来说明某段代码的作用,或者说明某个类的用途,某个方法的功能,以及该方法的返回值,参数以及意义等…
程序注释是源代码的重要部分,对于一份规范的程序源代码而言,注释应该占到源代码的 1/3 以上.
单行注释和多行注释
public class Test{
/*
这是多行注释
*/
public static void main(String args[]){
//这时单行注释
System.out.println("HelloWorld");
}
}
文档注释
Java语言还提供了一种功能更强大的注释 : 文档注释.如果编写 Java源代码 时添加了合适的文档注释,然后通过JDK提供的Javadoc工具可以将源代码里的文档注释提取成一份系统的API文档.
例子 :
package lfy;
/**
* @author LFY
* @version V1.0
*/
public class TestJavaDoc{
/**
*
*测试简单的成员变量
*
*/
private String name;
/**
*主方法 程序的入口
*
*/
public static void main(String args[]){
System.out.println("Hello World");
}
}
在类所在的包下用cmd运行命令 :
javadoc -d apidoc -windowtitle 测试 -header 我的类 *.java
-d <directory> : 指定一个路径,用于将生成的 API 文档放到指定的目录下.
-windowtitle <text> : 用于设置API文档的浏览器窗口标题
-header <html-code> : 指定HTML格式的文本,包含每个页面的页眉
错误一 :
解决 :
将java文件转为ANSI格式的文件
错误二 :
解决 : 将类变为public类型
运算符和关键字
分隔符
-
分号
JAVA语言采用分号作为语句的分隔,因此每个Java语句必须使用分号作为结束,java程序允许一行书写多个语句,每个语句之间必须使用分号进行分割即可.
例子 :
int age = 23; String name = "XiaoMing"; String hello = "Hello" + "world";
但是一个字符串不能跨越多行 并且一个变量名也不能跨越多行. 以下都是错误的写法 :
String hello = "hello world"; String he llo = "hello World";
-
花括号
花括号的作用就是定义一个代码块,一个代码块就是 “{” 和 "}"所包含的代码,代码块在逻辑上是一个整体.
-
方括号
方括号的主要作用就是用于访问数组元素,方括号后面紧跟数组变量名,而方括号李指定希望访问的数组元素的索引.
-
圆括号
圆括号是一个功能非常丰富的分隔符 : 定义方法是使用它来包含所有的形参声明,调用方法使用它来传入实参值,还可以将表达式中的某部分包括起来成为一个整体,保证这个部分优先计算.
-
空格
Java语言使用空格分隔一条语句的不同部分,Java语言是一门格式自由的语言,所以空格几乎可以出现在java程序的任意位置,也可以出现任意多个空格.
-
圆点
通常作为类/对象和他的成员之间的分隔符,表明调用某个类/对象的某个方法或者变量.
标识符规则
- 标识符可以由数字字母下划线和美元符组成,其中数字不能打头
- 标识符不能是java的关键字或者保留字,但是可以包含关键字和保留字
- 标识符不能包含空格
- 标识符只能包含美元符号 不能包含 @ # 等特殊字符
Java关键字
Java语言中有一些具有特殊用途的单词被称为关键字,当定义标识符时,不要让标识符和关键字相同,否则将引起错误.
eg:
int boolean; //错误 boolean是关键字
java关键字 :
abstract | assert | boolean | break | byte |
---|---|---|---|---|
case | catch | char | class | const |
continue | default | do | double | else |
enum | extends | final | finally | float |
for | goto | if | implements | import |
instanceof | int | interface | long | native |
new | package | private | protected | public |
return | strictfp | short | static | super |
switch | synchronized | this | throw | throws |
transient | try | void | volatile | while |
基本数据类型
整型
- byte
- short
- int
- long
int 是最常用的类型如果直接给出一个整数值则默认为int类型.
如果直接将一个较小的整数值(在byte或者short类型的范围内)赋给一个byte或者short类型,则系统会自动将这个整数值当成byte或者short来处理.
如果讲一个巨大的整数值超过了int的范围时,java不会自动把这个整数值当做long类型来处理,如果希望系统把一个整数值当做long类型来处理,应在这个整数值后面加l或者L , 推荐使用 L ,因为 l 与 1 很像.
java整数值的表示方式
四种表示方式 :
- 十进制
- 二进制
- 八进制
- 十六进制
//以0开头的整数是八进制数
int octalValue = 012;
//以0x或者0X开头的整数是十六进制的数
int hexValue1 = 0x23;
int hexValue2 = 0X34;
//以0b或者0B开头的为二进制的数
//定义一个八位的二进制数
int binValue1 = 0b11010100; <==> 212
//定义一个32位的二进制数 最高位为符号位
byte binValue2 = 0B10000000000000000000000000000011 <==> -2147483645
当定义32为的二进制整数时,最高位是符号位,如果为1则为负数,负数在计算机中是以补码的形式存在的.正数的补码与源码完全相同. 补码 = 反码+1 反码 = 对原码按位取反(除了符号位)
eg: 转换 binValue2 (补码)
补码 : 10000000000000000000000000000011 减一得到反码
反码 : 10000000000000000000000000000010 按位取反得到原码
原码 : 11111111111111111111111111111101
字符型
字符型通常用于表示单个字符,必须使用单引号 "’"括起来.Java语言使用16为的UNICODE字符集作为编码方式.而UNICODE被设计成支持世界上所有书面语言的字符,包括中文字符,因此Java程序支持各种语言的字符.
Java字符值的表示方式
- 直接通过单个字符来指定字符值 : 如 ‘a’ ‘9’ ‘0’ .
- 通过转义字符表示特殊字符值 : 如 ‘\n’ ‘\t’ .
- 直接使用UNICODE值来表示字符型值 : 如 ‘\uXXXX’ . XXXX 代表十六进制的整数.
转义字符 :
转义字符 | 说明 | UNICODE表示方式 |
---|---|---|
\b | 退格符 | \u0008 |
\n | 换行符 | \u000a |
\r | 回车符 | \u000d |
\t | 制表符 | \u0009 |
" | 双引号 | \u0022 |
’ | 单引号 | \u0027 |
\\ | 反斜线 | \u005c |
char 类型的变量.值完全可以参与加减乘除的运算,系统会自动把int类型当成char类型来处理.
浮点型
Java的浮点型有两种 : float 和 double .
Java浮点类型有固定的表数范围和字段长度,字段长度和表数范围与机器无关.
Java的浮点数遵循 IEEE 754 标准 : 采用二进制数据的科学计数法来表示浮点数 .
- float型 第一位为符号位 接下来的八位是指数 在接下来的三十二位为尾数
- double型 第一位为符号位 接下来的十一位为指数,在接下来的五十二位表示尾数.
Java浮点型的表示方式
- 十进制数形式 : 如 5.12 , 512.3 , .513 浮点数必须包含一个小数点,否则会按照int类型处理
- 科学计数法形式 : 如 5.12e2 , 5.12E2
Java语言浮点型默认为double,如果把浮点型当成float类型处理,则应该在这个浮点类型值后紧跟 f 或 F. 当然也可以在一个浮点数后加d 或者 D 表示double类型.
Java还提供了三个特殊的浮点数值 : 正无穷大 负无穷大 非数, 用于表示溢出或者出错.
例如 :
正数(浮点数) / 0 : 正无穷大
负数(浮点数) / 0 : 负无穷大
0.0 / 0.0 : 非数
整数/0 : 出错
正无穷大通过 Double 或者 Float 的 POSITIVE_INFINITY 表示
负无穷大通过 Double 或者 Float 的 NEGATIVE_INFINITY 表示
非数通过 Double 或者 Float 的 NaN 表示
正无穷大 == 正无穷大 负无穷大 == 负无穷大 NaN不与任何数值相等,甚至不与NaN相等.
public class FloatTest{
public static void main(String args[]){
float af = 5.2335466f;
//下面将看到af的数值发生了变化
System.out.println(af);
double a = 0.0;
double c = Double.NEGATIVE_INFINITY;
float d = Float.NEGATIVE_INFINITY;
//float与double的负无穷大相等
System.out.println(c == d);
//0.0/0.0会出现非数
System.out.println(0.0/0.0);
//两个非数是不相等的
System.out.println(a/a == Float.NaN);
//所有的正无穷大相等
System.out.println(5.0/0.0 == 64.0/0.0);
//负数除以0.0得到负无穷大
System.out.println(-8/a);
}
}
布尔型
用于表示逻辑上的真假,数值只能是 true 或者 false.
基本类型转换
自动类型转换
Java所有的类型都可以相互转换,如果系统支持把某种基本类型直接赋给另一种基本类型的变量,则这种方式称为自动类型转换. 表数范围小的 --> 表数范围大的.
当int类型加上一个字符串转换为了一个字符串.
强制类型转换
如果要想把 : 表数范围大的 --> 表数范围小的 必须进行强制类型转换.
语法格式 : (targetType)value
public class NarrowConversion{
public static void main(String args[]){
int iValue = 233;
//强制把int类型转换为byte类型
byte bValue = (byte)iValue;
//将输出-23
System.out.println(bValue);
double dValue = 3.98;
//强制把double类型转换为int类型
int tol = (int)dValue;
//将输出3
System.out.println(tol);
}
}
强制类型转换可能会造成数据丢失 :
eg: 上面把int类型转为byte类型 :
int类型 : 0000 0000 0000 0000 0000 0000 1110 1001
byte类型 : 1110 1001 补码
1110 1000 反码
1001 0111 原码
所以值为 -23
表达式类型的自动提升
当一个算术表达式中包含多个基本类型的数据时,整个算术表达式的数据类型将会发生自动提升,规则为 :
- 所有 byte 类型, short 类型 以及 char 类型被提升为int类型.
- 整个算术表达式的数据类型自动提升为表达式中最高等级操作数相同的类型.
//定义一个short类型的变量
short sValue = 2;
//表达式中的SValue将自动提升为int类型,则右边表达式为int类型
//将一个int类型的值赋给short类型必将发生错误
sValue = sValue + 2;
//输出字符串 hello!a7 字符串连接运算
System.out.println("hello"+'a'+7);
//输出 104hello 'a'+97先将类型提升为int类型,然后再进行字符串拼接
System.out.println('a'+97+"hello");
直接量
直接量是指在程序中通过源代码直接给出的值,例如在 int a = 5 中,为变量 a 所分配的初始值为 5 就是一个直接量.
Java主要支持8中类型的直接量 :
int, long, float, double, Boolean, char, String, null
直接量的赋值
int a = 5;
char c = 'a';
boolean b = true;
long d = 454545454L;
float f = 3.35f;
double d = 43.4;
String author = "lifanyu";
String book = null;
String 类型的值不能赋给其他类型的变量, null 可以赋值给任意的类型的变量.
当程序第一次使用字符串直接量时,Java会将其放在常量池中,如果程序后面使用该字符串常量,则会将常量池中的字符串取出.
String s1 = "hello";
String s2 = "hello";
String s3 = "he"+"llo";
System.out.println(s1 == s2); //true
System.out.println(s1 == s3); //true
运算符
算术运算符
- + 加法运算符,字符串连接符
- - 减法运算符
- * 乘法运算符
- / 除法运算符 舍去余数
- % 取余
- ++ –
- 单目运算符,只能操作一个操作数
- 只能操作变量,不能操作常量和表达式
int a = 5;
//先执行算术运算然后再使a加一
int b = a++ + 5;
//先使a加一然后进行算术运算
int c = ++a + 5;
赋值运算符
赋值运算符用于为变量指定变量值. 也可以将一个变量的值赋给另外一个变量.
赋值运算符是从右向左进行计算的,因此赋值运算符左边必须为变量.
eg :
String str = "hello";
double pi = 3.14;
boolean visited = true;
int a, b, c;
a = b = c = 7;
String str2 = str;
System.out.println(str2);
位运算符
Java支持的位运算符有7个 :
&: 按位与 两位同时为 1 才为 1
|: 按位或 只要有一位为1 则为1
~: 按位非 将操作数的每一位取反
^: 按位抑或 两位相同时为0 不同则为1
<<: 左移运算符
>>: 右移运算符
>>>:无符号右移运算符
扩展后的赋值运算符
+= -= *= /= %= &= |= ^= <<= >>= >>>=
比较运算符
> >= < <= == !=
逻辑运算符
//逻辑运算符主要用来操作两个布尔型的变量或者常量
& 不短路与
&& 与
| 不短路或
|| 或
! 非
^ 抑或 两个操作数相同返回true 不相同返回 false
三目运算符
(expression)?if-true-statement:if-false-statement;
4>5?1:2 结果为2
运算符的优先级
优先级 | 运算符 | 结合性 |
---|---|---|
1 | () , [] , % | 从左向右 |
2 | ! , +(正), -(负), ~,++,– | 从右向左 |
3 | * , / | 从左向右 |
4 | +(加), -(减) | 从左向右 |
5 | << , >>, >>> | 从左向右 |
6 | <, <=, >, >= | 从左向右 |
7 | ==, != | 从左向右 |
8 | & | 从左向右 |
9 | ^ | 从左向右 |
10 | | | 从左向右 |
11 | && | 从左向右 |
12 | || | 从左向右 |
13 | ?: | 从右向左 |
14 | = , +=, -=, *=, /=,%=,&=,|=,^=,~=,<<=,>>=,>>>= | 从右向左 |