基础语法
基本数据类型
基本数据类型是 Java 内置的、最简单的数据存储形式,直接存储在栈内存中。
| 数据类型 | 大小 | 默认值 | 取值范围 | 说明 |
|---|
| byte | 1字节 | 0 | -128 ~ 127 | 最小整数类型 |
| short | 2字节 | 0 | -32,768 ~ 32,767 | 短整数 |
| int | 4字节 | 0 | -2³¹ ~ 2³¹-1 (-21亿~21亿) | 最常用的整数类型 |
| long | 8字节 | 0L | -2⁶³ ~ 2⁶³-1 | 长整数(需加 L/l 后缀) |
| float | 4字节 | 0.0f | 单精度浮点数 | 需加 F/f 后缀 |
| double | 8字节 | 0.0d | 双精度浮点数 | 默认的浮点数类型 |
| char | 2字节 | '\u0000' | 0 ~ 65,535 | Unicode 字符 |
| boolean | 1位 | false | true / false | 布尔值(大小无明确定义) |
@Test
void test() {
int i = 100000;
long l = 10000000000L;
float f = 3.14f;
double d = 3.1415926;
char c1 = 'A';
char c2 = '\u0041';
char c3 = 65;
boolean flag = true;
}
引用数据类型
引用数据类型存储的是对象的引用(地址) ,实际对象存储在堆内存中。
| 类型 | 说明 | 示例 |
|---|
| 类(Class) | 自定义的类 | String, Person, ArrayList |
| 接口(Interface) | 抽象的行为规范 | List, Runnable, Comparable |
| 数组(Array) | 同一类型数据的集合 | int[], String[] |
| 枚举(Enum) | 有限的常量集合 | enum Color { RED, GREEN, BLUE } |
| 注解(Annotation) | 元数据标记 | @Override, @Deprecated |
Person person = new Person("张三", 25);
String str = "Hello";
int[] numbers = {1, 2, 3, 4, 5};
String[] names = new String[3];
List<String> list = new ArrayList<>();
Person p = null;
Person p1 = new Person("李四", 30);
Person p2 = p1;
p2.setAge(31);
System.out.println("p1 age: " + p1.getAge());
public class ReferenceDemo {
public static void main(String[] args) {
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java");
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1.equals(s3));
int[] arr1 = {1, 2, 3};
int[] arr2 = {1, 2, 3};
int[] arr3 = arr1;
System.out.println(arr1 == arr2);
System.out.println(arr1 == arr3);
System.out.println(Arrays.equals(arr1, arr2));
int num = 10;
modifyValue(num);
System.out.println("After modifyValue: " + num);
int[] array = {1, 2, 3};
modifyArray(array);
System.out.println("After modifyArray: " + array[0]);
}
static void modifyValue(int x) {
x = 100;
}
static void modifyArray(int[] arr) {
arr[0] = 100;
}
}
| 特性 | 基本数据类型 | 引用数据类型 |
|---|
| 存储位置 | 栈内存 | 堆内存(对象),栈内存(引用) |
| 存储内容 | 实际值 | 对象的引用(地址) |
| 默认值 | 有(如 int=0) | null |
| 内存占用 | 固定(根据类型) | 不固定(对象大小) |
| 比较方式 | == 比较值 | == 比较引用地址,equals()比较内容 |
| 参数传递 | 传值(不影响原变量) | 传引用(影响原对象) |
| GC 管理 | 不需要 | 由垃圾回收器管理 |
int[] arr = new int[5];
log.info("arr:{}", arr[0]);
String[] arr1 = new String[5];
log.info("arr1:{}", arr1[0]);
== 和 equals()
| 比较项 | == 运算符 | equals() 方法 |
|---|
| 类型 | Java运算符 | Object类的方法 |
| 比较内容 | 比较两个对象的内存地址 | 比较两个对象的内容是否相等 |
| 适用范围 | 基本类型和引用类型 | 只能用于引用类型 |
| 默认实现 | 无(语言特性) | Object类中的实现就是== |
| 可重写性 | 不能重写 | 可以被子类重写, 若不重写,比较的也是地址。 |
int a = 10;
int b = 10;
System.out.println("int == int: " + (a == b));
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println("s1 == s2: " + (s1 == s2));
String s3 = "World";
String s4 = s3;
System.out.println("s3 == s4: " + (s3 == s4));
String s5 = "Java";
String s6 = "Java";
System.out.println("s5 == s6: " + (s5 == s6));
public class Object {
public boolean equals(Object obj) {
return (this == obj);
}
}
- String类的重写实现equals方法,使得String类
equals 比较时只比较内容。
String str1 = new String("Hello");
String str2 = new String("Hello");
String str3 = "Hello";
String str4 = "World";
System.out.println("str1.equals(str2): " + str1.equals(str2));
System.out.println("str1.equals(str3): " + str1.equals(str3));
System.out.println("str1.equals(str4): " + str1.equals(str4));
Integer num1 = new Integer(100);
Integer num2 = new Integer(100);
Integer num3 = 100;
System.out.println("\nInteger比较:");
System.out.println("num1 == num2: " + (num1 == num2));
System.out.println("num1.equals(num2): " + num1.equals(num2));
System.out.println("num2.equals(num3): " + num2.equals(num3));
- 包装类一般都
重写equals方法,若不重写,调用Object类中的equals方法,就是在比较地址。但是我们希望内容相同的类应该是相等的!
class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
}
public class WithoutOverrideEquals {
public static void main(String[] args) {
Person p1 = new Person("张三", 20);
Person p2 = new Person("张三", 20);
System.out.println("p1 == p2: " + (p1 == p2));
System.out.println("p1.equals(p2): " + p1.equals(p2));
}
}
基础语法
int year = 2024;
if (year % 4 == 0) {
if (year % 100 != 0 || year % 400 == 0) {
System.out.println(year + "年是闰年");
} else {
System.out.println(year + "年不是闰年");
}
} else {
System.out.println(year + "年不是闰年");
}
int a = 10, b = 20;
int max = (a > b) ? a : b;
System.out.println("最大值: " + max);
boolean hasTicket = true;
boolean hasID = true;
int personAge = 16;
if (hasTicket && hasID && personAge >= 18) {
System.out.println("可以进入");
} else {
System.out.println("不符合进入条件");
}
- switch 语句[同
js]
- 循环语句 for循环 while循环。 多层循环跳出:使用标签break/continue[同
js]
for (int i = 0; i < 5; i++) {
System.out.println("i = " + i);
}
List<String> list = new ArrayList<>();
list.add("Java");
list.add("Python");
list.add("C++");
System.out.println("List遍历:");
for (int i = 0; i < list.size(); i++) {
System.out.println("索引" + i + ": " + list.get(i));
}
System.out.print("增强for循环: ");
for (String item : list) {
System.out.print(item + " ");
}
System.out.println();
System.out.print("迭代器遍历: ");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
System.out.println();
System.out.print("forEach方法: ");
list.forEach(item -> System.out.print(item + " "));
System.out.println();
Set<Integer> set = new HashSet<>();
set.add(10);
set.add(20);
set.add(30);
set.add(10);
System.out.println("\nSet遍历(无序):");
for (Integer num : set) {
System.out.print(num + " ");
}
System.out.println();
Map<String, Integer> map = new HashMap<>();
map.put("Alice", 25);
map.put("Bob", 30);
map.put("Charlie", 28);
System.out.println("\nMap遍历:");
System.out.println("遍历EntrySet:");
for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
System.out.println("\n遍历KeySet:");
for (String key : map.keySet()) {
System.out.println("Key: " + key + ", Value: " + map.get(key));
}
System.out.println("\n遍历Values:");
for (Integer value : map.values()) {
System.out.print(value + " ");
}
System.out.println();
System.out.println("\nforEach遍历:");
map.forEach((key, value) ->
System.out.println(key + " -> " + value));
包装类
| 基本类型 | 包装类 | 示例 |
|---|
| int | Integer | Integer i = 100; |
| long | Long | Long l = 100L; |
| float | Float | Float f = 3.14f; |
| double | Double | Double d = 3.14; |
| boolean | Boolean | Boolean flag = true; |
自动装箱/拆箱
Integer i1 = 100;
Double d1 = 3.14;
int num = i1;
double value = d1;
log.info("num:{}, value:{}", num, value);
Integer i2 = 200;
int intValue = i2.intValue();
log.info("intValue:{}", intValue);
String str = "123";
int numFromStr = Integer.parseInt(str);
Integer integerFromStr = Integer.valueOf(str);
log.info("numFromStr:{}, integerFromStr:{}", numFromStr, integerFromStr);
Integer a = 127;
Integer b = 127;
System.out.println(a == b);
Integer c = 128;
Integer d = 128;
System.out.println(c == d);
System.out.println(c.equals(d));
Java 类
类的完整结构:
[修饰符] class 类名 {
[修饰符] 数据类型 属性名 [= 初始值];
[修饰符] 返回值类型 方法名(参数列表) {
}
[修饰符] 类名(参数列表) {
}
{
}
static {
}
[修饰符] class 内部类名 {
}
}
属性(成员变量)
- 定义类的状态或特征
- 有默认值(基本类型有默认值,引用类型为null)
public class Person {
private String name;
protected int age;
public String gender;
public static String species = "Human";
public static final double PI = 3.14159;
private final String ID;
private int score = 100;
private Date birthday = new Date();
}
方法(成员方法)
- 定义对象的行为或功能
- 可以重载(overload)
- 可以重写(override,继承时)
- 重载(Overloading) vs 重写(Overriding)详解
| 特性 | 重载(Overloading) | 重写(Overriding) |
|---|
| 定义 | 同一个类中,方法名相同,参数列表不同 | 子类重新定义父类中已有的方法 |
| 位置 | 同一个类中 | 子类中 |
| 方法签名 | 必须不同(参数类型、个数、顺序) | 必须相同 |
| 返回值 | 可以不同 | 必须兼容(相同或是协变) |
| 访问权限 | 可以不同 | 不能更严格(可以更宽松) |
| 异常 | 可以不同 | 不能抛出更宽泛的检查异常 |
| 静态性 | 可以是静态或非静态 | 不能是静态(必须是实例方法) |
| 绑定 | 编译时绑定(静态绑定) | 运行时绑定(动态绑定) |
| 目的 | 增加方法的功能性 | 修改或扩展父类行为 |
| 关键词 | 无特殊关键词 | @Override 注解(可选但推荐) |
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int add(int a, int b, int c) {
return a + b + c;
}
public double add(double a, double b) {
return a + b;
}
public void printInfo(String name, int age) {
System.out.println("姓名: " + name + ", 年龄: " + age);
}
public void printInfo(int age, String name) {
System.out.println("年龄: " + age + ", 姓名: " + name);
}
}
public class Person {
private String name;
private int age;
private String address;
public Person() {
this.name = "Unknown";
this.age = 0;
}
public Person(String name) {
this.name = name;
this.age = 0;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public Person(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
}
面向对象三大特征
封装性
封装是把对象的属性和行为包装在一起,并对外隐藏实现细节,只暴露必要的接口。
- 使用
private 修饰属性, 内部实现对外不可见
- 提供
public 的 getter/setter 方法,通过方法访问和修改数据
继承性
继承是从已有的类派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力。
- 使用
extends 关键字, 子类复用父类的代码,子类可以添加新的属性和方法
- 单继承(Java只支持单继承)
- 使用
super 调用父类成员
多态性
多态是指同一个行为具有多个不同表现形式的能力。同一个接口,使用不同的实例而执行不同操作。
- 父类引用指向子类对象
- 继承 + 方法重写
- 接口实现
执行机制:编译时看父类,运行时看子类。
Animal animal = new Dog();
animal.eat();
animal.bark();
Animal animal1 = new Dog();
Animal animal2 = new Cat();
animal1.eat();
animal2.eat();
public interface Payment {
void pay(double amount);
boolean refund(double amount);
default void printPaymentInfo() {
System.out.println("支付接口");
}
static double calculateFee(double amount) {
return amount * 0.01;
}
}
public class AlipayPayment implements Payment {
private String account;
private double balance;
public AlipayPayment(String account, double balance) {
this.account = account;
this.balance = balance;
}
@Override
public void pay(double amount) {
if (amount <= balance) {
balance -= amount;
System.out.println("支付宝支付成功: " + amount + "元");
System.out.println("账户: " + account + ", 余额: " + balance);
} else {
System.out.println("支付宝余额不足");
}
}
@Override
public boolean refund(double amount) {
balance += amount;
System.out.println("支付宝退款: " + amount + "元");
return true;
}
public void transfer(String toAccount, double amount) {
System.out.println("向 " + toAccount + " 转账 " + amount + "元");
}
}
public class WechatPayment implements Payment{
private String openId;
private double balance;
public WechatPayment(String openId, double balance) {
this.openId = openId;
this.balance = balance;
}
@Override
public void pay(double amount) {
if (amount <= balance) {
balance -= amount;
System.out.println("微信支付成功: " + amount + "元");
System.out.println("用户: " + openId + ", 余额: " + balance);
} else {
System.out.println("微信余额不足");
}
}
@Override
public boolean refund(double amount) {
balance += amount;
System.out.println("微信退款: " + amount + "元");
return true;
}
@Override
public void printPaymentInfo() {
System.out.println("微信支付 - 便捷支付方式");
}
public void sendRedPacket(double amount) {
System.out.println("发送红包: " + amount + "元");
}
}
@Test
public void test2(){
System.out.println("\n=== 支付系统(接口多态)===");
Payment[] payments = new Payment[2];
payments[0] = new AlipayPayment("zhangsan@alipay.com", 1000);
payments[1] = new WechatPayment("wx123456789", 800);
for (Payment payment : payments) {
System.out.println("\n--- 使用" + payment.getClass().getSimpleName() + " ---");
payment.printPaymentInfo();
payment.pay(200);
double fee = Payment.calculateFee(200);
System.out.println("手续费: " + fee);
payment.transfer("lisi", 10);
}
new AlipayPayment("zhangsan@alipay.com", 1000).transfer("lisi", 10);
}
修饰符
final 修饰符
- final 修饰类: 禁止继承,防止被其他类扩展。
final class StringUtils {
public static boolean isEmpty(String str) {
return str == null || str.trim().isEmpty();
}
}
class Parent {
public final void cannotOverride() {
System.out.println("这是final方法,不能被重写");
}
public void canOverride() {
System.out.println("可以被重写的方法");
}
}
class Child extends Parent {
@Override
public void canOverride() {
System.out.println("子类重写的方法");
}
}
- final 修饰变量: 一旦赋值后,就不能再修改(成为常量)。
private final String id = "bwf";
static 修饰符
static成员(方法和属性)属于类本身,而不是对象。
| 访问方式 | 类访问 | 对象访问 | 推荐方式 |
|---|
| static属性 | ✅ 可以 | ⚠️ 可以(不推荐) | 类名.属性 |
| static方法 | ✅ 可以 | ⚠️ 可以(不推荐) | 类名.方法 |
| 非static属性 | ❌ 不能 | ✅ 可以 | 对象.属性 |
| 非static方法 | ❌ 不能 | ✅ 可以 | 对象.方法 |
接口 vs 抽象类
| 特性 | 抽象类(Abstract Class) | 接口(Interface) |
|---|
| 定义关键字 | abstract class | interface |
| 继承/实现 | 使用 extends 继承 | 使用 implements 实现 |
| 多重继承 | ❌ 不支持(单继承) | ✅ 支持(多实现) |
| 构造器 | ✅ 可以有 | ❌ 不能有 |
| 成员变量 | 任意访问修饰符 | 默认 public static final |
| 方法实现 | 可以有具体方法 | Java 8前不能有,Java 8+可以有默认方法 |
| 方法修饰符 | 任意访问修饰符 | 默认 public abstract |
| 设计目的 | 代码复用,模板方法 | 定义契约,解耦 |
| 设计层次 | "IS-A" 关系(是什么) | "CAN-DO" 关系(能做什么) |
| 使用场景 | 紧密相关的类,共享代码 | 不同体系的类,定义能力 |
abstract class Animal {
protected String name;
private int age;
public static final String TYPE = "动物";
public Animal(String name) {
this.name = name;
}
public abstract void makeSound();
public void eat() {
System.out.println(name + " 正在吃东西");
}
public static void printType() {
System.out.println("类型: " + TYPE);
}
private void internalMethod() {
}
}
interface Flyable {
int MAX_HEIGHT = 10000;
void fly();
default void glide() {
System.out.println("滑翔中...");
}
static void printMaxHeight() {
System.out.println("最大飞行高度: " + MAX_HEIGHT + "米");
}
private void log(String message) {
System.out.println("日志: " + message);
}
}