Java 变量和数据类型笔记
1.变量的基本概念(两个要素)
- 变量名
- 当需要在程序中记录单个数据内容时,则声明一个变量即可,而声明变量的本质就是在内存中申请一个存储单元,由于该存储单元中的数据内容可以发生改变,因此得名为"变量"。
- 数据类型
- 由于存放的数据内容大小不一样,导致所需存储单元的大小不一样,在Java语言中使用数据类型加以描述,为了便于下次访问还需要给该变量指定一个名字,用于记录该变量对应的存储单元。
2.变量的声明方式
-
# 常用变量声明方式 数据类型 变量名 = 初始值; # 必须以分号结尾,标识一行代码结束;可以只定义变量,不赋初值
-
变量声明练习
public class VarTest{ public static void main(String[] args){ // 1.声明一个变量并初始化 int age = 21; // 2.打印变量值 // + : 字符串连接符,将两边的内容连接起来,还是一个字符串 System.out.println("age = " + age); } }
PS E:\LaGou-Java\Class-Learning\Class-note\模块一 Java编程基础\02任务二 变量和数据类型\code> javac .\VarTest.java PS E:\LaGou-Java\Class-Learning\Class-note\模块一 Java编程基础\02任务二 变量和数据类型\code> java VarTest age = 21
3.使用变量注意事项
- 使用变量之前需要先声明,指定数据类型
- 使用变量之前需要初始化
- 变量不能重复声明
4.标识符命名规则
-
由数字,字母,下划线组成(还有$,但是不常用),数字不能开头
-
不能使用Java语言关键字
-
区分大小写,长度没有限制但不宜过长
-
尽量见名知意,支持中文但不推荐使用
-
标识符可以给 类/变量/属性/方法/包起名字。
5.Scanner扫描器使用
-
文件开头
-
// 导入java目录中util目录中的Scanner类 import java.util.Scanner;
-
-
文件main函数中实现部分
-
// 创建一个扫描器来扫描键盘输入的内容,System.in代表键盘输入 Scanner sc = new Scanner(System.in); // 通过扫描器读取一个字符串数据放入变量name中 name = sc.next(); // 通过扫描器读取一整数数据放入变量name中 age = sc.nextInt();
-
6.代码优化
- 变量随用随声明
- 输出语句多句合并为一句
7.数据类型
- 基本数据类型
- byte,short,int,long,float,double,boolean,char
- 引用数据类型
- 数组,类,接口,枚举,标注,字符串
8.常用的进制
-
十进制:逢十进一
-
二进制:逢二进一
- 二进制中最高位(最左边的一位)用于代表符号位,若该位是0则表示非负数,若该位是1则表示负数
-
八进制,十六进制其实都是二进制的简写
9.进制之间的转换
- 正十进制转换为二进制:
- 除二取余法:使用十进制整数不断除以2取出余数,商为零时,余数逆序排序
- 例:十进制45转换为二进制结果为:10 1101(0b,0B可为二进制前缀,binary),64位操作系统有64位,前面全部用0补齐64位才是真正的二进制
- 拆分法:将十进制整数拆分为若干个二进制权重的和,有该权重下面写1,否则写0
- 除二取余法:使用十进制整数不断除以2取出余数,商为零时,余数逆序排序
- 正二进制转换为十进制
- 加权法:使用二进制中的每个数字乘以每一位的权重累加
- 负十进制转换为二进制的方式
- 先将十进制的绝对值转换为二进制,然后按位取反再加一(补码)
- 例:十进制-45转换为二进制为:1101 0011
- 当十进制的45和-45都转化为二进制数时,相加,结果会出现高位溢出(第65位1将会丢弃)
- 先将十进制的绝对值转换为二进制,然后按位取反再加一(补码)
- 负二进制转换为十进制
- 先将二进制减一,再按位取反,然后使用加权法
10.整数类型表示的范围
-
byte
- 非负数:
- 0000 0000 - 0111 1111(0 ~ 127)
- 负数:
- 1000 0000 - 1111 1111(-128 ~ -1)
- 在内存空间中占一个字节,-2^7 ~ 2^7 - 1(-128 ~ 127)
- 非负数:
-
short
- 在内存空间中占两个字节,-2^15 ~ 2^15 - 1(-32768 ~ 32767)
-
int**(推荐使用,默认为int类型)**
- 在内存空间中占四个字节,-2^31 ~ 2^31 -1(-2147483648 ~ 2147483647)
-
long
- 在内存空间中占八个字节,-2^63 ~ 2^63 - 1()
在Java程序中直接写出的整数数据叫做直接量/字面量/常量,默认为int类型。若希望表达比long更大的直接量,则在直接量的后面加上“l”或“L”,推荐“L”。
11.整数类型的笔试考点
-
整数不能作为标识符的原因:
- 分不清标识符和直接量
- 如果也带尾缀,则无法进行统一标准,取决于程序员自身的水平,Java官方规定,数字不能开头
-
使用不同整数类型的变量为另一个变量赋值报错:
-
这是一个变量,数值是否会发生变化,不得而知
-
当进行赋值的时候,无法直接确定当前的变量是否在自己的整数范围之内,还需要继续进行计算才能确定,直接报错让程序员自行进行检查
-
// 6.错误代码测试 int i2 = 25; byte b2 = i2; // 错误: 不兼容的类型: 从int转换到byte可能会有损失 System.out.println("b2 = " + b2);
-
-
比long还大的整数表示:
-
// 5.声明一个long类型的变量并初始化 // 若描述比long类型还大的数据则使用java.math.BigInteger类型 long L1 = 2147483650L; System.out.println("L1 = " + L1);
-
12.浮点类型
-
float
-
在内存空间中占四个字节,叫做单精度浮点数,一般表示七位有效数字
-
范围:-3.403E38 ~ 3.403E38(指数表示法)
-
int和float字节数相同,为什么表示范围不一样?
- 与底层二进制结构有关系
- int:有一个符号位,剩余的整数位
- float:除了符号位,还有一部分专门用于表示表示整数次方(指数部分),再接下来才表示小数部分,因为有指数部分,所以范围更大一些
- 与底层二进制结构有关系
-
-
double**(推荐使用,默认为double类型)**
- 在内存中占八个字节,叫做双精度浮点数,一般表示十五位有效数字
- 范围:-1.798E308 ~ 1.798E308(指数表示法)
13.浮点数笔试考点
-
因为float,double计算不够精确,如何做到精确计算:
-
// 3.笔试考点 System.out.println("0.1 + 0.2 = " + (0.1 + 0.2)); // 0.1 + 0.2 = 0.30000000000000004 // float和double运算时会有误差 // 若希望实现精确运算,借助java.math.BigDecimal类型
-
14.布尔类型
15.字符类型
-
char:
-
用于描述单个字符的数据类型(单引号引起来的单个字符)
-
在内存空间中占两个字节,并且没有符号位
-
表示范围为(0 ~ 65535)
-
计算机的底层只识别0和1组成的二进制序列,对于字符’a’这样的图案来说不满足该规则,因此该数据无法直接在计算机中存储,但现实生活中存在这样的图案数据需要计算机存储,为了使得该数据能够存储起来就可以给该数据指定一个编号,然后将编号存储起来即可,该编号就叫做ASCII。
-
-
Unicode字符集:
-
包含世界各国的字符
-
站长之家链接:http://tool.chinaz.com/tools/unicode.aspx
-
// 5.使用Unicode字符集打印名字 // 云梦归遥 - \u4e91\u68a6\u5f52\u9065 char c3 = '\u4e91'; char c4 = '\u68a6'; char c5 = '\u5f52'; char c6 = '\u9065'; System.out.println("My name is: " + c3 + c4 + c5 + c6);
-
-
特殊字符类型:
- 可以使用 “\” 转义字符
16.基本数据类型之间的转换
-
自动类型转换
-
自动类型转换主要是指从小类型到大类型之间的转换
-
long类型(8字节)到float类型(4字节)转化的原因:
- 和底层二进制的结构有关系
- long能表示(-2^63 ~ 2^63 - 1),而float能表示(1038),可近似转换为((23)38=2114),所以long可以自动转换为float类型
-
-
强制类型转换
-
大类型到小类型之间的转换
-
目标类型变量名= (目标类型)源类型变量名;
-
强制转换不出现损失的情况(在当前数值范围之内):
byte b1 = 10; short s1 = 20; // 3.实现强制类型之间的转换 b1 = (byte)s1; System.out.println("b1 = " + b1 + ", " + "s1 = " + s1); // b1 = 20, s1 = 20
-
强制转换出现损失的情况(超出当前数值范围之内):
// 4.故意超出byte的范围 s1 = 128; b1 = (byte)s1; // short类型的s1:128的二进制数:0000 1000 0000,强转为byte时取低八位,1000 0000, // 但是byte类型第一位是符号位,转换为十进制数为-128 System.out.println("b1 = " + b1 + ", " + "s1 = " + s1); // b1 = -128, s1 = 128
// 4.故意超出byte的范围 s1 = 128; b1 = (byte)s1; // short类型的s1:128的二进制数:0000 1000 0000,强转为byte时取低八位,1000 0000, // 但是byte类型第一位是符号位,转换为十进制数为-128 System.out.println("b1 = " + b1 + ", " + "s1 = " + s1); // b1 = -128, s1 = 128
-
-