一、数据类型
Java 的数据类型分为两大类:
- 基本数据类型:整数、浮点数、字符型、布尔型
- 引用数据类型(对象类型):类、数组,字符串、接口等。
2、基本数据类型
四类八种基本数据类型:
数据类型 | 关键字 | 内存占用 | 取值范围 |
字节型 | byte | 1个字节 | -128~127 |
短整形 | short | 2个字节 | -32768~32767 |
整形 | int(默认) | 4个字节 | -2的31次方~2的31次方-1 |
长整型 | long | 8个字节 | -2的63次方~2的63次方-1 |
单精度浮点型 | float | 4个字节 | 1.4013E-45~3.4028E+38 |
双精度浮点型 | double(默认) | 8个字节 | 4.9E-324~1.7977E+308 |
字符型 | char | 2个字节 | 0~65535 |
布尔类型 | boolean | 1个字节 | true、false |
(1)整数类型
整数用来存储整数数值,可以是正整数,负数,有3种表示形式:
-88 // 十进制
0123 //八进制必须以 0 开头
0x25 // 十六进制必须以 0X 或 0x 开头
int类型为默认的整数类型,对于long 类型的值,在定义是在数字后加 L 或 l,表示该数值为长整型。
(2)浮点数类型
浮点数默认的是double类型,如果想要为float类型数据赋值,、应在后面加 F 或 f 。
(3)字符类型
1、char c1 = ‘A’;
2、char c2 = 65;
3、char c3 = ‘\u0041’
转义字符 “\” 是一种特殊的字符变量,不同的字符代表不同的意义。
"\n" 表示换行
"\t" 表示制表符
(4)布尔类型
只有 true 、false 两个字值。
boolean类型不能参与运算
Tips:
(1)Java中的默认类型:整形类型是 int、浮点类型是 double。
(2)字符串不是基本类型,而是引用类型。
(3)浮点型可能只是一个近似值,并非精确的值。
(4)数据范围与字节数不一定相关,例如float数据范围比long更加广泛,但是float是4字节,long是8字节。
(5)浮点数当中默认类型是double。如果一定要使用float类型,需要加上一个后缀F。如果是整数,默认为int类型,如果一定要使用long类型,需要加上一个后缀L。推荐使用大写字母后缀。
二、变量与常量
1、关键字(keywords):
是指在程序中,java 已经定义好的单词,具有特殊含义。
Java关键字表:
int | public | this | finally | boolean | abstract |
continue | float | long | short | throw | throws |
if | goto | default | byte | do | case |
strictfp | package | super | void | try | switch |
else | catch | implements | private | final | class |
extends | volatile | while | synchronized | instanceof | char |
protected | import | transient | default | double | interface |
return | break | for | static | new | |
2、标识符
是指在程序中,用来标识类名、变量名、方法名、数组名、文件名的有效字符序列。
- 命名规则:(硬性要求)
- 标识符可以包含 英文26个字母(区分大小写)、0-9数字、$()美元符号 和 _(下划线) 组成。
- 标识符不能以数字开头。
- 标识符不能是关键字。
- 长度没有限制
- 命名规范:(软性建议)
- 类名规范:首字母大写,后面的每个单词首字母大写(大驼峰式)。
- 方法名规范:首字母小写,后面每个单词首字母大写(小驼峰式)。
- 变量名规范:全部小写。
- 常量名规范:全部大写。
- 包名规范:全部小写。
- 望文生义的原则
3、变量
(1)在程序执行过程中,值可以被改变的量称为变量。
(2)变量的分类:
类型 | 含义 | 数据举例 |
整数常量 | 所有的整数 | 0,1,578,-6 |
小数常量 | 所有的小数 | 3.14,-0.1 |
字符常量 | 单引号引起来,只能写一个字符,必须有内容 | 'a',' ','中' |
字符串常量 | 双引号引起来,可以写多个字符,也可以不写 | "a","hello","中国" |
布尔常量 | 只有两个值 | true、false |
空常量 | 只有一个值 | null |
(3)变量的定义(声明变量)
变量定义的格式包括三个要素:数据类型、变量名、数据值。
语法:
(1)数据类型 变量名 = 数据值; // 一步到位的格式,声明并赋值
(2)数据类型 变量名; // 声明一个变量,
变量名 = 数据值; // 赋值,将右边的数据值,赋值交给左边的变量
(3)数据类型 变量名称1,变量名称2,变量名称3 = 值,变量名称4,变量名称5 =值2; //多个相同类型的变量声明并赋值
Tips:
(1)如果创建多个变量,那么变量之间的名称不可以重复。(在同一作用域内)
(2)对于 float 和 long 类型来说,字母后缀 F 和 L 不要丢掉。
(3)java 语言是强类型的编程语言,要求数据类型必须和值的类型相同
(4)如果使用byte或者short类型的变量,那么右侧的数据值不能超过左侧类型的范围。
(5)没有进行赋值的变量,不能直接使用;一定要赋值之后,才能使用。
(6)变量使用不能超过作用域的范围。
【作用域】:从定义变量的一行开始,一直到直接所属的大括号结束为止。
(7)可以通过一个语句来创建多个变量,但是一般情况不推荐这么写。
1 // 同时创建了三个全都是int类型的变量
2 int a, b, c;
3 // 各自分别赋值
4 a = 10;
5 b = 20;
6 c = 30;
7 System.out.println(a); // 10
8 System.out.println(b); // 20
9 System.out.println(c); // 30
10
11 // 同时创建三个int变量,并且同时各自赋值
12 int x = 100, y = 200, z = 300;
13 System.out.println(x); // 100
14 System.out.println(y); // 200
15 System.out.println(z); // 300
(4)变量的有效范围
变量被定义出来后只是暂存在内存中,等到程序执行到某一个点,该变量会被释放掉,也就是变量的生命周期。变量的有效方位能够访问该变量的区域,若超出该区域,则在编译的时候出现错误。根据“有效范围”可以分为以下两类:
a. 成员变量
在类中定义的变量称为成员变量,成员变量在整个类中都有效。成员变量又可分为两种:静态变量和实例变量。
Demo:
1 class var{
2 int x = 45;
3 static int y = 80;
4 }
x 为实例变量,y 为静态变量(也称类变量)。如果在成员变量的类型前面加上关键字 static 这样的成员变量就称为 静态变量。
静态变量的有效范围可以跨类,甚至可在整个应用程序之内。对于静态变量,除了能在定义它的类中存取,还能直接以 “类名.静态变量” 的方式在其他类内使用。
b. 局部变量
在类的方法体重定义的变量,方法内部定义,在 { } 之间的代码中声明的变量称为局部变量。局部变量只在当前代码块有效。
在类的方法中声明的变量,包括方法的参数,都属于局部变量。局部变量只在当前定义的方法内有效。局部变量的生命周期取决于方法,当方法被调用时,为变量分配空间,方法调用结束后,则释放局部变量的内存空间,局部变量销毁。
Tips:局部变量与成员变量同名时,成员变量将被隐藏。即这个成员变量在此方法中暂时失效。
4、常量
在程序执行过程中,值不变的量,即固定不变的量称为常量。也被称为 "final变量"。
常量在整个程序中只能被赋值一次,在为所有的对象共享值时,常量非常有用。
语法:
final double PI = 3.14159; // 声明 double 型的常量PI 并赋值
三、数据类型转换
类型转换是从一种类型更改为另一种类型的过程。如果从低精度数据类型向高精度转换,则永远不会溢出,总是成功。相反,从高精度向低精度转换,可能出现信息丢失,有可能失败。
1、自动转换(隐式转换)
将 取值范围小的类型 自动提升为 取值范围大的类型。
Demo:
public static void main(String[] args) {
int i =1;
byte b = 2;
// byte x = b + 1; 报错
// int类型和 byte 类型运算,结果是 int类型
int j = b + i;
System.out.println(j);
}
转换原理图解:
byte 类型内存占有1个字节,在和 int 类型运算会提升为 int 类型,自动补充 3个字节,因此计算后的结果是 int 类型。
转换规则:范围小的类型向范围大的类型提升,byte、short、char 运算时直接提升为 int 类型。
byte、short、char --> int --> long --> float --> double
总结:
a、特点:代码不需要进行特殊处理,自动完成。
b、规则:数据范围从小到大
2、强制转换(显式转换)
强制类型转换:
数据类型 变量名 = (数据类型) 被转数据值;
Demo:
1 public static void main(String[] args){
2 // short 类型变量,内存中2个字节
3 short s = 1;
4 /*
5 出现编译失败
6 s 和 1做运算的时候,1是int类型,s 会被提升为 int 类型
7 s+1 后的结果是 int 类型,将结果在赋值 short 类型时发生错误
8 short 内存2个字节,int 类型4个字节
9 必须将 int 强制转成 short 才能完成赋值
10 */
11 s = s + 1; // 编译失败
12 s= (short) (s+1); // 编译成功
13 }
转换原理图解:
注意:
- 浮点转成整数,直接取消小数点,可能造成数据损失精度。
- int 强制转成 short 去掉2个字节,可能造成数据丢失。
总结:
a、特点:代码需要进行特殊的格式处理,不能自动完成。
b、格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据;
注意事项:
a、 强制类型转换一般不推荐使用,因为有可能发生精度损失、数据溢出。
b、byte/short/char这三种类型都可以发生数学运算,例如加法“+”.
c、byte/short/char这三种类型在运算的时候,都会被首先提升成为int类型,然后再计算。
d、 boolean类型不能发生数据类型转换
3、ASCII 编码表
字符与数字的对照关系表(编码表):当有 字符 类型的变量参与运算的时候,会把字符转变为相应的数字,然后再进行计算。
将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表ASCII( American Standard Code for Information Interchange 美国标准信息交换码),里面只有字母数字和常用符号,并没有汉字。
Unicode码表:万国码。也是数字和符号的对照关系,开头0-127部分和ASCII完全一样,但是从128开始包含有更多字符。
Tips:
在 char 类型和 int 类型计算的过程中,char 类型的字符先查询编码表,得到97,再和1求和,结果为98。char类型提升 为了int类型。char类型内存2个字节,int类型内存4个字节。
四、注释(comment)
注释:就是对代码的解释和说明。其目的是让人们能够更好轻松地了解代码。为代码添加注释,是十分必要的,并不影响程序的编译和运行。
分类:
- 单行注释:以 // 开头 换行结束
- 多行注释:以 /* 开头,以 */ 结束
- 文档注释:以 /** 开头,以 */ 结束,(文档注释只能注释类和函数,编译文档注释源文件 javadoc -d -doc 源文件名称)
五、扩展知识(编译器的两点优化)
1、自动类型转换问题
对于byte/short/char三种类型来说,如果右侧赋值的数值没有超过范围,那么javac编译器将会自动隐含地为我们补上一个(byte)(short)(char)。
(1)如果没有超过左侧的范围,编译器补上强转。
(2)如果右侧超过了左侧范围,那么直接编译器报错。
Demo:
1 // 右侧确实是一个int数字,但是没有超过左侧的范围,就是正确的。
2 // int --> byte,不是自动类型转换
3 byte num1 = /*(byte)*/ 30; // 右侧没有超过左侧的范围
4 System.out.println(num1); // 30
5
6 // byte num2 = 128; // 右侧超过了左侧的范围
7
8 // int --> char,没有超过范围
9 // 编译器将会自动补上一个隐含的(char)
10 char zifu = /*(char)*/ 65;
11 System.out.println(zifu); // A
2、编译器的常量优化
在给变量进行赋值的时候,如果右侧的表达式当中全都是常量,没有任何变量,那么编译器javac将会直接将若干个常量表达式计算得到结果。
short result = 5 + 8; // 等号右边全都是常量,没有任何变量参与运算编译之后,得到的 .class字节码文件当中相当于【直接就是】:short result = 13; (右侧的常量结果数值,没有超过左侧范围,所以正确。)
注意:一旦表达式当中有变量参与,那么就不能进行这种优化了。
Demo:
1 public static void main(String[] args) {
2 short num1 = 10; // 正确写法,右侧没有超过左侧的范围,
3
4 short a = 5;
5 short b = 8;
6 // short + short --> int + int --> int
7 // short result = a + b; // 错误写法!左侧需要是int类型,含有两个变量
8
9 // 右侧不用变量,而是采用常量,而且只有两个常量,没有别人
10 short result = 5 + 8;
11 System.out.println(result);
12
13 short result2 = 5 + a + 8; // 18 错误,里面有变量
14 }