Java基础语法
注释
// 这是单行注释文字
/*
这是多行注释文字
这是多行注释文字
这是多行注释文字
*/
关键字
关键字的字母全部小写。
常用的代码编辑器对关键字都有高亮显示,比如现在我们能看到的public、class、static等
常量
字符串常量 用双引号括起来的多个字符(可以包含0个、一个或多个),例如"a"、"abc"、"中国"等
整数常量 整数,例如:-10、0、88等
小数常量 小数,例如:-5.5、1.0、88.88等
字符常量 用单引号括起来的一个字符,例如:'a'、'5'、'B'、'中'等
布尔常量 布尔值,表示真假,只有两个值true和false
空常量 一个特殊的值,空值,值为null
除空常量外,其他常量均可使用输出语句直接输出。
变量
变量的定义格式:
数据类型 变量名 = 数据值;
变量的注意事项
1. 在同一对花括号中,变量名不能重复。
2. 变量在使用之前,必须初始化(赋值)。
3. 定义long类型的变量时,需要在整数的后面加L(大小写均可,建议大写)。因为整数默认是int类型,整数太
大可能超出int范围。
4. 定义float类型的变量时,需要在小数的后面加F(大小写均可,建议大写)。因为浮点数的默认类型是
double, double的取值范围是大于float的,类型不兼容。
数据类型
计算机存储单元
计算机存储设备的最小信息单元叫“位(bit)”,我们又称之为“比特位”,通常用小写的字母”b”表示。而计算机中最基本的存储单元叫“字节(byte)”,通常用大写字母”B”表示,字节是由连续的8个位组成。
1B(字节) = 8bit
1KB = 1024B
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
Java中的数据类型
键盘录入
导包
Scanner 类在java.util包下,所以需要将该类导入。导包的语句需要定义在类的上面。
import java.util.Scanner;
创建Scanner对象
Scanner sc = new Scanner(System.in);// 创建Scanner对象,sc表示变量名,其他均不可变
接收数据
int i = sc.nextInt(); // 表示将键盘录入的值作为int数返回。
示例
import java.util.Scanner;
public class ScannerDemo {
public static void main(String[] args) { //创建对象
Scanner sc = new Scanner(System.in); //接收数据
int a = sc.nextInt(); //输出数据
System.out.println(a);
}
}
标识符
由字母、数字、下划线“_”、美元符号“$”组成,第一个字符不能是数字。
不能使用java中的关键字作为标识符。
标识符对大小写敏感(区分大小写)。
小驼峰式命名:变量名、方法名
首字母小写,从第二个单词开始每个单词的首字母大写。
大驼峰式命名:类名
每个单词的首字母都大写。
类型转换
隐式转换
把一个表示数据范围小的数值或者变量赋值给另一个表示数据范围大的变量。这种转换方式是自动的,直接书写即可。

1. 整数默认是int类型,byte、short和char类型数据参与运算均会自动转换为int类型。
byte b1 = 10; byte b2 = 20;
byte b3 = b1 + b2; // 第三行代码会报错,b1和b2会自动转换为int类型,计算结果为int,int赋值给byte需要强制类型转换。
// 修改为: int num = b1 + b2;
// 或者: byte b3 = (byte) (b1 + b2);
2. boolean类型不能与其他基本数据类型相互转换。
强制转换
目标数据类型 变量名 = (目标数据类型)值或者变量
double num1 = 5.5;
int num2 = (int) num1; // 将double类型的num1强制转换为int类型
System.out.println(num2); // 输出5(小数位直接舍弃)
类型转换案例
byte a = 3;
byte b = 4;
byte c = a + b; //错误。因为两个byte变量相加,会先提升为int类型
byte d = 3 + 4; //正确。常量优化机制
常量优化机制:
在编译时,整数常量的计算会直接算出结果,并且会自动判断该结果是否在byte取值范围内,
如果在:编译通过
如果不在:编译失败
运算符
算术运算符
int a = 10;
int b = 3;
System.out.println(a / b); // 输出结果3
System.out.println(a % b); // 输出结果1
byte b1 = 10;
byte b2 = 20;
// byte b3 = b1 + b2; // 该行报错,因为byte类型参与算术运算会自动提示为int,int赋值给byte可能损失 精度
int i3 = b1 + b2; // 应该使用int接收
byte b3 = (byte) (b1 + b2); // 或者将结果强制转换为byte类型
-------------------------------
int num1 = 10;
double num2 = 20.0;
double num3 = num1 + num2; // 使用double接收,因为num1会自动提升为double类型
字符串的“+”操作
当“+”操作中出现字符串时,这个”+”是字符串连接符,而不是算术运算。
在”+”操作中,如果出现了字符串,就是连接运算符,否则就是算术运算。当连续进行“+”操作时,从左到右逐个执
行。
System.out.println(1 + 99 + "年黑马"); // 输出:100年黑马
System.out.println(1 + 2 + "itheima" + 3 + 4); // 输出:3itheima34
// 可以使用小括号改变运算的优先级
System.out.println(1 + 2 + "itheima" + (3 + 4)); // 输出:3itheima7
关系运算符
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a >= b); // false
System.out.println(a < b); // true
System.out.println(a <= b); // true
// 关系运算的结果肯定是boolean类型,所以也可以将运算结果赋值给boolean类型的变量
boolean flag = a > b;
System.out.println(flag); // 输出false
关系运算符的结果都是boolean类型,要么是true,要么是false。
千万不要把“==”误写成“=”,"=="是判断是否相等的关系,"="是赋值。
逻辑运算符
短路逻辑运算符
在逻辑与运算中,只要有一个表达式的值为false,那么结果就可以判定为false了,没有必要将所有表达式的值都计算出来,短路与操作就有这样的效果,可以提高效率。同理在逻辑或运算中,一旦发现值为true,右边的表达式将不再参与运算。
逻辑与&,无论左边真假,右边都要执行。
短路与&&,如果左边为真,右边执行;如果左边为假,右边不执行。
逻辑或|,无论左边真假,右边都要执行。
短路或||,如果左边为假,右边执行;如果左边为真,右边不执行。
int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 两个表达都会运算
System.out.println(x); // 4 System.out.println(y); // 5
System.out.println((x++ > 4) && (y++ > 5)); // 左边已经可以确定结果为false,右边不参与运算 System.out.println(x); // 4
System.out.println(y); // 4
三元运算符
关系表达式 ? 表达式1 : 表达式2
int a = 10;
int b = 20;
int c = a > b ? a : b; // 判断 a>b 是否为真,如果为真取a的值,如果为假,取b的值
if语句
if(...)
int a=10; //编译失败,定义变量和赋值变量分两条执行
Random
导入包
import java.util.Random;
创建对象
Random r = new Random();
产生随机数
int num = r.nextInt(10); //产生0~9随机数
示例
import java.util.Random;
public class Demo1Random {
public static void main(String[] args){
Random r = new Random();
for(int i = 1; i <= 10; i++){
System.out.println(num);
}
}
}
IDEA快捷键
psvm:public static void main(String[] args){}
sout:System.out.println();
数组名.fori:for (int i = 0; i < 数字名.length; i++) {}
alt+1:打开/隐藏工程目录结构
alt+4:打开/隐藏工程目录结构
crtl+at+L:格式化代码
alt+enter:代码修正提示
crtl+D:向下复制一行
crtl+X:剪切当前行
ctrl+/:批量加入当行注释,再按一次就取消
ctrl+shift+/:批量加入多行注释,再按一次就取消
alt+shift+↗:上移当前行
alt+shift+↘:下移当前行
ctrl+alt+v:快速生成方法的返回值
数组
定义
int[] arr;
double[] arr;
char[] arr;
int arr[];
double arr[];
char arr[];
动态初始化
int[] arr = new int[3];
静态初始化
int[] arr = new int[]{11,22,33};
int[] arr2 = {44,55,66};
数组遍历
for(int x=0; x<arr.length; x++) {
System.out.println(arr[x]);
}
java中的内存分配
数组内存图
方法
方法没被调用时,都在方法区中的字节码文件(.class)中存储
方法被调用的时候,需要进入栈内存中运行
通用格式
public static 返回值类型 方法名(参数) {
方法体;
return 数据 ;
}
方法重载
多个方法在同一个类中
多个方法具有相同的方法名
多个方法的参数不相同,类型不同或者数量不同
public class MethodDemo {
public static void fn(int a) {
//方法体
}
public static int fn(double a) {
//方法体
}
}
public class MethodDemo {
public static float fn(int a) {
//方法体
}
public static int fn(int a , int b) {
//方法体
}
}
注意:
重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,换句话说不能通过返回值来判定两
个方法是否相互构成重载
位运算
public static void main(String[] args) {
System.out.println(6 & 2);
System.out.println(~6);
}
<< 有符号左移运算,二进制位向左移动, 左边符号位丢弃, 右边补齐0
运算规律: 向左移动几位, 就是乘以2的几次幂
(0)0000000 00000000 00000000 000011000 // 12的二进制
>> 有符号右移运算,二进制位向右移动, 使用符号位进行补位
运算规律: 向右移动几位, 就是除以2的几次幂
000000000 00000000 00000000 0000001(1) // 3的二进制
>>> 无符号右移运算符, 无论符号位是0还是1,都补0
010000000 00000000 00000000 00000110 // -6的二进制
System.out.println(12 << 1); // 24
System.out.println(12 << 2); // 48
^ 运算符的特点:一个数, 被另外一个数, 异或两次, 该数本身不变
数据交换
temp=a;
a=b;
b=temp;
a=a+b;
b=a-b;
a=a-b;
a=a^b;
b=a^b;
a=a^b;
二维数组
初始化
数据类型[][] 变量名 = new 数据类型[m][n];
int[][] arr = new int[3][3];
数据类型[][] 变量名 = { {元素1, 元素2...} , {元素1, 元素2...} ...};
int[][] arr = {{11,22,33}, {44,55,66}};
二维数组遍历
for (int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++){
sum += arr[i][j];
}