Appearance
基础语法
Java 是一种强类型、面向对象的编程语言,具有跨平台、安全性高等特点。
第一个 Java 程序
java
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}编译和运行:
bash
javac HelloWorld.java // 编译
java HelloWorld // 运行变量与数据类型
基本数据类型
java
// 整数类型
byte b = 127; // 1字节,-128 到 127
short s = 32767; // 2字节
int i = 2147483647; // 4字节(默认)
long l = 9223372036854775807L; // 8字节,需要 L 后缀
// 浮点类型
float f = 3.14f; // 4字节,需要 f 后缀
double d = 3.141592653; // 8字节(默认)
// 字符类型
char c = 'A'; // 2字节,Unicode 字符
char c2 = '\u0041'; // Unicode 编码
// 布尔类型
boolean bool = true; // true 或 false引用数据类型
java
// 字符串
String name = "张三";
// 数组
int[] numbers = {1, 2, 3, 4, 5};
// 对象
Person person = new Person();变量声明
java
// 声明并初始化
int age = 25;
String name = "李四";
// 先声明后赋值
double salary;
salary = 5000.0;
// 同时声明多个变量
int x = 1, y = 2, z = 3;
// 使用 var 关键字(Java 10+)
var message = "Hello"; // 自动推断为 String
var count = 100; // 自动推断为 int常量
java
// 使用 final 关键字声明常量
final double PI = 3.14159;
final int MAX_SIZE = 100;
// 常量命名规范:全大写,单词间用下划线
final String APP_NAME = "MyApp";类型转换
自动类型转换
java
// 小类型到大类型自动转换
byte b = 127;
int i = b; // byte -> int
long l = i; // int -> long
float f = l; // long -> float
double d = f; // float -> double
// char -> int
char c = 'A';
int code = c; // 65强制类型转换
java
// 大类型到小类型需要强制转换
double d = 3.14159;
int i = (int) d; // 3,精度丢失
long l = 1000L;
int j = (int) l; // 1000
// 注意溢出问题
int big = 130;
byte b = (byte) big; // -126(溢出)字符串转换
java
// 其他类型转字符串
String s1 = String.valueOf(123); // "123"
String s2 = String.valueOf(3.14); // "3.14"
String s3 = String.valueOf(true); // "true"
String s4 = 123 + ""; // "123"
// 字符串转其他类型
int num = Integer.parseInt("123"); // 123
double d = Double.parseDouble("3.14"); // 3.14
boolean bool = Boolean.parseBoolean("true"); // true运算符
算术运算符
java
int a = 10, b = 3;
System.out.println(a + b); // 13 加
System.out.println(a - b); // 7 减
System.out.println(a * b); // 30 乘
System.out.println(a / b); // 3 整数除法
System.out.println(a % b); // 1 取余
// 自增/自减
int x = 5;
System.out.println(x++); // 5(先返回后加)
System.out.println(x); // 6
System.out.println(++x); // 7(先加后返回)赋值运算符
java
int x = 10;
x += 5; // x = x + 5 -> 15
x -= 3; // x = x - 3 -> 12
x *= 2; // x = x * 2 -> 24
x /= 4; // x = x / 4 -> 6
x %= 4; // x = x % 4 -> 2比较运算符
java
int a = 5, b = 10;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a > b); // false
System.out.println(a < b); // true
System.out.println(a >= 5); // true
System.out.println(a <= 5); // true
// 字符串比较
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1 == s2); // true(字符串常量池)
System.out.println(s1 == s3); // false(不同对象)
System.out.println(s1.equals(s3)); // true(内容相同)字符串比较
在 Java 中,== 比较的是引用地址,equals() 比较的是内容。字符串比较应使用 equals() 方法。
逻辑运算符
java
boolean a = true, b = false;
// 与(AND)
System.out.println(a && b); // false
System.out.println(a && a); // true
// 或(OR)
System.out.println(a || b); // true
System.out.println(b || b); // false
// 非(NOT)
System.out.println(!a); // false
System.out.println(!b); // true
// 短路求值
int x = 5;
boolean result = (x > 10) && (x++ > 0);
System.out.println(x); // 5(短路,x++ 未执行)三元运算符
java
int age = 18;
String status = age >= 18 ? "成年" : "未成年";
System.out.println(status); // "成年"
// 嵌套使用
int score = 85;
String grade = score >= 90 ? "A" :
score >= 80 ? "B" :
score >= 60 ? "C" : "D";位运算符
java
int a = 5; // 0101
int b = 3; // 0011
System.out.println(a & b); // 1 (0001) 按位与
System.out.println(a | b); // 7 (0111) 按位或
System.out.println(a ^ b); // 6 (0110) 按位异或
System.out.println(~a); // -6 按位取反
System.out.println(a << 1); // 10 (1010) 左移
System.out.println(a >> 1); // 2 (0010) 右移
System.out.println(a >>> 1); // 2 无符号右移控制流程
条件语句
if...else
java
int score = 85;
if (score >= 90) {
System.out.println("优秀");
} else if (score >= 80) {
System.out.println("良好");
} else if (score >= 60) {
System.out.println("及格");
} else {
System.out.println("不及格");
}switch
java
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
default:
System.out.println("其他");
}
// Java 14+ 新语法
String result = switch (day) {
case 1 -> "星期一";
case 2 -> "星期二";
case 3 -> "星期三";
default -> "其他";
};循环语句
for
java
// 基本循环
for (int i = 0; i < 5; i++) {
System.out.println(i);
}
// 增强型 for 循环(for-each)
int[] numbers = {1, 2, 3, 4, 5};
for (int num : numbers) {
System.out.println(num);
}while
java
int i = 0;
while (i < 5) {
System.out.println(i);
i++;
}do...while
java
int i = 0;
do {
System.out.println(i);
i++;
} while (i < 5);break 和 continue
java
// break - 跳出循环
for (int i = 0; i < 10; i++) {
if (i == 5) break;
System.out.println(i);
}
// 输出: 0, 1, 2, 3, 4
// continue - 跳过当前迭代
for (int i = 0; i < 10; i++) {
if (i % 2 == 0) continue;
System.out.println(i);
}
// 输出: 1, 3, 5, 7, 9
// 带标签的 break
outer:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) break outer;
System.out.println(i + ", " + j);
}
}数组
数组声明与初始化
java
// 声明
int[] arr1;
int arr2[];
// 静态初始化
int[] arr3 = {1, 2, 3, 4, 5};
String[] names = {"张三", "李四", "王五"};
// 动态初始化
int[] arr4 = new int[5]; // 默认值为 0
String[] arr5 = new String[3]; // 默认值为 null
// 先声明后初始化
int[] arr6;
arr6 = new int[]{1, 2, 3};数组操作
java
int[] arr = {1, 2, 3, 4, 5};
// 访问元素
System.out.println(arr[0]); // 1
arr[0] = 10; // 修改元素
// 数组长度
System.out.println(arr.length); // 5
// 遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
// for-each 遍历
for (int num : arr) {
System.out.println(num);
}多维数组
java
// 二维数组
int[][] matrix = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};
// 访问元素
System.out.println(matrix[0][0]); // 1
System.out.println(matrix[1][2]); // 6
// 动态创建
int[][] arr = new int[3][4]; // 3行4列
// 遍历
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[i].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println();
}数组工具类
java
import java.util.Arrays;
int[] arr = {5, 2, 8, 1, 9};
// 排序
Arrays.sort(arr); // [1, 2, 5, 8, 9]
// 二分查找(需要先排序)
int index = Arrays.binarySearch(arr, 5); // 2
// 填充
int[] arr2 = new int[5];
Arrays.fill(arr2, 100); // [100, 100, 100, 100, 100]
// 复制
int[] copy = Arrays.copyOf(arr, arr.length);
// 转字符串
System.out.println(Arrays.toString(arr)); // [1, 2, 5, 8, 9]方法
方法定义
java
public class Calculator {
// 无返回值方法
public void printHello() {
System.out.println("Hello!");
}
// 有返回值方法
public int add(int a, int b) {
return a + b;
}
// 带默认值的方法(方法重载)
public int add(int a, int b, int c) {
return a + b + c;
}
// 可变参数
public int sum(int... numbers) {
int total = 0;
for (int num : numbers) {
total += num;
}
return total;
}
}方法调用
java
Calculator calc = new Calculator();
calc.printHello(); // 调用无返回值方法
int result = calc.add(5, 3); // 8
int result2 = calc.add(1, 2, 3); // 6
int result3 = calc.sum(1, 2, 3, 4); // 10方法重载
java
// 方法名相同,参数列表不同
public class Math {
public int max(int a, int b) {
return a > b ? a : b;
}
public double max(double a, double b) {
return a > b ? a : b;
}
public int max(int a, int b, int c) {
return max(max(a, b), c);
}
}输入输出
控制台输出
java
System.out.println("Hello"); // 换行输出
System.out.print("Hello"); // 不换行输出
System.out.printf("年龄: %d, 姓名: %s%n", 25, "张三"); // 格式化输出
// 格式化符号
// %d - 整数
// %f - 浮点数
// %s - 字符串
// %c - 字符
// %b - 布尔值
// %n - 换行控制台输入
java
import java.util.Scanner;
Scanner scanner = new Scanner(System.in);
System.out.print("请输入姓名: ");
String name = scanner.nextLine();
System.out.print("请输入年龄: ");
int age = scanner.nextInt();
System.out.print("请输入工资: ");
double salary = scanner.nextDouble();
System.out.printf("姓名: %s, 年龄: %d, 工资: %.2f%n", name, age, salary);
scanner.close(); // 关闭 Scanner注释
java
// 单行注释
/*
* 多行注释
* 可以跨越多行
*/
/**
* 文档注释
* 用于生成 API 文档
* @param name 姓名
* @return 问候语
*/
public String greet(String name) {
return "Hello, " + name;
}实践示例
java
import java.util.Scanner;
public class StudentManager {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("请输入学生人数: ");
int count = scanner.nextInt();
String[] names = new String[count];
int[] scores = new int[count];
for (int i = 0; i < count; i++) {
System.out.print("请输入第 " + (i + 1) + " 个学生的姓名: ");
names[i] = scanner.next();
System.out.print("请输入第 " + (i + 1) + " 个学生的成绩: ");
scores[i] = scanner.nextInt();
}
System.out.println("\n学生成绩表:");
System.out.println("序号\t姓名\t成绩\t等级");
System.out.println("----------------------------");
int total = 0;
int max = scores[0];
int min = scores[0];
for (int i = 0; i < count; i++) {
String grade = getGrade(scores[i]);
System.out.printf("%d\t%s\t%d\t%s%n", i + 1, names[i], scores[i], grade);
total += scores[i];
if (scores[i] > max) max = scores[i];
if (scores[i] < min) min = scores[i];
}
System.out.println("----------------------------");
System.out.printf("平均分: %.2f%n", (double) total / count);
System.out.println("最高分: " + max);
System.out.println("最低分: " + min);
scanner.close();
}
public static String getGrade(int score) {
if (score >= 90) return "优秀";
if (score >= 80) return "良好";
if (score >= 60) return "及格";
return "不及格";
}
}