一、基础
1.1 变量
Java 变量是程序中存储数据的容器。
在 Java 中,变量需要先声明再使用,并且必须先声明再赋值。
- 声明变量:声明变量时需要指定变量的类型、名称和初始值。例如,声明一个整型变量可以如下所示:
int num = 0;
变量类型:Java 中的变量类型可以分为基本数据类型和引用数据类型。
基本数据类型包括:byte、short、int、long、float、double、char 和 boolean。
引用数据类型包括:类、接口、数组等。变量作用域:Java 中的变量作用域可以分为局部作用域、成员作用域和静态成员作用域。
局部作用域指的是在方法或代码块中声明的变量,
成员作用域指的是在类中声明的变量,
静态成员作用域指的是在类中声明为 static 的变量。变量赋值:在 Java 中,变量赋值使用等号(=)操作符。例如,将整型变量 num 赋值为 1 可以如下所示:
num = 1;
- 变量运算:Java 中的变量可以进行算术运算、比较运算和逻辑运算等操作。例如,将两个整型变量相加可以如下所示:
int a = 1; int b = 2; int c = a + b;
- 字符串变量:Java 中字符串变量使用 String 类型表示。例如,声明一个字符串变量可以如下所示:
String name = "Tom";
- 数组变量:Java 中数组变量使用数组类型表示。例如,声明一个整型数组可以如下所示:
在 Java 中,变量是程序中必不可少的元素,它为程序提供了存储数据的能力。int[] nums = new int[10];
通过声明变量、给变量赋值、进行变量运算等操作,可以实现各种复杂的程序功能。
1.2 数据类型
1.2.1 基本数据类型
基本数据类型包括:byte、short、int、long、float、double、char 和 boolean。
数据类型 | 关键字 | 内存占用 | 取值范围 |
---|---|---|---|
整数类型 | byte | 1 byte(8位) | - 2^7 - 2^7 -1 |
short | 2 byte(16位) | - 2^15 - 2^15 -1 | |
int | 4 byte(32位) | - 2^31 - 2^31 -1 | |
long | 8 byte(64位) | - 2^63 - 2^63 -1 | |
浮点类型 | float | 4 byte(32位) | 一3.403E38~3.403E38 |
double | 8 byte(64位) | 1.797693e+308~ 4.9000000e-324 | |
字符流行 | char | 2 byte(16位) | 0 - 2^16 -1 |
布尔类型 | boolean | 1 byte(-) | true,false |
1 byte = 8位
这些基本数据类型,在运算时,如果类型不一样,则需要进行类型的转化,如 int + float 型数据想加,我们分别讲下常见的类型转换。
- 自动类型转换
必须满足转换前的数据类型的位数要低于转换后的数据类型, 如上表所示,
1字节 | 2字节 | 4字节 | 8字节 |
---|---|---|---|
byte | short | int | long |
char | float | double |
例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,
同样float数据类型的位数为32,可以自动转换为64位的double类型。
这种自动的转换,不需要担心精度丢失。
这里有个特例,long可以自动转换为float,简单来说因为浮点数用科学计数法存储的,而整数是用二进制存储的。
所以虽然long型是64位的,float型是32位,但是float型所能表示的数要远远大于long型。
- 强制类型转换
转换的数据类型必须是兼容的,格式:(type)value
一般是大的类型转换为小类型
类型转换时可能会导致溢出或精度的丢失,另外浮点数到整数的转换是通过舍弃小数得到的。
如果涉及到不同数据类型之间的数学运算,比如+、-、*、/等操作,
小类型的数据和大类型的数据进行计算时,会自动进行类型提升,最终的结果变成大类型!
1.2.2 引用数据类型
引用数据类型包括:类、接口、数组等。
// 数组的静态初始化
int[] arr = new int[3];
int[] arr = new int[]{
4,5,6};
int[] arr = {
1,2,3};
//
Anr anr = new Anr(cookie);
1.3 原码、反码、补码及进制转换
原码: 最高位是符号位(0 表示正数,1 表示负数),其他位为数值位。
10的原码: 00001010
-10的原码: 10001010
反码: 正整数的反码与原码一致,负整数的反码是在原码基础上,符号位不变,其他位按位取反
10的反码: 00001010
-10的反码: 11110101
补码: 正整数的补码与原码一致,负整数的补码是在反码基础上加1
10的补码: 00001010
-10的补码: 11110110
二进制
二进制,里面只有0和1
十进制
将十进制除以2再取余,然后将余数和最后的1按照从下向上倒序写的方法,即可变为二进制。
八进制
所谓八进制,就是每 3 位二进制作为一个单元,其中最小的数是 0,最大的数是 7,一共 8 个数字
十六进制
十六进制,就是每 4 位二进制作为一个单元,其中最小数是 0,最大数是 15,一共 16 个数字,分别用 0 ~ 9、A、B、C、D、E、F 表示。
1.4 运算符
运算符 | 描述 | ||
---|---|---|---|
+ | 加法: 进行两侧变量值相加 | ||
- | 减法: 进两侧变量值相减 | ||
* | 乘法: 进行两侧变量值相乘 | ||
\ | 除法: 左侧变量值除以右侧变量 | ||
% | 取模: 左侧变量值除以右侧变量取余数 | ||
++ | 自增: 自身+1 | ||
–- | 自减: 自身-1 | ||
== | 判断两侧的变量值是否相等,如果相等条件为真 | ||
!= | 判断两侧变量值是否不相等,如果不相等条件为真 | ||
> | 判断左侧变量值是否大于右侧变量值, 如果大于条件为真 | ||
< | 判断左侧变量值是否小于右侧变量值, 如果小于条件为真 | ||
>= | 判断左侧变量值是否大于或者等于右侧变量值, 如果大于或者等于条件为真 | ||
<= | 判断左侧变量值是否小于或者等于右侧变量值, 如果小于或者等于条件为真 | ||
&& | 逻辑与。当且仅当两个操作数都为真,条件才为真。 | ||
逻辑或。如果任何两个操作数任何一个为真,条件为真。 | |||
! | 逻辑非。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | ||
<< | 有符号左移, 相当于乘以2^n | ||
>> | 有符号右移, 相当于除以2^n | ||
>>> | 无符号右移 | ||
& | 位与 (只有1&1得1,其他得0) | ||
位或 (只有0 | 0为0 ,其他为1) | ||
~ | 位非(反码) 即按位取反 | ||
^ | 位异或 (即 相同的为0 不同的为1) 1^1=0 0^0=0 1^0=1 |
一些基本的运算符比较简单,我们说下位运算符,
位运算符 是按照二进制位操作 整数 的, 涉及到 二进制 和 整数存储方式(原码、反码、补码)
直接举例说明
以 4 & -5 = 0为例子展示运算流程:
1. 因为4为正数,所以原码和补码相同,即4的补码为:00000000 0000000 00000000 00000100
2.因为-5为负数,所以需要进行原码 >>> 反码 >>> 补码的转换
1)原码:10000000 00000000 00000000 00000101
2)反码:11111111 11111111 11111111 11111010
3)补码:11111111 11111111 11111111 11111011
3.将4和-5的补码进行 & 运算:00000000 0000000 00000000 00000100
11111111 11111111 11111111 11111011 &
00000000 00000000 00000000 00000000
4.得到的补码结果为:00000000 00000000 00000000 00000000。所以结果为0
/*
* 位运算
* "<<" 有符号左移
* ">>" 有符号右移
* ">>>" 无符号右移
* "&" 位与 (只有1&1得1,其他得0)
* "|" 位或 (只有0|0为0 ,其他为1)
* "~" 位非(反码) 即按位取反
* "^" 位异或 (即 相同的为0 不同的为1) 1^1=0 0^0=0 1^0=1
*/
private static void testWei() {
/**
* "~" 位非(反码) 4 的反码 0000 0000 0000 0000 0000 0000 0000 0100
* 按位取反 1111 1111 1111 1111 1111 1111 1111 1011
* 此时按位取反后的值为补码 现在需要换成二进制原码用来输出 先减1
* 1111 1111 1111 1111 1111 1111 1111 1010
* 然后取反 0000 0000 0000 0000 0000 0000 0000 0101
* 最后 输出接口要加上符号位 即 -5 (先取反 ,在减1也可以)
*/
System.out.println("~4 " + (~4));
/**
* "&" 位与 (只有1&1得1,其他得0) 4 的补码 0000 0000 0000 0000 0000 0000 0000 0100 6
* 的补码 0000 0000 0000 0000 0000 0000 0000 0110 位与结果 0000 0000 0000 0000
* 0000 0000 0000 0100
*/
System.out.println("4&6 " + (4 & 6));
/**
* "<<" 有符号左移 规律左移是基数乘以2的移位幂次方,比如3<<2则是3*2*2也就是3乘以2的2次幂
*/
System.out.println("3 << 3 " + (3 << 3));
/**
* ">>" 有符号右移 规律左移是基数除以2的移位幂次方,比如3>>1则是3/2也就是3除以2的1次幂
*/
System.out.println("3 >> 1 " + (3 >> 1));
/**
* ">>>" 无符号右移 无论高位是0还是1都补0
*/
System.out.println("3 >>> 1 " + (3 >>> 1));
}
1.5 修饰符
分成访问修饰符 & 非访问修饰符,这个不多说,我们看图记忆即可。
1.5 表达式 & 语句 & 代码块
1.5.1 表达式
Java 表达式是 Java 编程语言中的基本构建块,用于执行特定的操作并返回一个值。
Java 表达式可以包含 Java 操作符、变量、方法和常量。以下是一些 Java 表达式的示例:我们举几个常见的例子
加法表达式:
int a = 10;
int b = 20;
int sum = a + b;
乘法表达式:
int a = 10;
int b = 20;
int product = a * b;
条件表达式:
int a = 10;
int b = 20;
int max = (a > b) ? a : b;
字符串拼接表达式:
String str1 = "Hello";
String str2 = "World";
String message = str1 + " " + str2;
方法调用表达式:
int a = 10;
int b = 20;
int sum = add(a, b);
数组引用表达式:
int[] arr = {
1, 2, 3, 4, 5};
int firstElement = arr[0];
1.5.2 语句、代码块
在 Java 中,使用大括号({})来定义代码块,可以使用分号(;)来结束语句。
声明语句:用于声明变量、方法和类等。
赋值语句:用于给变量赋值。
条件语句:用于根据条件执行不同的代码块。
循环语句:用于重复执行一段代码。
方法调用语句:用于调用方法。
异常处理语句:用于处理程序运行时发生的异常。
注释语句:用于添加注释,帮助其他开发人员理解代码。
数组声明语句:用于声明和初始化数组。
接口声明语句:用于声明接口。
类定义语句:用于定义类。
1.6 数组
Java中的数组是一种数据结构,用于存储相同类型的数据。
一维数组
// 数组的静态初始化
int[] arr = new int[3];
int[] arr = new int[]{
4,5,6};
int[] arr = {
1,2,3};
二维数组
// 声明一个二维数组变量
int[][] myArray;
// 创建二维数组并初始化
myArray = new int[3][4];