变量
数据类型
定义
数据类型,表示的是一组数据的集合,和基于该数据集合的一组合法操作。
数据类型的分类
基本数据类型
- 整形 int long short byte
- 浮点型 float double
- 字符型 char
- 布尔型 boolean
数值类型 前7种
非数值类型 boolean
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-19dlXIrk-1681192817034)(
)]
引用数据类型
只要不是四类八种基本数据类型,那么它都是引用数据类型。
标识符
定义:为了方便使用起的名字
需要标识符起名字的常见结构:包, 类, 方法 ,变量
在Java当中,同包下是没有同名类的,不管这个class是public修饰还是非public的!
标识符的语法要求
通过以上标识符的语法要求,做几个总结:
-
标识符不能以数字开头,但可以由数字组成。
-
0xC0是一个十六进制数,Unicode 字符集中编号为0xC0后面的字符,几乎包含了世界上绝大多数非英语国家的文字字符。
这里面当然包括中文,韩文,日文等。所以标识符的命名从语法上来说,直接用中文是完全可以的。
-
Unicode 字符集兼容ASCII码表,Unicode 字符集中前128个字符就是ASCII码表中的字符。所以Unicode 字符集中编号为0xC0以及它后面的所有符号是不含很多常用英文字符的,比如:英文逗号,英文句号,空格,回车等。
当然,标识符不能是Java中的关键字和保留字,并且标识符严格区分大小写
变量的使用
常量定义
在程序运行过程中,其值不会发生改变的量,是绝对不会发生改变的量才能称之为常量。
分类
- **字面值常量,在Java代码中,所有直接写值的量都是字面值常量。**包括:
- 整数常量:直接写在代码中的整数都是。例如1、2、3等。
- 小数常量:直接写在代码中的小数都是。例如1.1、1.2、1.3等。
- 字符常量:直接写在代码中的,使用单引号引起来的字符都是。例如’A’、'a’等。
- 布尔常量:直接写在代码中的布尔值,只有true和false两个。
- 字符串常量:直接写在代码中的,使用双引号引起来的字符串都是。例如"HelloWorld"、"hello"等
- 空常量:空常量是引用数据类型独有的一种取值,只有null一个。(后面会讲,这里先记一下)
- 自定义常量,通过语法自由地定义一个常量在代码中使用。(面向对象再讲)
目前我们知道的常量只有字面值常量,它是比较简单的,了解即可
变量定义
在程序运行过程中,可能会发生变化的量
不同种类型的变量,它的使用方式是不同的
局部变量
代码块:由若干条Java语句组成,并且用一对大括号括起来的结构,叫做代码块。
局部变量的定义:
在Java中,把定义在局部位置的变量称之为“局部变量”。
局部位置的概念:在Java中,代码块的"{}"内部的位置都可以认为是局部位置。
比如:
-
方法体的大括号内部是典型的局部位置(也算代码块),比如main方法的大括号内部:
public static void main(String[] args) { // 局部位置 }
-
类体当中直接定义的大括号内部(代码块当中)
class A { // 代码块 { // 局部位置 } }
-
以上两个位置中继续嵌套的"{}"。也就是代码块中继续嵌套代码块,这时注意作用域即可。
类体,也就是类名后面的大括号不是代码块。类体当中不输于局部位置,类体当中直接定义的变量也不是局部变量。
局部变量的特点除了需要定义在局部位置,就是它的使用需要经过以下两步:
声明局部变量:声明局部变量的目的是告诉编译器,局部变量的数据类型和变量的名字。
Java编译器一旦发现代码中存在仅声明的局部变量,就会自动忽略掉它,也就是说编译后的class文件中是不存在未初始化局部变量的。
初始化局部变量
注意事项
- Java当中的整数字面值常量,默认当作int处理。假如你想使用字面值整数定义一个long类型变量,那么该字面值常量的后面应该加上一个"L"区分(禁止使用小写"l")。
- java当中的小数字面值常量,默认当作double处理。假如你想使用字面值小数定义一个float类型变量,那么该字面值常量的后面应该加上一个"F"或"f"区分。
- 定义一个变量是有它的作用范围的,这个范围通常用{}来界定,同样一个{}不能有同名变量。
- 虽然Java语法允许一行定义多个相同数据类型的变量,但规范的Java代码禁止这样做!
细节问题
String 类比较不能用"==‘’,用equest方法
float和double都不适合用于精确计算的场合,尤其不适合用于货币运算。
基本数据类型的数据类型转换
自动类型转换
- 自动数据类型发生在"小取值范围"转换为"大取值范围"的数据类型转换之间。
- char类型比较特殊,在参与数值类型的自动类型转换时,是编码值参与了转换。
强制类型转换
- 从"大取值范围"的数据类型转换到"小取值范围"的数据类型。
- "大变小"的强制类型转换极易造成数据溢出导致数据失真,除非特别有必要,一般情况下不要做强制类型转换。
表达式类型提升
- byte、short、char之间不互相转换,一旦发生运算,一律自动转换为int进行运算,结果是int
- char类型比较特殊,在参与数值类型的计算时,是编码值参与了运算。
- String作为字符串类型,也可以使用" + “在表达式中参与运算,称之为"字符串的拼接”。 任何表达式一旦有字符串拼接运算,那么结果必然是String类型
- 只要表达式中存在任一变量,那么表达式的最终结果数据类型就遵循"表达式的类型提升"。
总结
- 八种基本数据类型只有boolean不能类型转换。
- 多种数据类型混合在一起进行运算,先全部提升为"最大取值范围"的数据类型,再进行计算
- byte、short、char使用的时候尤其注意取值范围,若参与运算都会自动提升到int。**
- “小取值范围”—>"大取值范围"称之为自动类型转换,不需要写代码处理,排序是:byte < short(char) < int < long < float < double~
- 大取值范围"—>"小取值范围"称之为强制类型转换,必须要显式写代码处理,否则会编译报错,
整数变量的特殊性
- 对于整数字面值常量(包括常量的运算)而言,因为它的值一定不会发生变化,而且整型数据值的位数十分容易判断,所以编译器能够自动判断整型常量是否在接收数据类型的范围内。
- 小数字面值常量不具有这种特点。因为浮点数本身就是一种近似表示方法,用double和float分别表示0.1完全是两个数,类似下列行为都是不能通过编译的:
字面值常量(包括常量的运算)而言,因为它的值一定不会发生变化,而且整型数据值的位数十分容易判断,所以编译器能够自动判断整型常量是否在接收数据类型的范围内。
2. 小数字面值常量不具有这种特点。因为浮点数本身就是一种近似表示方法,用double和float分别表示0.1完全是两个数,类似下列行为都是不能通过编译的: