Java基础——Java基本语法


应用程序 = 算法 + 数据结构
算法(写代码的逻辑,解决的是应用程序正确与否的问题)
数据结构(数据的载体,解决的是数据的存储问题、应用程序的效率问题)

Java基本语法

一、关键字和保留字

被 Java 语言赋予了特殊意义的字符串

二、标识符

总之,凡是自己可以起名字的地方,都叫标识符(类名、变量名、方法名…)

标识符的命名规则(即,起名有要求): 比如,不能只用关键字和保留字、不能数字开头、不能含有空格、严格区分大小写

标识符的命名规范(如,驼峰命名法):

  • 包名:多单词组成时,所有字母均为小写:xxxyyyzzz
  • 类名、接口名:多单词组成时,所有单词首字母大写:XyyYyyZzz
  • 变量名、方法名:多单词组成时,第一个单词首字母小写,后续单词首字母大写:xxxYyyZzz
  • 常量名:多单词组成时,所有字母均大写,单词间用下划线分隔:XXX_YYY_ZZZ

【起名尽量做到 “见名知意”


小技巧:
在这里插入图片描述


三、变量

变量是内存中的一块存储区域,我们可以通过变量名来访问这块内存

1、变量的定义和使用

注意点:

  • 变量必须先声明,然后才能使用【否则,在声明以前,变量根本还没有出现过,使用的时候会找不到该变量(程序不认识这个变量),编译错误】;
  • 变量必须先初始化(赋值),然后才能使用【否则没有值,程序也无法使用,编译错误】;
    【Java 是强类型语言;对应的还有弱类型语言,比如 JavaScript】
public class Day02_Exercise{
	public static void main(String[] args){
		// 可以"一步到位":定义 + 初始化
		int myAge = 12;

		// 也可以:先声明,再赋值
		int myNumber;
		myNumber = 22;

		System.out.println("myAge = " + myAge);
		System.out.println("myNumber = " + myNumber);
	}
}
  • 变量的作用域: 变量是有作用域的(一对大括号 “{}” 内),在作用域内,该变量是有效的,出了作用域就失效了;

【遇到一个问题,不知道他可不可以的时候,可以使用 “反证法”(逆向思维) ——> 假设他可行,然后看看会出现什么问题;如果没问题,说明可以】

扫描二维码关注公众号,回复: 6211797 查看本文章

2、变量的类型

按照数据类型分类:

  • 基本数据类型(8种): 整型(byte / short / int / long)、浮点型(float / double)、字符型(char)、布尔型(boolean)
  • 引用数据类型: 类(class)【字符串属于类】、接口(interface)、数组(array)
    在这里插入图片描述

2.1、整型

类型 占用存储空间 表数范围
byte 1字节(= 8bit) -128 ~ 127
short 2字节 -215 ~ 215 - 1
int 4字节 -231 ~ 231 - 1(约21亿)
long 8字节 -263 ~ 263 - 1

【通常使用 int 型(Java整型数值默认也是 int 型)】

2.2、浮点型

类型 占用存储空间 表数范围
单精度float 4字节 -3.403E38 ~ 3.403E38
双精度double 8字节 -1.798E308 ~ 1.798E308

【通常使用 double 型(Java浮点型数值默认也是 double 型)】

public void test(){

	// 1). 超过变量的表示范围,编译出错
	//byte b1 = 128;
	
	// 2). Java整型数值默认是int型,末尾加"L"或"l"显式表示是long型
	long l1 = 123123L;

	// 3). Java浮点型数值默认是double型,末尾必须加"F"或"f"显式表示是float型
	float d1 = 222.144F;
	/* 
	 * 4). long型可以不加"L",是因为"低精度" ——> "高精度",可以自动类型转换;
	 * 		但反之则不行,因此float型不可以不加"F"
	 */
}

2.3、字符型

char【1个字符 == 2个字节】

public void test(){

	// 1). char型变量,只能表示一个字符(至于是英文、汉字、其他符号,都可以)
	char c1 = 'a';
	char c2 = '汉';
	char c3 = 'ズ';

	char c4 = '\n';
	char c5 = '\t';
	char c6 = '\u0043';
	/*
	 * 2). char型变量的表示方式:
	 * 		声明一个字符;
	 * 		转义字符;
	 * 		直接使用 unicode 值来表示字符型常量;
	 */

	System.out.println(c6);
}

注意点:

  • 转义字符:使用 “\”,比如想输出的就是 “\n”,而不是想作为“换行符”,就使用 “\ \n”
  • 【Java默认使用的是Unicode编码(UTF-8是Unicode字符集的具体实现方式,目前实用范围最广)】——> 因此会出现“乱码”问题,因为cmd命令行默认是GBK编码

2.4、布尔型

boolean,只能取 true / false【注意:和C语言不同,0并不表示false,非0也并不表示true


3、基本数据类型之间的转换

3.1、自动类型提升

  • 当 “容量小” 的数据类型 “容量大” 的数据类型做运算时,结果自动提升容量大的数据类型
    byte、short、char —> int —> long —> float —> double
  • 注意:byte、short、char 三者做运算时,结果为 int 型 (无论是两两类型、还是自己类型间)【可能是因为这三者表数范围太小,做运算时很容易超过其表数范围,造成运行错误】

3.2、强制类型转换

  • 转换时,是进行 截断操作,不进行四舍五入(毫无疑问,可能会导致精度损失)
  • 还有可能超过表数范围

4、原码反码补码

在这里插入图片描述

  • 【正数:三码合一】【给补码,要会算原码】
  • 为什么使用补码?
    计算机只能进行加法运算,因此通过补码的方式,将减法运算转换为加法运算【比如:3 - 2,计算机实际上是做了 3 + (-2) 的操作,通过补码的机制,完成了做加法时能达到 “正负冲减” 效果】

四、运算符

算术运算符、赋值运算符、比较运算符(关系运算符)、逻辑运算符、位运算符、三元运算符

注意点:

  • 取余运算(%):被模数、模数可以取负,结果的符号和被模数的符号一致【开发中常使用 “%” 来判断能否被除尽的问题】
  • 自增(++)、自减( --)、扩展赋值运算符(+=、%=…):不改变变量本身的数据类型【例如:short += 2; 正确,但 short = short + 2; 编译错误】
  • 比较运算符:运算的结果,都是boolean类型(即,只有true、false);注意区分 == 和 =
  • 逻辑运算符:只适用于boolean类型变量的运算;异或运算:当 a 和 b 不同时,是true,相同时是false(即所谓的 “异”)
  • | 和 || ,& 和 && 的区别:a | b,无论第一个操作数 a 是不是 true,b 都要判断;a & b,无论 a 是不是 false,b 都要判断【理论上讲,当 a 为 true 时,就可以判断出必有 a | b = ture;同理,当 a 为 false 时,必有 a & b = false,因此没必要去看操作数 b,即所谓的 “短路”】【当 b 是表达式的时候,就会出现差异,(开发时优先选择 “短路运算”)
  • 位运算符:注意,没有 “<<<”,(只有 <<,>>,">>>" 无符号右移);位运算符操作的都是整型变量;左移——是底层 “二进制数的各位往左移”,高位超了就砍掉,低位空了补零(右移,高位补符号位,低位超了砍掉);【每向左移一位,相当于 * 2(除非移动过大,最高位变成 1 了,负数了)】
    在这里插入图片描述
    【位运算符的测试:交换两个变量的值】
public void test(){
	//交换两个变量的值
	//方式一:临时变量(推荐,简单、适用范围广)
	int temp = num1;
	num1 = num2;
	num2 = temp;
	System.out.println("num1 = " + num1 + ", num2 = " + num2);

	//方式二:可以不使用临时变量,但是可能超出表数范围、而且只适用于数值型
	num1 = num1 + num2;
	num2 = num1 - num2;
	num1 = num1 - num2;

	System.out.println("num1 = " + num1 + ", num2 = " + num2);

	//方式三:使用位运算符【(m ^ n) ^ n == m】,同样只适用于数值型
	num1 = num1 ^ num2;
	num2 = num2 ^ num1;
	num1 = num1 ^ num2;
	
	System.out.println("num1 = " + num1 + ", num2 = " + num2);
}

【无符号右移 “>>>” 的应用场景:将十进制数60,转化为十六进制表示】

public void test(){
	//十进制 ---> 十六进制
	int num = 60;
	int i = num & 15; //15的二进制是"0000 1111",与15取&,就可以把最低四位二进制取出来(其余位均变0了)
	String str1 = (i > 9) ? (char)(i - 10 + 'A') + "" : i + "";
	
	int temp = num >>> 4;
	i = temp & 15; //右移4位以后,原本的5~8位,变为现在的最低四位了,重复上述操作,取出这4位
	String str2 = (i > 9) ? (char)(i - 10 + 'A') + "" : (i + "");
	
	System.out.println(num + " ---> " + str2 + str1);
}
  • 三元运算符:能用三元运算符的地方,都可以改写成 if-else 流程控制,但是反之不行【二者皆可的时候,使用三元运算符,因为效率高

五、流程控制

顺序结构、分支结构、循环结构

1、分支结构

  • if-else
  • switch-case
    注意:switch(表达式) {case…} 中的 “表达式” 不是条件表达式,而且只能是如下6种数据类型之一:byte、short、char、int、枚举类型、String类型【浮点型、布尔型不能放!!!String 是 JDK7.0 以后新增的】

2、循环结构

【循环结构4部分:①初始化部分、②循环条件、③循环体、④迭代部分】

  • for
  • while:【千万别丢了④迭代部分!!!!会死循环!!!】
  • do-while

补充1:求取范围 [a,b] 的随机数

public void test(){
	int prize = (int)(Math.random() * 90 + 10);
	//Math.random()产生一个 [0.0, 1.0) 的随机浮点数,
	//  对其 *90+10 然后强转(int),可以确保得到一个[10,100)之间的两位整型数
	/*
	 * 求取[a,b]范围的随机数的公式:
	 *   (int)(Math.random() * (b - a + 1) + a)
	 *   【即 乘以区间大小,再加上区间左范围,(强转是为了能取到左右闭区间的整型)】
	 */
}

补充2:Scanner类的使用

import java.util.Scanner; //1.导包

class Test{
	public void test(){
		Scanner scan = new Scanner(System.in); //2.实例化
	
		System.out.println("身高(cm):");
		int height = scan.nextInt(); //3.调用方法,获取键盘输入的值
		
		System.out.println("财富(千万):");
		double money = scan.nextDouble();
		
		System.out.println("帅(是/否):");
		String face = scan.next();
		
		if(height >= 180 && money >= 1 && "是".equals(face)){
			System.out.println("大佬!");
		}else if(height >= 180 || money >= 1 || "是".equals(face)){
			System.out.println("一线!");
		}else{
			System.out.println("我");
		}
	}
}

补充3:测试运行时间——System.currentTimeMillis()

返回值:一个 long 型值【当前时间距离 1970-01-01 00:00:00 的毫秒数】

/* 优化版 */
	public static void forForTest4_3(){
		long start = System.currentTimeMillis(); //开始时间
		
		//想要计算时间的代码段....
		
		long end = System.currentTimeMillis(); //结束时间
		System.out.println();
		System.out.println("程序运行时间为:" + (end - start) + " ms");
	}

猜你喜欢

转载自blog.csdn.net/wszhbl/article/details/89318456