6. 变量(Variable)
- 变量的概念:
在程序执行的过程中,其值可以发生改变的量 - 变量的作用:
用来存储数据,代表内存的一块存储区域,这块内存中的值是可以改变的。 - 定义格式:
- 声明变量,并同时赋值
数据类型 变量名=初始化值;
//声明并同时赋值,存储一个整数的年龄 int age = 18; //打印输出变量值 //+号表示连接符,把""中的字符串与变量age中的数据连接进行输出 System.out.println("age = " + age);
先声明,再赋值
数据类型 变量名;
变量名=初始值;
//先声明,再赋值 int age; age=18; //打印输出变量值 System.out.println("age = " + age);//18
//变量可以重新赋值 age=19; System.out.println("age = " + age);//19
同时声明多个变量
数据类型 变量名1=初始值,变量名2=初始值;
//声明多个变量并同时赋值 int a=11,b=22; //或者先声明再赋值 int c,d; c=33; d=44;
变量的使用注意事项
先声明后使用
如果没有声明,会报“找不到符号”错误
在使用之前必须初始化
如果没有初始化,会报“未初始化”错误
变量有作用域
作用域为变量直接所属的{}范围内,如果超过作用域,也会报“找不到符号”错误
在同一个作用域中不能重名
同一个{},不能同时声明两个同名变量
7. 计算机如何存储数据
计算机世界中只有二进制。那么在计算机中存储和运算的所有数据都要转为二进制。包括数字、字符、图片、声音、视频等。
7.1 进制
进制分类与表示方式
(1)十进制:
数字组成:0-9
进位规则:逢十进一
System.out.println(10);//10表示十进制的10,输出十进制结果10
(2)二进制:
数字组成:0-1
进位规则:逢二进一
表示方式:以0b或0B开头
System.out.println(0B10);//0B10表示二进制的10,输出十进制结果2
十进制的256,二进制:100000000,为了缩短二进制的表示,又要贴近二进制,在程序中引入八进制和十六进制
(3)八进制:很少使用
数字组成:0-7
进位规则:逢八进一
表示方式:以0开头
System.out.println(010);//010表示八进制的10,输出十进制结果8
与二进制换算规则:每三位二进制是一位八进制值
(4)十六进制
数字组成:0-9,a-f或A-F
进位规则:逢十六进一
表示方式:以0x或0X开头
System.out.println(0X10);//0x10表示十六进制的10,输出十进制结果16
- 与二进制换算规则:每四位二进制是一位十六进制值
- 进制的转换
任意进制转十进制
十进制的本质:123=1*102+2*101+3*10^0
系数:就是每一个位上的数值。上例中的1,2,3
基数:x进制的基数就是x。上例中的10
权:对每一个位上的数据,从右到左,并且从0开始编号,对应的编号就是该数据的权。上例中的0,1,2
任意进制转十进制:系数*基数^权次幂之和。
十进制转任意进制:
十进制数除以基数取余,直到商为0,余数反转。
十进制转二进制:十进制整数6除以基数2,倒序取余数,结果为二进制数110
7.2 计算机存储单位
位(bit) 是数据存储的最小单位,也就是一个二进制位。其中8 bit 就称为1个字节(Byte)。
字节(Byte): 是计算机信息技术用于计量存储容量的一种计量单位,1字节等于8bit。
转换关系:
8 bit = 1 Byte
1024 Byte = 1 KB
1024 KB = 1 MB
1024 MB = 1 GB
1024 GB = 1 TB
7.3 二进制数据存储
计算机底层都是使用二进制进行数据的存储的。不同类型的数据,存储方式也有不同。
整数存储
计算机底层存储整数并不是把整数转换为二进制直接存储,而是以二进制的补码形式进行存储。要了解补码还要知道原码和反码:
原码:把十进制转为二进制,然后最高位设置为符号位,1表示负数,0表示正数。
正整数的原码、反码和补码都一样,称为三码合一。
负整数的反码和补码表示为:
反码:负整数的反码在其原码的基础上,符号位不变,其余位取反(0变1,1变0)
补码:负整数的补码为其反码基础上+1
例如:用1个字节的二进制表示一个数 25 ==> 原码 0001 1001 ==> 反码 0001 1001 -->补码 0001 1001 -25 ==>原码 1001 1001 ==> 反码 1110 0110 ==>补码 1110 0111
一个字节可以存储的整数范围
分为两种情况:
(1)无符号:不考虑正负数
0000 0000 ~ 1111 1111 ==> 0~255
(2)有符号:-128~127
0000 0000 ~ 0111 1111 ==> 0~127 1000 0001 ~ 1111 1111 ==> -127 ~ -1 (补码形式存储) 1000 0000 ==> -128 特殊值,最高位既是符号位,又是数值位
如何存储小数(了解)
为什么float(4个字节)比long(8个字节)的存储范围大?
为什么double(8个字节)比float(4个字节)精度范围大?
为什么float和double不精确
因为float、double底层也是二进制,先把小数转为二进制,然后把二进制表示为科学记数法,然后只保存:
①符号位②指数位③尾数位
详见《float型和double型数据的存储方式.docx》
- 如何存储字符在计算机的内部都是二进制的0、1数据,如何让计算机可以直接识别人类文字的问题呢?就产生出了编码表的概念。
- 编码表
就是将人类的文字和一个十进制数进行对应起来组成一张表格。例如: - 将所有的英文字母,数字,符号都和十进制进行了对应,因此产生了世界上第一张编码表ASCII(American Standard Code for Information Interchange 美国标准信息交换码)。
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Java中使用的字符集:Unicode编码集
unicode使用2个字节存储一个字符,对于大量的英文字符(1个字节可以存储),无疑是浪费空间的,所以出现了UTF-8、UTF-16编码规则,UTF-8是以8位为一个编码单位的可变长编码规则。这时:
英文字符:还是按照ASCII码表对应的数字进行存储(1个字节)
中文字符:通常需要3个字节来存储
Java中字符常量的几种表示方式
(1)‘一个字符’
例如:‘A’,‘0’,‘我’
(2)转义字符
\n:换行 \r:回车 \t:Tab键 \\:\ \":" \':' \b:删除键Backspace System.out.println('\\'); System.out.println("hello\tworld\njava");
(3)\u字符的Unicode编码值的十六进制型
例如:’\u5C1A’代表’尚’
char c = '\u5C1A'; char c = '尚'; String s = '尚';//错误的,哪怕是一个字符,也要使用双引号 char c2 = '';//错误,单引号中有且只能有一个字符 String s2 = "";//可以,双引号中可以没有其他字符,表示是空字符串
(4)直接给char类型变量赋值十进制的0~65535之间的Unicode编码值
8. 数据类型
8.1 数据类型分类
Java是一种强类型的语言,针对每一种数据都定义了数据类型,不同类型的数据二进制表示方式或分配的空间大小有所不同,java数据类型主要分为两大类:(定义变量需要确定数据类型,即确定数据使用的空间大小和二进制表示形式)
基本数据类型:包括 整数、浮点数、字符、布尔。
引用数据类型:包括 类、数组、接口等。
8.2 基本数据类型
四类八种基本数据类型:
Java中的默认类型:整数类型是int 、浮点类型是double 。
常量整数值都是int类型,占用4个字节空间。
程序运行期间byte、short、char、boolean实际都是占用4个字节内存空间,
但在逻辑上:
byte只有低8位有效空间。
short只有低16位有效空间。
所以,可以直接把一个byte范围内的整数常量值直接赋给byte类型变量。short同理。byte b=10;
赋值给int,只要在int范围即可。
赋值给long,在int范围内的,可以加也可以不用加L,会自动升级为long,如果数字超过int范围,必须加L。
小数常量值,无论多少,不加F,就是double类型。
8.3 基本数据类型的存储范围
整型系列
(1)byte:字节类型
占内存:1个字节
存储范围:-128~127
byte b=10; byte b1=128//编译失败: 不兼容的类型: 从int转换到byte可能会有损失
(2)short:短整型类型
占内存:2个字节
存储范围:-32768~32767
short s=10; short s1=32768//编译失败: 不兼容的类型: 从int转换到short可能会有损失
(3)int:整型
占内存:4个字节
存储范围:-2的31次方 ~ 2的31次方-1
int i=10; int i1=12345678900;//编译错误: 过大的整数: 12345678900
(4)long:整型
占内存:8个字节
存储范围:-2的63次方 ~ 2的63次方-1
long j=10; long j1=12345678900L;
注意:如果要表示某个超过int范围的常量整数它是long类型,那么需要在数字后面加L
浮点型系列(小数)
(1)float:单精度浮点型
占内存:4个字节
精度:科学记数法的小数点后6~7位
注意:如果要表示某个常量小数是float类型,那么需要在数字后面加F或f,否则就是double类型
(2)double:双精度浮点型
占内存:8个字节
精度:科学记数法的小数点后15~16位
float f = 12.3F;//右边如果赋值小数常量值,那么必须加F或f double d = 12.3;
单字符类型:char
占内存:2个字节
char ch='a';
char类型:使用单引号’'
布尔类型
boolean:只能存储true或false
虽然计算机底层使用0和1表示false和true,但是在代码中不能给boolean类型的变量赋值0和1,只能赋值false和true
9. 基本数据类型转换
在Java程序中,不同的基本数据类型的值经常需要进行相互转换。Java语言所提供的七种数值类型之间可以相互转换,基本数据类型转换有两种转换方式:自动类型转换和强制类型转换。