一、类的组成结构

Java类(.java文件)由两大核心要素构成:

public class Person {
    // 1. 属性(成员变量)
    String name;    // 姓名
    double height;  // 身高
    int age;        // 年龄

    // 2. 方法
    public void speak() { 
        System.out.println("正在说话"); 
    }
    
    public void run() { 
        System.out.println("正在跑步"); 
    }
    
    public int calculate(int a, int b) { 
        return a * b; 
    }
}

二、方法定义与调用

1. 基本语法
访问修饰符 返回值类型 方法名(参数列表) {
    // 方法体
    return 返回值; // 若返回值类型非void
}

示例

public int sum(int a, int b) {
    return a + b;
}
2. 调用方式
Person p = new Person();
int result = p.sum(5, 3); // 通过对象调用

三、构造方法

1. 定义格式
public class Person {
    public Person() { } // 无参构造
    
    public Person(String name, int age) { // 有参构造 作用:new对象时调用,给属性赋值
        this.name = name;
        this.age = age;
    }
}

2. 核心特性
特性说明
默认无参构造未定义任何构造方法时,编译器自动生成
有参构造覆盖无参构造若已定义有参构造,需显式添加无参构造才能使用

四、this关键字

1. 核心作用

    this可以理解为当前类的实例

  • this.属性 → 如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性而非形参
  • this.方法() → 调用当前类方法(通常可省略)
  • this() → 调用构造方法时必须显式的使用"this(形参列表)"的方式
2. 典型场景
​
public class Person {
    private String name;
    
    public Person(String name) {
        this.name = name; // 如果方法的形参和类的属性同名时,我们必须显式的使用"this.变量"的方式,表明此变量是属性而非形参
    }
    
    public void introduce() {
        System.out.println("我叫" + this.name); // 显式调用属性
    }
}

​

五、方法重载(Overload)

1. 定义原则

    一个类中方法名相同,方法的参数类型 和 个数不同(同名不同参)

2. 实用案例
public class AreaCalculator {
    // 计算圆面积
    public double calculate(double radius) {
        return Math.PI * radius * radius;
    }
    
    // 计算三角形面积
    public double calculate(double base, double height) {
        return base * height / 2;
    }
    
    // 计算矩形面积
    public double calculate(int width, int height) {
        return width * height;
    }
}

六、参数传递机制

类型数据类别传递内容方法内修改影响
值传递基本数据类型值副本❌ 不影响实参
引用传递对象类型对象地址副本✅ 影响到实参

示例对比


七、变量作用域

变量类型声明位置生命周期
局部变量方法/代码块内部方法/代码块执行期间
成员变量类内部,方法外部对象存在期间

八、static关键字

1. 静态变量特性
特性说明
类加载时初始化早于对象创建
在内存空间只有一份所有对象共享同一份数据
2. 与成员变量对比
特性静态变量成员变量
声明方式static修饰直接声明
访问方式类名.变量名、对象.变量名(不推荐)对象.变量名
数据共享性所有对象共享对象独享

代码示例

public class Counter {
    static int count = 0; // 静态变量
    int id;               // 成员变量
    
    public Counter() {
        count++;
        id = count;
    }
}
3、静态方法

静态方法是隶属于类的方法,而非隶属于对象,是 Java 工具类的核心组成部分。

3.1 静态方法的特点

  • ① 随着类的加载而加载,优先于对象存在,可通过类名.静态方法直接调用(推荐方式);
  • ② 静态方法中,只能调用静态的方法 / 属性;而非静态方法可调用静态 + 非静态的方法 / 属性;
  • ③ 同类中的静态方法之间,可直接通过方法名调用。

3.2 静态方法的语法

public class 类名 {
    访问修饰符 static 返回类型 方法名称([参数列表]) {
        // 方法体
    }
}

3.3 静态方法示例

public class Car {
    // 定义静态方法
    public static void init() {
        System.out.println("这是一个静态方法");
    }

    // 程序入口,测试静态方法调用
    public static void main(String[] args) {
        Car.init(); // 类名.方法名 调用(推荐)
        Car c = new Car();
        c.init(); // 对象调用(不推荐)
        init(); // 同类静态方法间直接调用
    }
}

3.4 静态方法实战练习:MathUtils 工具类

需求:创建 MathUtils 工具类,提供通用的数学运算功能(如求和、求最大值、求阶乘)。

public class MathUtils {
    // 私有构造方法,避免创建对象(工具类无需实例化)
    private MathUtils() {}

    // 静态方法:求两个整数的和
    public static int sum(int a, int b) {
        return a + b;
    }

    // 静态方法:求两个整数的最大值
    public static int max(int a, int b) {
        return a > b ? a : b;
    }

    // 静态方法:求n的阶乘
    public static long factorial(int n) {
        if (n < 0) {
            throw new IllegalArgumentException("阶乘参数不能为负数");
        }
        long result = 1;
        for (int i = 1; i <= n; i++) {
            result *= i;
        }
        return result;
    }

    // 测试
    public static void main(String[] args) {
        System.out.println("10+20=" + MathUtils.sum(10, 20)); // 30
        System.out.println("10和20的最大值:" + MathUtils.max(10, 20)); // 20
        System.out.println("5的阶乘:" + MathUtils.factorial(5)); // 120
    }
}

九、代码块

代码块是 Java 中用于初始化类 / 对象的特殊语法,无需显式调用,会在特定时机自动执行。

1 为什么需要代码块

以 JDBC 工具类为例:数据库连接的驱动、URL、用户名、密码等配置,需要在类加载时仅初始化一次,而非每次创建对象都初始化。如果用普通方法,需要手动调用且容易重复执行;而静态代码块可完美解决这个问题。

示例(JDBC 工具类):

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

public class JdbcUtils {
    // 静态属性:数据库连接参数
    private static String driver;
    private static String url;
    private static String username;
    private static String password;

    // 静态代码块:仅在类加载时执行一次,初始化连接参数
    static {
        try {
            Properties prop = new Properties();
            // 读取配置文件
            prop.load(JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"));
            // 赋值静态属性
            driver = prop.getProperty("driver");
            url = prop.getProperty("url");
            username = prop.getProperty("username");
            password = prop.getProperty("password");
            // 加载驱动
            Class.forName(driver);
        } catch (Exception e) {
            throw new RuntimeException("初始化JDBC配置失败", e);
        }
    }

    // 静态方法:获取数据库连接
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, username, password);
    }
}

配置文件jdbc.properties内容:

properties

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
username=root
password=123456

2 代码块的定义与作用

  • 定义:介于{}}之间的一段代码,无需显式调用;
  • 作用:用于初始化类的静态属性,或对象的实例属性。

3 代码块的分类

Java 代码块主要分为非静态代码块(构造代码块)静态代码块,核心区别如下表:

代码块类别简称定义核心特点执行特点
静态代码块静态块直接定义在类中,有 static 修饰隶属于类,与对象无关JVM 加载类时执行,仅执行一次
非静态代码块构造块直接定义在类中,无 static 修饰隶属于对象每次创建对象时执行,创建一次执行一次
3.1 非静态代码块(构造代码块)
核心特点
  1. 用于初始化对象的属性;
  2. 随对象创建而执行,每创建一个对象执行一次;
  3. 多个非静态代码块按声明先后顺序执行;
  4. 执行时机:在构造方法执行前执行。
示例
public class BlockTest {
    public static void main(String[] args) {
        // 创建两个Person对象,观察非静态代码块执行次数
        Person p1 = new Person();
        Person p2 = new Person();
    }
}

class Person {
    // 构造方法
    public Person() {
        System.out.println("hello, Person()");
    }

    // 非静态代码块1(后声明)
    {
        System.out.println("hello, block-2");
    }

    // 非静态代码块2(先声明)
    {
        System.out.println("hello, block-1");
    }
}
运行结果

plaintext

hello, block-2
hello, block-1
hello, Person()
hello, block-2
hello, block-1
hello, Person()
3.2 静态代码块
核心特点
  1. 用于初始化类的静态属性;
  2. 随类的加载而执行,仅执行一次
  3. 多个静态代码块按声明先后顺序执行;
  4. 执行时机:优先于非静态代码块和构造方法。
示例
public class BlockTest {
    public static void main(String[] args) {
        // 两次访问静态属性,观察静态代码块执行次数
        String desc1 = Person.desc;
        String desc2 = Person.desc;
    }
}

class Person {
    // 静态属性
    static String desc = "我是一个人";

    // 静态代码块1(后声明)
    static {
        System.out.println("hello, static block-2");
    }

    // 静态代码块2(先声明)
    static {
        System.out.println("hello, static block-1");
    }
}
运行结果

plaintext

hello, static block-2
hello, static block-1

4 代码块执行顺序练习(附答案)

题目

写出以下程序的运行结果:

public class Demo {
    // 静态代码块
    static {
        System.out.println("11111111111");
    }

    // 非静态代码块
    {
        System.out.println("22222222222");
    }

    // 构造方法
    public Demo() {
        System.out.println("33333333333");
    }

    public static void main(String[] args) {
        System.out.println("444444444444444");
        new Demo(); // 创建第一个Demo对象
        System.out.println("55555555555555");
        new Demo(); // 创建第二个Demo对象
    }
}
答案与解析

运行结果

plaintext

11111111111
444444444444444
22222222222
33333333333
55555555555555
22222222222
33333333333

执行顺序解析

  • 静态代码块:在类加载时执行(仅执行一次),多个静态代码块按代码书写顺序依次执行;
  • 非静态代码块:每次创建对象时,在构造方法执行前执行,多个非静态代码块也按代码书写顺序依次执行;
  • 构造方法:非静态代码块执行完毕后,才执行构造方法。
  1. JVM 加载 Demo 类 → 执行静态代码块 → 输出11111111111
  2. 执行 main 方法 → 输出444444444444444
  3. 创建第一个 Demo 对象 → 先执行非静态代码块(输出22222222222)→ 再执行构造方法(输出33333333333);
  4. 执行 main 方法后续代码 → 输出55555555555555
  5. 创建第二个 Demo 对象 → 再次执行非静态代码块(输出22222222222)→ 执行构造方法(输出33333333333)。
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐