java的关键字
java的所有关键字都是小写字母组成
说明:
char代表字符型,实际上字符型也是一种整数类型,相当于无符号整数类型
引用数据类型就是对一个对象的引用,对象包括实例和数组两种。引用类型相当于一个指针,只不过java中不这么叫。
字符串是一个类,他不是一个基本数据类型,他是一个引用数据类型。
null,这种类型没有名称,所以不可能声明一个null类型的变量或转换到null类型。空引用(null)是null类型变量唯一的值,空引用可以转换为任何引用类型。
空引用(null)只能被转换称引用类型,不能转换成基本类型。因此不要把一个null值赋给基本数据类型的变量。
什么是变量?有什么用?
编程的本质就是对内存中数据的访问和修改。
程序所用的数据都会保存在内存中,程序员需要一种机制来访问或修改内存中的数据。这种机制就是变量。每个变量都代表了某一小块内存,而且变量是有名字的,程序对变量赋值,实际上就是把数据装在该变量所代表的内存区的过程。程序读取变量值,实际上就是从该变量所代表的内存区取值的过程。
变量相当于一个有名称的容器,该容器用于装各种不同类型的数据
注意:
-
可以把一个较小的整数值(在byte或short类型的表述范围之内)赋给一个byte或short变量,系统会自动把这个整数值当成byte或short类型来处理。
byte a = 56;
-
使用一个巨大的整数值(超过了int类型的表述范围),java不会自动把这个值当成long类型来处理。如果希望系统将它作为long来处理,在后面加上L/l
long big = 9999999999999; //超出int的范围,不会把这个当成long处理,代码错误 long big = 9999999999999999L; //正确
-
可以把一个较小的值(在int范围内)赋给long类型的变量,这并不因为java会把这个较小的值当成long类型来处理。java依然把这个整数值当成int来处理,因为int类型的值会自动类型转换为long类型
整数型
类型 | 表示 |
---|---|
二进制 | 0b/0B开头 |
八进制 | 0开头 |
十进制 | |
十六进制 | 0x/0X开头 |
字符型 单引号括起来
- 字符型值必须使用单引号括起来
- Java语言使用16位的Unicode字符集作编码方式
- 字符型值也可以采用十六进制编码方式来表示,范围是’\u0000’-’\uFFFF’,一共可以表示65536个字符,前面256个(’\u0000’-’\u00FF’)字符和ASCII码中的字符完全重合。
- 由于计算机底层保存字符时,实际是保存该字符对应的编号,因此char类型的值也可以直接做整形值来使用,相当于16位无符号整数。
- 字符型值有三种表示形式
- 直接通过单个字符来指定字符型值
- ‘A’,‘9’
- 通过转义字符表示特殊字符型值
- ‘\n’
- 直接使用Unicode值来表示字符型值,格式是’\uXXXX’,其中XXXX表示一个十六进制的整数
字符串 双引号括起来
没有提供字符串的基本数据类型,而是通过String类来表示字符串。双引号括起来
String s = "lalalala"; //定义了一个s变量,他是一个字符串实例的引用,他是一个引用类型的变量
浮点数
Java的浮点类型有固定的表数范围和字段长度,字段长度和表数范围与机器无关。
浮点数遵循IEEE 754标准,采用二进制数据的科学计数法表示
- float:
- 第一位是符号位,接下来8位是指数,再接下来23位是尾数
- double:
- 第一位符号位,接下来11位指数,52位尾数
不能精确表示一个浮点数
如果开发者需要精确保存一个浮点数,可以考虑BigDecimal类
只有浮点型的数值才可以使用科学计数法表示
- 52100是一个int型
- 512E2是一个浮点型
默认是double型
- 5.12代表一个double型
- 5.12f代表一个float型
java的三个特殊的浮点值,用以表示溢出和出错
- 正无穷大
- 使一个正数除以0得到正无穷大
- Double或Float类中的POSITIVE_INFINITY表示
- 负无穷大
- 使一个负数除以0得到负无穷大
- Double或Float类中的NEGATIVE_INFINITY表示
- 非数
- 0.0除以0.0或对一个负数开方将得到一个非数
- Double或Float类中的NaN表示
所有正无穷大数值都是相等的,所有负无穷大数值都是相等的。而NaN不与任何数值相等,甚至和NaN都不想等
只有浮点数除以0才可以得到正无穷大或负无穷大。因为Java语言会自动把和浮点数运算0(整数)当成0.0(浮点数)处理。如果一个整数值除以0,则会抛出一个异常:ArithmeticException:/by zero(除以0异常)
关于数值中使用下划线
使用数值位数特别多,看不清有多少位数,可以在数值中使用下画线
布尔型
- boolean类型的数值只能是true或者false。
- 可以用在三目运算(? ?
- 其他基本数据类型的值也不能转换成boolean类型
- Java规范并没有强制指定boolean类型的变量所占用的内存空间。虽然boolean类型的变量或值只要1位即可保存,但是由于大部分计算机在分配内存时允许分配的最小内存单元是字节(8位),因此bit大部分时候实际占用8位。
如果使用一个boolean类型的值和字符串进行连接运算,则boolean类型的值将会自动转换成字符串。
类型转换
自动类型转换
- Java所有的数值型变量都可以相互转换,如果系统支持把某种类型的值直接复制给另一种基本类型的变量,这种方式叫做自动类型转换。
- 当把一个表述范围小的数值或变量直接赋值给另一个表述范围大的变量时,系统将可以进行自动类型转换,否则将执行强制类型转换。
自动类型转换图
!
- 表述范围小的可以向表述范围大的自动转换。
- 如同两瓶水,当把小的水倒到大的里面不会有问题。
- 当把任何基本类型的值和字符串值进行连接运算时,基本类型的值会自动类型转换为字符串类型。
- 虽然字符串类型不是基本类型,而是引用类型。因此如果希望把基本类型的值转换成对应的字符串时,可以把基本类型的值和一个空字符串进行连接。
强制类型转换
- 格式:()…
- 类似于将一个大瓶子的水倒入一个小瓶子中,大瓶子水多时会造成溢出,数据丢失。“缩小转换”
![2
生成一个6位的随机字符串
容易出错的代码
float a = 5.6; //5.6是double类型的,将一个5.6赋值给一个float类型会导致错误,必须强制转换.
字符串不能直接转换为基本类型,但通过基本类型的包装类可以实现把字符串转换成基本类型。
String a = "45"; int i = Integer.parseInt(a); //使用Integer的方法将一个字符串转换成int类型
- java为8种基本类型都提供了对应的包装类:
类型 包装类 boolean Boolean byte Byte short Short int Integer long Long char Character float Float double Double 8个包装类都提供了一个
parseXxx(String str)
静态方法用于将字符串转换成基本类型。表达式类型的自动提升
当一个算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。
自动提升规则:
- 所有的byte类型short类型char类型将被提升到int类型
- 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。
错误范例:
short s = 5; s = s - 2; //表达式中的s将自动提升到int类型,右边的表达式类型为int //将一个int类型赋值给short类型将发生错误
直接量
直接量是指在程序中通过源代码直接给出的值
- int a = 5在这行代码中,为变量a所分配的初始值5就是一个直接量
直接量的类型
并不是所有的数据类型都可以指定直接量,能指定直接量的只有三种类型:
基本类型,字符串类型,null类型
类型 说明qq邮箱 int类型的直接量 在程序中直接给出的整形数值,二(0B/0b),八(0),十,十六(0x/0X)进制。 long类型的直接量 在整数数值后添加l/L float类型的直接量 在一个浮点数后面添加f/F,这个浮点数可以是标准小数形式(5.34F),也可以是科学计数法形式(3.14E5f) double类型的直接量 直接给出一个标准小数形式或者科学计数法形式的浮点数 boolean类型的直接量 true和flase char类型的直接量 单引号括起来的字符,转义字符和Unicode值表示的字符 String类型的直接量 一个用双引号括起来的字符序列 null类型的直接量 null(可以赋值给任何引用类型的变量,用以表示这个引用类型变量中保存的地址为空,即还未指向任何有效对象) 直接量的赋值
- String类型的直接量不能赋给其他类型的变量。
- null类型的直接量可以直接赋值给任何引用类型的变量,包括String类型
- boolean类型的直接量只能赋值给boolean类型的变量,不能赋给其他任何类型的变量
当程序第一次使用某个字符串直接量时,Java会使用常量池来缓存该字符串直接量
,如果程序后面的部分需要用到该字符串直接量时,Java会直接使用常量池中的字符串直接量
java会确保每个字符串常量只有一个,不会产生多个副本。"he"和"llo"也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它本身也是字符串常量。
String类是一个典型的不可变类
,因此String对象创建出来就不可能被改变。
常量池
指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据
。它包括类,方法,接口中的常量,字符串直接量
运算符
因为计算机中所有的东西都是以***补码***存储,正数的补码就是他本身,负数的补码是其源码-反码-补码转换的过程
~-5
的结果: 4
-5<<2
的结果:-20
-5>>2
的结果:-2
-5>>>2
的结果:2^30-2
移位运算的规则
- 对于低于int类型(byte,short,char)的操作数总是先自动类型转换为int型后再移位。
- 对于int类型的整数移位a>>b
- 当b>32时,系统先用b对32求余,得到的结果才是真正移位的位数。
a>>33
和a>>1
的结果一样- 对于long类型的整数移位a>>b,总是先用b对64求余,得到的结果才是真正移位的位数
- 当进行移位运算时,只要被移位的二进制码没有发生有效位的数字丢失(对于正数而言,通常指被移出的位全部是都是0),左移n位就相当于乘以2的n次方,右移n位就相当于除以2的n次方。不仅如此,进行移位运算不会改变操作数本身,只是得到了一个新的运算结果,原来的操作数本身是不会改变的。
扩展后的赋值运算符
byte a = 5;
a = a + 5;//会出错,因为5默认是int,a+5就是int,int赋给byte类型的变量,所以会出错
byte b = 5;
b += 5;//正确
比较运算符
- 基本类型的变量,值不能和引用类型的变量,值使用==比较
- boolean类型的变量,值不能和其他类型的变量,值使用==比较
- 如果两个引用类型之间没有父子继承关系,那么他们的变量也不能使用==进行比较
java为所有基本类型都提供了对应的包装类
运算符的结合性和优先级
- 单目运算符,赋值运算符,三目运算符是右结合