Java基础语法
main方法: 称为主方法。写法是固定格式不可以更改。main方法是程序的入口点或起始点,无论我们编写多 少程序,JVM在运行的时候,都会从main方法这里开始执行。
注释: 就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须 要的,它不影响程序的编译和运行。
//注释内容/*注释内容(可换行)*/方法体:方法内部的内容
输出语句:
System.out.println();换行输出System.out.print();不换行输出关键字keywords:是指在程序中,Java已经定义好的单词,具有特殊含义。 例如: public 、class、 static 、void等。关键字的特点:1. 完全小写的字母。2.在增强版的记事本当中(例如Notepad++)有特殊颜色。
标识符:是指在程序中,我们自己定义内容。比如类的名字、方法的名字和变量的名字等等,都是标识符 。
0-9 数字 、$(美元符号) 和 _(下划线) 。 标识符不能以数字开头。 标识符不能是关键字。常量:在程序运行期间,固定不变的量。常量的分类:
| 类型 | 含义 | 数据举例 |
|---|---|---|
| 整数常量 | 直接写上的数字,没有小数点 | 100、200、0、-250 |
| 浮点数常量 | 直接写上的数字,有小数点 | 2.5、-3.14、0.0 |
| 字符常量 | 凡是用单引号引起来的单个字符,就做字符常量 | 'A'、'b'、'9'、'中' |
| 字符串常量 | 凡是用双引号引起来的部分,叫做字符串常量。 | "abc"、"Hello"、"123" |
| 布尔常量 | 只有两种取值 | true、false |
| 空常量 | 代表没有任何数据 | null |
变量:程序运行期间,内容可以发生改变的量。创建一个变量并且使用的格式:
数据类型 变量名称; // 创建了一个变量
变量名称 = 数据值; // 赋值,将右边的数据值,赋值交给左边的变量
一步到位的格式:
数据类型 变量名称 = 数据值; // 在创建一个变量的同时,立刻放入指定的数据值
使用变量的时候,有一些注意事项:
自动类型转换(隐式)
1. 特点:代码不需要进行特殊处理,自动完成。
2. 规则:数据范围从小到大。
强制类型转换(显式)
强制类型转换
1. 特点:代码需要进行特殊的格式处理,不能自动完成。
2. 格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据;
注意事项:
1. 强制类型转换一般不推荐使用,因为有可能发生精度损失、数据溢出。
2. byte/short/char这三种类型都可以发生数学运算,例如加法“+”.
3. byte/short/char这三种类型在运算的时候,都会被首先提升成为int类型,然后再计算。
4. boolean类型不能发生数据类型转换
数字和字符的对照关系表(编码表):
American Standard Code for Information Interchange,美国信息交换标准代码。 48 - '0'
65 - 'A'
97 - 'a'
/*大写字母和小写字母相差32,例如:*/
char zifu3 = 'c';
// 左侧是int类型,右边是char类型,
// char --> int,确实是从小到大
// 发生了自动类型转换
运算符:进行特定操作的符号。例如:+
表达式:用运算符连起来的式子叫做表达式。例如:20 + 5。又例如:a + b
| 算术运算符 | |
|---|---|
+ |
加法运算、字符串连接运算 |
- |
减法运算 |
* |
乘法运算 |
/ |
除法运算 |
% |
取模运算,两个数字相除取余数 |
++、-- |
自增自减运算 |
对于一个整数的表达式来说,除法用的是整除,整数除以整数,结果仍然是整数。只看商,不看余数。
只有对于整数的除法来说,取模运算符才有余数的意义。
注意事项:
1. 一旦运算当中有不同类型的数据,那么结果将会是数据类型范围大的那种。
// int + double --> double + double --> double
int x=10;
double result3 = x + 2.5;
2.自增自减,使用区别:
1. 在单独使用的时候,前++和后++没有任何区别。也就是:++num;和num++;是完全一样的。
2. 在混合的时候,有【重大区别】
A. 如果是【前++】,那么变量【立刻马上+1】,然后拿着结果进行使用。 【先加后用】
B. 如果是【后++】,那么首先使用变量本来的数值,【然后再让变量+1】。 【先用后加】
| 基本运算符 | |
|---|---|
= |
代表将右侧的数据交给左侧的变量【左边取右边的值】 |
| 复合运算符 | |
+= |
a += 3 相当于 a = a + 3 |
-= |
b -= 4 相当于 b = b - 4 |
*= |
c = 5 相当于 c = c 5 |
/= |
d /= 6 相当于 d = d / 6 |
%= |
e %= 7 相当于 e = e % 7 |
注意事项
复合赋值运算符其中隐含了一个强制类型转换。
byte num = 30;
// num = num + 5;
// num = byte + int
// num = int + int
// num = int
// num = (byte) int
num += 5;
| 比较运算符 | |
|---|---|
> |
大于 |
< |
小于 |
>= |
大于等于 |
<= |
小于等于 |
| == | 相等 |
!= |
不等于 |
注意事项:
1. 比较运算符的结果一定是一个boolean值,成立就是true,不成立就是false
2. 如果进行多次判断,不能连着写。
数学当中的写法,例如:1 < x < 3
程序当中【不允许】这种写法。
| 逻辑运算符 | |
|---|---|
&&短路与(并且) |
全都是true,才是true;否则就是false |
| ` | |
!非(取反) |
本来是true,变成false;本来是false,变成true |
与“&&”,或“||”,具有短路效果:如果根据左边已经可以判断得到最终结果,那么右边的代码将不再执行,从而节省一定的性能。
注意事项:
1. 逻辑运算符只能用于boolean值。
2. 与、或需要左右各自有一个boolean值,但是取反只要有唯一的一个boolean值即可。
3. 与、或两种运算符,如果有多个条件,可以连续写。
两个条件:条件A && 条件B
多个条件:条件A && 条件B && 条件C
TIPS:
对于1 < x < 3的情况,应该拆成两个部分,然后使用与运算符连接起来:
int x = 2;
1 < x && x < 3
一元运算符:只需要一个数据就可以进行操作的运算符。例如:取反!、自增++、自减--
二元运算符:需要两个数据才可以进行操作的运算符。例如:加法+、赋值=
三元运算符:需要三个数据才可以进行操作的运算符。
格式:
数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;
流程:
首先判断条件是否成立:
如果成立为true,那么将表达式A的值赋值给左侧的变量;
如果不成立为false,那么将表达式B的值赋值给左侧的变量;
二者选其一。
例如: // 数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;
// 判断a > b是否成立,如果成立将a的值赋值给max;如果不成立将b的值赋值给max。二者选其一
int max = a > b ? a : b; // 最大值的变量
单if
if(关系表达式){
语句体;
}

标准的if-else语句
if(关系表达式) {
语句体1;
}else {
语句体2;
}

if..else if...else
// x和y的关系满足如下:
// 如果x >= 3,那么y = 2x + 1;
// 如果-1 < x < 3,那么y = 2x;
// 如果x <= -1,那么y = 2x – 1;
public class Demo04IfElseExt {
public static void main(String[] args) {
int x = -10;
int y;
if (x >= 3) {
y = 2 * x + 1;
} else if (-1 < x && x < 3) {
y = 2 * x;
} else {
y = 2 * x - 1;
}
System.out.println("结果是:" + y);
}
}

// 题目:使用三元运算符和标准的if-else语句分别实现:取两个数字当中的最大值
public class Demo06Max {
public static void main(String[] args) {
int a = 105;
int b = 20;
// 首先使用三元运算符
// int max = a > b ? a : b;
// 使用今天的if语句
int max;
if (a > b) {
max = a;
} else {
max = b;
}
System.out.println("最大值:" + max);
}
}
public class Demo07Switch {
public static void main(String[] args) {
int num = 10;
switch (num) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
case 4:
System.out.println("星期四");
break;
case 5:
System.out.println("星期五");
break;
case 6:
System.out.println("星期六");
break;
case 7:
System.out.println("星期日");
break;
default:
System.out.println("数据不合理");
break; // 最后一个break语句可以省略,但是强烈推荐不要省略
}
}
}

switch语句使用的注意事项:
1. 多个case后面的数值不可以重复。
2. switch后面小括号当中只能是下列数据类型:
基本数据类型:byte/short/char/int
引用数据类型:String字符串、enum枚举
3. switch语句格式可以很灵活:前后顺序可以颠倒,而且break语句还可以省略。
“匹配哪一个case就从哪一个位置向下执行,直到遇到了break或者整体结束为止。”【case的穿透性】
循环结构的基本组成部分,一般可以分成四部分:
for
for(初始化表达式①; 布尔表达式②; 步进表达式④){
循环体③
}
while
/*
初始化语句;
while (条件判断) {
循环体;
步进语句;
}
*/
public class Demo10While {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("我错啦!" + i);
}
System.out.println("=================");
int i = 1; // 1. 初始化语句
while (i <= 10) { // 2. 条件判断
System.out.println("我错啦!" + i); // 3. 循环体
i++; // 4. 步进语句
}
}
}
do-while
/*
初始化语句
do {
循环体
步进语句
} while (条件判断);
*/
public class Demo11DoWhile {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
System.out.println("原谅你啦!起来吧!地上怪凉!" + i);
}
System.out.println("===============");
int i = 1; // 1. 初始化语句
do {
System.out.println("原谅你啦!起来吧!地上怪凉!" + i); // 3. 循环体
i++; // 4. 步进语句
} while (i <= 10); // 2. 条件判断
}
}
三种循环的区别。
break
/*
break关键字的用法有常见的两种:
1. 可以用在switch语句当中,一旦执行,整个switch语句立刻结束。
2. 还可以用在循环语句当中,一旦执行,整个循环语句立刻结束。打断循环。
关于循环的选择,有一个小建议:
凡是次数确定的场景多用for循环;否则多用while循环。
*/
public class Demo14Break {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
// 如果希望从第4次开始,后续全都不要了,就要打断循环
if (i == 4) { // 如果当前是第4次
break; // 那么就打断整个循环
}
System.out.println("Hello" + i);
}
}
}
continue
/*
另一种循环控制语句是continue关键字。
一旦执行,立刻跳过当前次循环剩余内容,马上开始下一次循环。
*/
public class Demo15Continue {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i == 4) { // 如果当前是第4层
continue; // 那么跳过当前次循环,马上开始下一次(第5层)
}
System.out.println(i + "层到了。");
}
}
}
/*
永远停不下来的循环,叫做死循环。
死循环的标准格式:
while (true) {
循环体
}
*/
public class Demo16DeadLoop {
public static void main(String[] args) {
while (true) {
System.out.println("I Love Java!");
}
// System.out.println("Hello");
}
}
public class Demo17LoopHourAndMinute {
public static void main(String[] args) {
for (int hour = 0; hour < 24; hour++) { // 外层控制小时
for (int minute = 0; minute < 60; minute++) { // 内层控制小时之内的分钟
System.out.println(hour + "点" + minute + "分");
}
}
}
}
数组的概念:是一种容器,可以同时存放多个数据值。
数组的特点:
数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。
两种常见的初始化方式:
动态初始化(指定长度)
数据类型[] 数组名称 = new 数据类型[数组长度];
静态初始化(指定内容)
标准格式:
数据类型[] 数组名称 = new 数据类型[] { 元素1, 元素2, ... };
省略格式:
数据类型[] 数组名称 = { 元素1, 元素2, ... };
如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。
使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下:
如果是整数类型,那么默认为0;
如果是浮点类型,那么默认为0.0;
如果是字符类型,那么默认 为'\u0000'【不可见字符】';
如果是布尔类型,那么默认为false;
如果是引用类型,那么默认为null。
注意事项:静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。
直接打印数组名称,得到的是数组对应的:内存地址哈希值。【16进制】
访问数组元素的格式:数组名称[索引值]
【注意】索引值从0开始,一直到“数组的长度-1”【数组名.length-1】为止。
改变数组当中元素的内容:
array[1] = 10;
更改数组地址:
// 将arrayA数组的地址值,赋值给arrayB数组
int[] arrayB = arrayA;
System.out.println(arrayB); // 地址值
遍历数组:
//1、普通for循环
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
//2、增强for循环
for(int i:array){
Syoutem.out.println(i);
}
数组反转:
/*
初始化语句:int min = 0, max = array.length - 1
条件判断:min < max
步进表达式:min++, max--
循环体:用第三个变量倒手
*/
for (int min = 0, max = array.length - 1; min < max; min++, max--) {
int temp = array[min];
array[min] = array[max];
array[max] = temp;
}
图例
首先int[][] arr 压栈,然后在堆内存中分配一个二维数组的地址,引用给arr声明,注意,这里的地址其实是一个一维数组,一维数组中存放的都是地址值,然后遍历arr[],再次分配几个一维数组堆内存,将它们在堆中的地址值存储在arr[]中,这样一个二维数组就完成了,注意,新分配的这几个一维数组内存储的就都是正儿八经的数据。

eg:foreach遍历一个二维数组
在java中是没有真正的二维数组的。所以在外层循环中定义了一个字符串数组类型的变量,而内层是真正定义了一个字符串类型。
String name[][] = { { "张三", "李四", "王五" }, { "张六", "李七", "王八" },
{ "张九", "李十", "王十一" } };
for (String[] str1 : name) {
for (String str2 : str1) {
System.out.println(str2);
}
定义格式:
修饰符 返回值类型 方法名称(参数类型 参数名称, ...) {
方法体
return 返回值;
}
三要素
返回值类型、方法名称、参数列表
3种调用方法:
1. 单独调用:方法名称(参数);
2. 打印调用:System.out.println(方法名称(参数));
3. 赋值调用:数据类型 变量名称 = 方法名称(参数);
return两个作用:第一停止当前方法,第二将后面的返回值还给调用处
注意事项:对于有返回值的方法,可以使用单独调用、打印调用或者赋值调用。但是对于无返回值的方法,只能使用单独调用,不能使用打印调用或者赋值调用。
多个方法的名称一样,但是参数列表不一样。好处:只需要记住唯一一个方法名称,就可以实现类似的多个功能。
方法重载与下列因素相关:
方法重载与下列因素无关: