Java基础语法

(一)入门名词解释和基本语句

  • main方法: 称为主方法。写法是固定格式不可以更改。main方法是程序的入口点或起始点,无论我们编写多 少程序,JVM在运行的时候,都会从main方法这里开始执行。

  • 注释: 就是对代码的解释和说明。其目的是让人们能够更加轻松地了解代码。为代码添加注释,是十分必须 要的,它不影响程序的编译和运行。

    • 单行注释//注释内容
    • 多行注释/*注释内容(可换行)*/
  • 方法体:方法内部的内容

  • 输出语句:

    • System.out.println();换行输出
    • System.out.print();不换行输出
  • 关键字keywords:是指在程序中,Java已经定义好的单词,具有特殊含义。 例如: publicclass staticvoid等。关键字的特点:1. 完全小写的字母。2.在增强版的记事本当中(例如Notepad++)有特殊颜色。

  • 标识符:是指在程序中,我们自己定义内容。比如类的名字、方法的名字和变量的名字等等,都是标识符 。

    • 命名规则:标识符可以包含 英文字母26个(区分大小写) 、 0-9 数字$(美元符号) 和 _下划线) 。 标识符不能以数字开头。 标识符不能是关键字。
    • 命名规范:
      • 类名规范:首字母大写,后面每个单词首字母大写(大驼峰式)。
      • 方法名规范: 首字母小写,后面每个单词首字母大写(小驼峰式)。
      • 变量名规范:全部小写。

(二)常量、变量

常量:在程序运行期间,固定不变的量。常量的分类:

类型 含义 数据举例
整数常量 直接写上的数字,没有小数点 100、200、0、-250
浮点数常量 直接写上的数字,有小数点 2.5、-3.14、0.0
字符常量 凡是用单引号引起来的单个字符,就做字符常量 'A'、'b'、'9'、'中'
字符串常量 凡是用双引号引起来的部分,叫做字符串常量。 "abc"、"Hello"、"123"
布尔常量 只有两种取值 true、false
空常量 代表没有任何数据 null

变量:程序运行期间,内容可以发生改变的量。创建一个变量并且使用的格式:

数据类型 变量名称; // 创建了一个变量
变量名称 = 数据值; // 赋值,将右边的数据值,赋值交给左边的变量

一步到位的格式:

数据类型 变量名称 = 数据值; // 在创建一个变量的同时,立刻放入指定的数据值

使用变量的时候,有一些注意事项:

  1. 如果创建多个变量,那么变量之间的名称不可以重复。
  2. 对于float和long类型来说,字母后缀F和L不要丢掉。
  3. 如果使用byte或者short类型的变量,那么右侧的数据值不能超过左侧类型的范围。
  4. 没有进行赋值的变量,不能直接使用;一定要赋值之后,才能使用。
  5. 变量使用不能超过作用域的范围。【作用域】:从定义变量的一行开始,一直到直接所属的大括号结束为止。
  6. 可以通过一个语句来创建多个变量,但是一般情况不推荐这么写。

(三) 数据类型转换、运算符

1、数据类型转换

当数据类型不一样时,将会发生数据类型转换。
  • 自动类型转换(隐式)
    1. 特点:代码不需要进行特殊处理,自动完成。
    2. 规则:数据范围从小到大。

  • 强制类型转换(显式)

    强制类型转换
     	1. 特点:代码需要进行特殊的格式处理,不能自动完成。
        2. 格式:范围小的类型 范围小的变量名 = (范围小的类型) 原本范围大的数据;
    
    注意事项:
     	1. 强制类型转换一般不推荐使用,因为有可能发生精度损失、数据溢出。
     	2. byte/short/char这三种类型都可以发生数学运算,例如加法“+.
     	3. byte/short/char这三种类型在运算的时候,都会被首先提升成为int类型,然后再计算。
     	4. boolean类型不能发生数据类型转换
    

数字和字符的对照关系表(编码表):

  • ASCII码表:American Standard Code for Information Interchange,美国信息交换标准代码。
  • Unicode码表:万国码。也是数字和符号的对照关系,开头0-127部分和ASCII完全一样,但是从128开始包含有更多字符
    	48 - '0'
    	65 - 'A'
    	97 - 'a'
    	/*大写字母和小写字母相差32,例如:*/
    	char zifu3 = 'c';
    	// 左侧是int类型,右边是char类型,
    	// char --> int,确实是从小到大
    	// 发生了自动类型转换
    

2、运算符

运算符:进行特定操作的符号。例如:+
表达式:用运算符连起来的式子叫做表达式。例如:20 + 5。又例如:a + b

(1)算数运算符

算术运算符
+ 加法运算、字符串连接运算
- 减法运算
* 乘法运算
/ 除法运算
% 取模运算,两个数字相除取余数
++-- 自增自减运算

对于一个整数的表达式来说,除法用的是整除,整数除以整数,结果仍然是整数。只看商,不看余数。
只有对于整数的除法来说,取模运算符才有余数的意义。

注意事项:

 	1. 一旦运算当中有不同类型的数据,那么结果将会是数据类型范围大的那种。
    	// int + double --> double + double --> double
		int x=10;
    	double result3 = x + 2.5;
	2.自增自减,使用区别:
		1. 在单独使用的时候,前++和后++没有任何区别。也就是:++num;和num++;是完全一样的。
		2. 在混合的时候,有【重大区别】
			A. 如果是【前++】,那么变量【立刻马上+1】,然后拿着结果进行使用。	【先加后用】
			B. 如果是【后++】,那么首先使用变量本来的数值,【然后再让变量+1】。	【先用后加】

(2)赋值运算符

基本运算符
= 代表将右侧的数据交给左侧的变量【左边取右边的值】
复合运算符
+= 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;

(3)比较运算符

比较运算符
> 大于
< 小于
>= 大于等于
<= 小于等于
== 相等
!= 不等于
注意事项:
1. 比较运算符的结果一定是一个boolean值,成立就是true,不成立就是false
2. 如果进行多次判断,不能连着写。
   数学当中的写法,例如:1 < x < 3
   程序当中【不允许】这种写法。

(4)逻辑运算符

逻辑运算符
&&短路与(并且) 全都是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

(5)三元运算符

一元运算符:只需要一个数据就可以进行操作的运算符。例如:取反!、自增++、自减--
二元运算符:需要两个数据才可以进行操作的运算符。例如:加法+、赋值=
三元运算符:需要三个数据才可以进行操作的运算符。

格式:

数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;

流程:

首先判断条件是否成立:

  1. 如果成立为true,那么将表达式A的值赋值给左侧的变量;

  2. 如果不成立为false,那么将表达式B的值赋值给左侧的变量;
    二者选其一。

例如:		// 数据类型 变量名称 = 条件判断 ? 表达式A : 表达式B;
		// 判断a > b是否成立,如果成立将a的值赋值给max;如果不成立将b的值赋值给max。二者选其一
		int max = a > b ? a : b; // 最大值的变量

(四)流程控制语句

1、判断语句-if

  • 单if

    if(关系表达式){
    	语句体;

    1627961263813

  • 标准的if-else语句

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

    1627961415628

  • 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);
	}
}

1627961481766

  • if语句和三元运算符的互换
// 题目:使用三元运算符和标准的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);
	}
}

2、 选择语句--switch

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语句可以省略,但是强烈推荐不要省略
		}
	}
}

1627961909462

switch语句使用的注意事项:

1. 多个case后面的数值不可以重复。

2. switch后面小括号当中只能是下列数据类型:
基本数据类型:byte/short/char/int
引用数据类型:String字符串、enum枚举

3. switch语句格式可以很灵活:前后顺序可以颠倒,而且break语句还可以省略。
“匹配哪一个case就从哪一个位置向下执行,直到遇到了break或者整体结束为止。”【case的穿透性】

3、循环语句

循环结构的基本组成部分,一般可以分成四部分:

  1. 初始化语句:在循环开始最初执行,而且只做唯一一次。
  2. 条件判断:如果成立,则循环继续;如果不成立,则循环退出。
  3. 循环体:重复要做的事情内容,若干行语句。
  4. 步进语句:每次循环之后都要进行的扫尾工作,每次循环结束之后都要执行一次。
  • 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. 条件判断
    	}
    }
    

    三种循环的区别。

    1. 如果条件判断从来没有满足过,那么for循环和while循环将会执行0次,但是do-while循环会执行至少一次。
    2. for循环的变量在小括号当中定义,只有循环内部才可以使用。while循环和do-while循环初始化语句本来就在外面,所以出来循环之后还可以继续使用

4、跳出语句

  • 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 + "层到了。");
    		}
    	}
    }
    

5、死循环

/*
永远停不下来的循环,叫做死循环。

死循环的标准格式:
while (true) {
	循环体
}
*/
public class Demo16DeadLoop {
	public static void main(String[] args) {
		while (true) {
			System.out.println("I Love Java!");
		}
		
		// System.out.println("Hello");
	}
}

6、循环嵌套

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 + "分");
			}

		}
	}
}

(五)数组

1、什么是数组

数组的概念:是一种容器,可以同时存放多个数据值。

数组的特点:

  1. 数组是一种引用数据类型
  2. 数组当中的多个数据,类型必须统一
  3. 数组的长度在程序运行期间不可改变

2、数组的初始化

数组的初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。
两种常见的初始化方式:

  1. 动态初始化(指定长度)

    	数据类型[] 数组名称 = new 数据类型[数组长度];
    
  2. 静态初始化(指定内容)

    标准格式:
    数据类型[] 数组名称 = new 数据类型[] { 元素1, 元素2, ... };
    
    省略格式:
    数据类型[] 数组名称 = { 元素1, 元素2, ... };
    

​如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体的内容,用静态初始化。

使用动态初始化数组的时候,其中的元素将会自动拥有一个默认值。规则如下:

如果是整数类型,那么默认为0;

如果是浮点类型,那么默认为0.0;

如果是字符类型,那么默认 为'\u0000'【不可见字符】';

如果是布尔类型,那么默认为false;

如果是引用类型,那么默认为null。

注意事项:静态初始化其实也有默认值的过程,只不过系统自动马上将默认值替换成为了大括号当中的具体数值。

3、访问数组元素

直接打印数组名称,得到的是数组对应的:内存地址哈希值。【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;
        }

4、多维数组的实质⭐

图例

首先int[][] arr 压栈,然后在堆内存中分配一个二维数组的地址,引用给arr声明,注意,这里的地址其实是一个一维数组,一维数组中存放的都是地址值,然后遍历arr[],再次分配几个一维数组堆内存,将它们在堆中的地址值存储在arr[]中,这样一个二维数组就完成了,注意,新分配的这几个一维数组内存储的就都是正儿八经的数据。

img

eg:foreach遍历一个二维数组

在java中是没有真正的二维数组的。所以在外层循环中定义了一个字符串数组类型的变量,而内层是真正定义了一个字符串类型。

 String name[][] = { { "张三", "李四", "王五" }, { "张六", "李七", "王八" },
				{ "张九", "李十", "王十一" } };
		for (String[] str1 : name) {
			for (String str2 : str1) {
				System.out.println(str2);
			}

(六)方法

1、方法基本内容

定义格式:

修饰符 返回值类型 方法名称(参数类型 参数名称, ...) {
    方法体
    return 返回值;
}
三要素
返回值类型、方法名称、参数列表

3种调用方法:

1. 单独调用:方法名称(参数);
2. 打印调用:System.out.println(方法名称(参数));
3. 赋值调用:数据类型 变量名称 = 方法名称(参数);

return两个作用:第一停止当前方法,第二将后面的返回值还给调用处

注意事项:对于有返回值的方法,可以使用单独调用、打印调用或者赋值调用。但是对于无返回值的方法,只能使用单独调用,不能使用打印调用或者赋值调用。

2、方法重载Overload

Note

多个方法的名称一样,但是参数列表不一样。好处:只需要记住唯一一个方法名称,就可以实现类似的多个功能。

  • 方法重载与下列因素相关:

    1. 参数个数不同
    2. 参数类型不同
    3. 参数的多类型顺序不同
  • 方法重载与下列因素无关:

    1. 与参数的名称无关
    2. 与方法的返回值类型无关