欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Java 编程 第 2 章 Java 语言的基本语法

最编程 2024-06-16 09:43:29
...
【深圳】源创会:5.26下午、轰趴馆等你”

1. 关键字和标识符

1.1 关键字

​ 关键字/保留字:Java语言保留提供内部使用,赋予了新的含义。

1.2 标识符

​ 标识符是用来给变量、类、方法、对象进行命名的。

​ 规则:

​ 1.必须是字母、下划线、美元符号$开头。

​ 2.其他部分可以是字母、下划线、美元符号$、数字任意组合。

​ 3.区分大小写

​ 4.不能是关键字

​ 规范:

​ 1.一个标识符可以由几个单词连接而成,以表明它的意思。

​ 2.没有长度限制。

​ 3.标识符不能是true、flase和null。

​ 4.对于类名,每个单词的首字母都要大写,其他字母则小写,如RecordInfo。

​ 5.对于方法名和变量名,与类名有些相似,除了第一个单词的首字母小写,其他单词的首字母都要大写,如getRecordName()、recordName。

​ 6.对于常量名,每个单词的每个字母都要大写,如果由多个单词组成,通常情况下单词之间用下画线(_)分隔,如MAX_VALUE。

​ 7.对于包名,每个单词的每个字母都要小写,如com.frame。

​ 比如接下来要学习的标识符、变量、常量、数据类型、运算符、流程控制语句等,这些是编程中的“砖块”,是编程的基础。 ​ 想要开始正式编程,还要在学习流程控制语句,流程控制语句就像水泥,刻意黏在一起,最终建成一座大厦。

2. 常量与变量

2. 1 常量

​ 常量是在程序运行中,其值不能改变的量,用final修饰。

​ 规范:

​ 常量标识符通常大写。

​ 不同字符使用下划线分隔

​ 只能被赋值一次,通常定义时即对其初始化。

		具体方式:final 常量类型 常量标识符;

​ 在为long型常量或变量赋值时,需要在所赋值的后面加上一个字母"L"(或"l"),说明所赋的值为long型。不加默认int型。(小l容易与数字1混淆,一般只用L)

​ 在为float型常量赋值时,需要在数值的后面加上一个字母"F"(或"f"),说明数值为float型。如果所赋的值为整数,并且未超出int型的取值范围,也可以省略"F"(或"f")。

​ 在为double型常量或变量赋值时,需要在所赋值的后面加上一个字母"D"(或"d"),说明所赋的值为double型。如果所赋的值为小数,或者所赋的值为整数并且未超出int型的取值范围,也可以省略"D"(或"d")。

​ 如果需要声明多个同一类型的常量,也可以采用下面的方式:

		final 常量类型 常量标识符1,常量标识符2,常量标识符3;
		final 常量类型 常量标识符4 = 常量值4,常量标识符5 = 常量值5,常量标识符6 = 常量值6;

​ 例如:

		final int = A,B,C;
		final int = D = 4,E = 5,F = 6;

​ 如果在声明常量时并没有对常量进行初始化,也可以在需要的时候进行初始化,例如:

		final float PIE;
		PIE = 3.14F;

2. 2 变量

变量:变量本质上就是一个“可操作的存储空间”,空间位置是固定的,但是里面的值是可以变化的。

​ 在定义变量标识符时,按照Java语言的命名规则,第一个单词的首字母小写,其他单词的首字母大写,其他字符则一律小写,如"name" "partyMemberAge"。

		语法:数据类型 变量名=值;
		变量声明及使用:第一步:声明变量,根据数据类型在内存申请空间。
				数据类型	变量名;
		第二步:赋值,即“将数据存储至对应的内存空间”
				变量名 = 数值;
				数据类型	变量名 = 数值;(第一步和第二步可以合并)
		第三步:使用变量,即“取出数据使用”

​ 不同的数据类型在内存中会分配不同的空间:位(bit):计算机里存储的最小单元 字节(byte): 8个位构成一个字节。 char:占用2个字节,一个汉字占用2个字节。

​ 注意事项

​ 变量定义后如果要使用,必须要赋值。

​ 定义变量时请注意,变量名不能重复。

​ 代码自上而下执行

​ 一行上是可以定义多个变量

​ 变量的作用域

​ 在类中的,方法体之外的变量:全局变量

​ 方法体之内的变量:局部变量

3. 数据类型

3.1 数据类型

​ 数据类型: 基本数据类型和引用数据类型。

​ 基本数据类型:(整数型:字节型(byte)、短整型(short)、整型(int)、长整型(long))、(浮点数型:单精度型(float)、双精度型(double))、(逻辑型/布尔型:boolean:真(true)、 假(false))、(字符型:char:'A' 'T')

​ 引用数据类型:数组、对象、类、接口、(字符串型:String str="aaaasdfghjkl";)

​ 例如:

		Object object=null;//声明一个java.lang.Object类的引用,并初始化为null
		List list=null;//声明一个java.util.List接口的引用,并初始化为null
		int[] months=null;//声明一个int型数组的引用,并初始化为null
		
		Object object=new Object();//声明并具体初始化一个java.lang.Object类的引用
		List list=new ArrayList();//声明并具体初始化一个java.util.List接口的引用
		int[] months=new int[12];//声明并具体初始化一个int型数组的引用

​ 将引用数据类型的常量或变量初始化为null,表示引用数据类型的常量或变量不引用任何对象。在具体初始化引用数据类型时需要注意的是,对接口引用的初始化需要通过接口的相应实现类实现。

​ 在为char型常量或变量赋值时,如果所赋的值为一个英文字母、符号或汉字,必须将所赋的值放在英文状态下的一对单引号中。

​ 在为char型常量或变量赋值时,无论所赋的值为字母、符号还是汉字,都只能为一个字符。

​ 对于基本数据类型的变量,Java虚拟机会根据变量的实际类型为其分配实际的内存空间。而对于引用数据类型的变量,Java虚拟机同样要为其分配内存空间,但在内存空间中存放的并不是变量所引用的对象,而是对象在堆区存放的地址,所以引用变量最终只是指向被引用的对象,而不是存储了被引用的对象。因此,两个引用变量之间的赋值,实际上就是将一个引用变量存储的地址复制给另一个引用变量,从而使两个变量指向同一个对象。

3.2 数据类型转换

​ 数据类型之间的转换可以分为以下3种情况:

​ 1.基本数据类型之间的相互转换

​ 2.字符串与其他数据类型之间的相互转换

​ 3.引用数据类型之间的相互转换

​ 数据类型转换

​ 自动类型转换:数据范围小的变量可以直接赋值给数据范围大的。

​ 规则1:如果一个操作数为double型,则整个表达式可提升为double型。

​ 规则2:满足自动类型转换的条件。

​ 两种类型要兼容:

​ 数值类型(整型和浮点型)互相兼容

​ 目标类型大于源类型:

​ 例如:double型大于int型

​ 强制类型转换(可能会导致数据溢出或精度降低):大转小,使用强转符(数据类型)

​ 例如:

		int i=(int) 7.5;
		
		byte b= (byte) 774;

​ 基本数据类型从低到高排序:byte、short、char、int、long、float、double。

​ 自动类型转换:

​ 1.如果在算术表达式中含有int、long、float或double型的数据。会将所有数据类型相对较低的变量自动转为表达式中数据类型最高的数据类型,然后再进行计算,并且计算结果的数据类型也为表达式中数据类型相对较高的数据类型。(最后结果的类型只能大于等于相对最高的数据类型)

​ 2.在算术表达式中只含有byte、short或char型的数据。会将所有变量的类型自动转换为int型,然后再进行计算,并且计算结果的数据类型也为int型。(最后结果的类型只能大于等于int型)

​ 特例:对于数据类型为char的变量,不可以将数据类型为byte或short的变量直接赋值给char型变量。但是可以将char型变量直接赋值给数据int、long、float或double的变量。

3.3 Scanner的使用和关闭

​ Scanner的使用 ​

		import java.util.*;//第一步:导入Scanner类。
		
		Scanner input = new Scanner(System.in);//第二步:创建Scanner对象。
		
		int now = input.nextInt();//第三步:获得键盘输入的数据
		nextInt():输入一个整数值
		nextIDouble():输入一个浮点型
		next():输入一个字符串型
		nextLine():输入一个字符串型

​ 注意:next()会自动消去有效字符前的空格,只返回输入的字符,不能得到带空格的字符串。也就是说如果输入了一串字符,到了有空格的时候就会停止录入,只录入空格前面的东西,空格后面的东西(包括分隔的空格都会保留在缓存区域)。空格、Tab键和Enter键都被视为分隔符(结束符)。

​ nextLine()方法返回的是Enter键之前的所有字符,它是可以得到带空格的字符串的。也就是说输入一串字符,它就可以接受所有字符包括空格,但是遇到回车Enter键就会停止录入,只录入前面的东西。nextLine()自动读取了被next()去掉的Enter作为他的结束符,所以没办法从键盘输入值。经过验证,其他的next的方法,如nextDouble() ,nextFloat() ,nextInt() 等与nextLine()连用时都存在这个问题。在每一个 next()、nextDouble() 、nextFloat()、nextInt() 等语句之后加一个nextLine()语句,将被next()去掉的Enter结束符过滤掉。(因为nextLine啥都要,所以有时候要错了空格,等不到所需输入)

​ (简单点说,next我只要字,nextLine我啥都要)

​ 特别注意:在录入中间有回车的字符串的时候,不要使用next()和nextLine()的配合,next会将回车之前的字符串录入,将回车以及后面的内容留在缓存区,next()直接去缓存区录入数据,结果上来就碰上了回车,(还没有开始就结束了),那么缓存区回车后面的内容自然就无法接受了。

​ 解决方法:可以在next()和nextLine()中间再加一个nextLine(),让新加的这个nextLine()将回车吸收,结束,然后最后的nextLine()就可以直接录入数据了。

​ Scanner的close()方法的使用以及Scanner应该如何关闭

​ 当我们使用Scanner读取文件或其他输入流时,它实际上在内部打开了一个到这些资源的连接。如果我们不关闭这个连接,那么这些资源就不能被其他程序或操作所使用,这可能导致资源泄露。更糟糕的是,如果程序在长时间运行期间不断打开资源而不关闭它们,那么最终可能会导致系统资源耗尽,从而使程序崩溃。

​ 如果在代码中关闭了Scanner,也就是调用了Scanner.close()这个方法,那么在接下来的代码中将无法再使用Scanner,即便再次声明了一个新的Scanner对象也是如此。

		Scanner input = new Scanner(System.in);//创建Scanner对象。
		
		input.close();//关闭Scanner

​ 因为Scanner的close()方法会关闭System.in,也就是Scanner对象在被初始化时所传入的参数。而System.in是一个final常量,所以在整个方法中只会被实例化一次。这也就导致了在第二次创建Scanner对象的时候并没有一个全新的System.in被传入,而是一个已经被关闭了的System.in。那么是否能够重新打开System.in呢?目前查到的资料表示System.in在被关闭后并不能重新打开,所以要关闭Scanner的话一定要确保在同一方法下接下来不会再调用Scanner来接受输入。

​ 需要注意的是,如果函数中有多个地方可能会结束方法,那么要在每次结束前确保Scanner对象被close了。但如果能够保证接下来的部分不会在运用到Scanner,也可以提早进行Scanner的close()方法的调用。这也就是为什么Scanner的close()不是总被放在最后的原因。同时Scanner在方法中也占据了一定的内存,会影响到运行,能够及早释放也会更好。这样可以进一步节省内存,也保证了不用担心后面会出现突然结束方法而没有关闭Scanner的情况。虽然这样就要注意是否要再次调用Scanner了。

​ 从Java 7开始,我们可以使用try-with-resources语句来自动管理资源,包括Scanner。这个语句确保每个资源在语句结束时自动关闭,无论是否发生异常。

		try (Scanner input = new Scanner(System.in)) {
		// ... 执行一些读取操作 ...
		} // Scanner将在此处自动关闭

​ 在上述代码中,即使发生异常,Scanner也会在try语句块结束时自动关闭。

  • 始终在不再需要Scanner 时关闭它,无论是在finally块中,还是使用try-with-resources语句。
  • 如果你的Scanner是从文件或网络连接等外部资源创建的,那么更应该在读取完数据后立即关闭它,以避免长时间占用这些资源。
  • 如果你在一个方法中创建了一个Scanner,那么最好在该方法的末尾关闭它,而不是依赖于调用者来关闭。这有助于防止资源泄露,并使代码更易于理解和维护。

​ Scanner.next().charAt(0)具体含义就是,获取用户输入的字符串中的第一个字符,其中也存在隐式类型的转化,将字符串型转化成字符型。

4. 运算符

4.1 赋值运算符

​ 赋值运算符:=(结合性从右到左)。

4.2 算数运算符

​ 算数运算符:+、-、*、/(取整数)、%(取余数)。

​ 复合算数运算符:+=、-=、*=、/=、%=。

​ 没有小数参与运算时:0可以做被除数,但是不可以做除数。当0做被除数时,无论是除法运算,还是求余运算,运算结果都为0。

​ 有小数参与运算时:如果被除数为浮点型数据或变量,无论是除法运算,还是求余运算,0都可以做除数。如果是除法运算,当被除数是正数时,运算结果为Infinity,表示无穷大。当被除数是负数时,运算结果为-Infinity,表示无穷小。如果是求余运算,运算结果为NaN。

4.3 关系运算符

​ 关系运算符:>、<、>=、<=、==、!=。

​ 总结:关系运算符运算结果是布尔类型,不是true,就是false。

​ 所有关系运算符均可用于整数型、浮点型和字符型,其中“==”和“!=”还可以用于boolean型和引用数据类型,即可用于所有的数据类型。

​ >、<、>=、<=运算符的优先级别高于==、!=。

​ >、<、>=、<=运算符只支持只支持数值类型的数值比较。

4.4 逻辑运算符

​ 逻辑运算符:&(非逻辑与)、&&(逻辑与)、|(非逻辑或)、||(逻辑或)、!(取反)、^(异或)。

​ 优先级别!>&&>||。

​ &&和||,如果第一个操作数已经能确定表达式的值,第二个操作数就不必计算了。

​ ^:当运算符的两侧同时为true或false时,运算结果为false,否则运算结果为true。

​ &和&&:当运算符的两侧同时为true时,运算结果为true。

​ &和&&的区别:运算符“&&”只有在其左侧为true时,才运算其右侧的逻辑表达式,否则直接返回运算结果false。运算符“&”无论其左侧为true或false,都要运算其右侧的逻辑表达式,最后才返回运算结果。

​ |和||:当运算符的两侧同时为false时,运算结果为false,否则运算结果为true。

​ |和||的区别:运算符“||”只有在其左侧为false时,才运算其右侧的逻辑表达式,否则直接返回运算结果true。运算符“|”无论其左侧为true或false,都要运算其右侧的逻辑表达式,最后才返回运算结果。

4.5 位运算符

​ 位运算符是对操作数以二进制为单位进行的操作和运算,运算结果均为整数型。位运算符又分为逻辑位运算符和移运算符。

​ 位运算符:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)。

​ 按位取反运算是将二进制位中的0修改为1,1修改为0。在进行按位与运算时,只有当两个二进制位都为1时,结果才为1。在进行按位或运算时,只要有一个二进制位为1,结果就为1。在进行按位异或运算时,当两个二进制位同时为0或1时,结果为0,否则结果为1。

​ 移位运算符:<<(左移,低位添0补齐)、>>(右移,高位添符号位)、>>>(右移,高位添0补齐)。

4.6 对象运算符

​ 对象运算符:用来判断对象是否为某一类型,运算结果为boolean型。如果是则返回true,否则返回false。对象运算符的关键字为"instanceof"。

	格式:对象标识符 instanceof 类型标识符

4.7 其他运算符

​ 其他运算符:.(用来访问类的成员或对象的实例成员)、[] (用于声明、建立或访问数组的元素)、?:(三元运算符,根据"?"左侧的逻辑值,决定返回":"两侧中的一个值,类似"if...else"流程控制语句)、++(前++,先自增在运算,后++,先运算在自增。)、--(前--,先自减在运算,后--,先运算在自减。)。

		int n=3;
		int m=3;
		int a=2+(++n);			//先将变量n加1,然后再执行“2+4”
		int b=2+(m++);			//先执行“2+3”,然后再将变量m加1
		System.out.println(a);		//输出结果为6
		System.out.println(b);		//输出结果为5
		System.out.println(n);		//输出结果为4
		System.out.println(m);		//输出结果为4
		int n=3;
		int m=3;
		int a=2+(--n);			//先将变量n减1,然后再执行“2+2”
		int b=2+(m--);			//先执行“2+3”,然后再将变量m减1
		System.out.println(a);		//输出结果为4
		System.out.println(b);		//输出结果为5
		System.out.println(n);		//输出结果为2
		System.out.println(m);		//输出结果为2

​ ?: :三元运算符,若逻辑表达式的值为true,则整个表达式的值为表达式1的值。若逻辑表达式的值为false,则整个表达式的值为表达式2的值。

		逻辑表达式 ? 表达式1 : 表达式2

4.8 运算符的优先级别及结合性

​ 运算符的优先级及结合性:单目运算符包括! ++ --,优先级别高。优先级别最低的是赋值运算符。可以通过()控制表达式的运算顺序,()优先级最高。从右向左结合性的只有赋值运算符、三目运算符和单目运算符。算术运算符>关系运算符>逻辑运算符

推荐阅读