1. Java类的基本概念与创建方法
Java作为一门面向对象的编程语言,"类"是其最基础的组成单元。一个Java类本质上是对现实世界中某种事物或概念的抽象描述,它定义了对象的属性和行为。在Java中创建类主要包含以下几个核心要素:
1.1 类的声明语法
每个Java类都需要使用class关键字进行声明,基本语法结构如下:
java复制[访问修饰符] class 类名 {
// 成员变量(属性)
// 构造方法
// 成员方法(行为)
}
访问修饰符可以是public、protected、private或者默认(不写),它决定了类的可见范围。类名应当使用大驼峰命名法(PascalCase),且最好能直观反映该类所代表的实体或功能。
1.2 类的组成元素
一个完整的Java类通常包含以下组成部分:
-
成员变量(Field):描述类的属性或状态,例如:
java复制private String name; // 学生姓名 private int age; // 学生年龄 -
构造方法(Constructor):用于创建类的实例对象,可以重载多个构造方法:
java复制public Student() {} // 无参构造 public Student(String name, int age) { // 带参构造 this.name = name; this.age = age; } -
成员方法(Method):定义类的行为或功能:
java复制public void study() { System.out.println(name + "正在学习"); }
1.3 类的实例化过程
创建类后,需要通过new关键字实例化对象:
java复制Student stu1 = new Student(); // 使用无参构造
Student stu2 = new Student("张三", 20); // 使用带参构造
实例化过程实际上完成了三件事:
- 在堆内存中分配对象空间
- 执行构造方法初始化对象
- 返回对象引用给变量
提示:良好的类设计应该遵循"单一职责原则",即一个类只负责一项明确的职责。避免创建"万能类"是Java开发中的重要实践。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Java类的分类体系
Java中的类可以根据不同标准进行分类,理解这些分类方式有助于我们更好地组织代码结构。
2.1 按功能用途分类
2.1.1 实体类(Entity Class)
实体类直接对应业务领域中的具体实体,通常包含属性和基本的getter/setter方法。例如:
java复制public class User {
private Long id;
private String username;
private String password;
// getters and setters
}
2.1.2 工具类(Utility Class)
工具类包含静态方法,提供各种通用功能。通常具有以下特点:
- 构造方法私有化(防止实例化)
- 所有方法都是静态的
- 类名常以Utils或Helper结尾
java复制public final class StringUtils {
private StringUtils() {} // 私有构造
public static boolean isEmpty(String str) {
return str == null || str.trim().length() == 0;
}
}
2.1.3 服务类(Service Class)
服务类包含业务逻辑,是应用程序的核心组成部分:
java复制public class UserService {
private UserRepository userRepo;
public User getUserById(Long id) {
return userRepo.findById(id);
}
}
2.2 按继承关系分类
2.2.1 基类/父类(Base Class)
作为其他类的父类,包含通用属性和方法:
java复制public abstract class Animal {
protected String name;
public abstract void makeSound();
}
2.2.2 子类(Subclass)
继承父类并扩展特定功能:
java复制public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("汪汪汪");
}
public void fetch() {
System.out.println(name + "正在捡球");
}
}
2.2.3 抽象类(Abstract Class)
包含抽象方法(无实现)的类,不能直接实例化:
java复制public abstract class Shape {
public abstract double calculateArea();
}
2.2.4 最终类(Final Class)
使用final修饰,禁止被继承:
java复制public final class MathUtils {
// 工具方法...
}
2.3 按可见性分类
- public类:可以被任何其他类访问
- protected类:仅限同一包内或子类访问
- private类:仅限外部类的内部使用(内部类)
- 默认(包私有)类:仅限同一包内访问
3. 特殊类型的Java类
3.1 内部类(Inner Class)
定义在另一个类内部的类,主要有四种形式:
3.1.1 成员内部类
java复制public class Outer {
private int x = 10;
class Inner {
void display() {
System.out.println("x is " + x);
}
}
}
3.1.2 静态内部类
java复制public class Outer {
static class StaticInner {
void display() {
System.out.println("Static inner");
}
}
}
3.1.3 方法局部内部类
java复制public class Outer {
void method() {
class LocalInner {
void display() {
System.out.println("Local inner");
}
}
new LocalInner().display();
}
}
3.1.4 匿名内部类
java复制interface Greeting {
void greet();
}
public class Test {
public static void main(String[] args) {
Greeting g = new Greeting() {
@Override
public void greet() {
System.out.println("Hello");
}
};
g.greet();
}
}
3.2 枚举类(Enum Class)
表示固定数量的常量集合:
java复制public enum Day {
MONDAY, TUESDAY, WEDNESDAY,
THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
枚举类可以包含字段、方法和构造方法:
java复制public enum Operation {
PLUS("+"), MINUS("-"), TIMES("*"), DIVIDE("/");
private final String symbol;
Operation(String symbol) {
this.symbol = symbol;
}
public String getSymbol() {
return symbol;
}
}
3.3 记录类(Record Class)
Java 14引入的预览特性,Java 16正式成为标准特性,用于简化不可变数据类的定义:
java复制public record Point(int x, int y) {
// 编译器自动生成:
// 1. final字段x和y
// 2. 全参构造
// 3. equals()/hashCode()
// 4. toString()
}
记录类适合用于DTO、值对象等场景。
3.4 密封类(Sealed Class)
Java 15引入的预览特性,Java 17成为标准特性,用于限制哪些类可以继承它:
java复制public sealed class Shape
permits Circle, Square, Rectangle {
// 基础实现
}
final class Circle extends Shape { /*...*/ }
final class Square extends Shape { /*...*/ }
final class Rectangle extends Shape { /*...*/ }
4. 类设计的最佳实践
4.1 封装性原则
良好的类设计应该遵循封装原则:
- 将字段设为private
- 通过public方法提供访问
- 对输入参数进行验证
java复制public class BankAccount {
private double balance;
public void deposit(double amount) {
if (amount <= 0) {
throw new IllegalArgumentException("金额必须大于0");
}
balance += amount;
}
public double getBalance() {
return balance;
}
}
4.2 不可变类设计
不可变类是指其实例创建后状态不能被修改的类,设计要点:
- 所有字段设为final
- 不提供setter方法
- 类本身声明为final
- 如果包含可变对象的引用,需要进行防御性拷贝
java复制public final class ImmutablePoint {
private final int x;
private final int y;
public ImmutablePoint(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() { return x; }
public int getY() { return y; }
}
4.3 构建器模式(Builder Pattern)
对于参数较多的类,推荐使用构建器模式:
java复制public class Computer {
private final String cpu;
private final String ram;
private final String storage;
private Computer(Builder builder) {
this.cpu = builder.cpu;
this.ram = builder.ram;
this.storage = builder.storage;
}
public static class Builder {
private String cpu;
private String ram;
private String storage;
public Builder cpu(String cpu) {
this.cpu = cpu;
return this;
}
public Computer build() {
return new Computer(this);
}
}
}
// 使用方式
Computer comp = new Computer.Builder()
.cpu("Intel i7")
.ram("16GB")
.storage("512GB SSD")
.build();
4.4 单例模式实现
确保类只有一个实例的几种实现方式:
4.4.1 饿汉式
java复制public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
4.4.2 懒汉式(线程安全)
java复制public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
4.4.3 枚举实现(推荐)
java复制public enum Singleton {
INSTANCE;
public void doSomething() {
// 业务方法
}
}
5. 类的高级特性与技巧
5.1 泛型类
使用泛型可以创建类型安全的类:
java复制public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
// 使用
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello");
5.2 注解处理
自定义注解并处理:
java复制@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Author {
String name();
String date();
}
@Author(name = "John", date = "2023-01-01")
public class MyClass {
// 类实现
}
5.3 反射操作类
通过反射动态操作类:
java复制Class<?> clazz = Class.forName("com.example.MyClass");
Object instance = clazz.newInstance();
Method method = clazz.getMethod("methodName", String.class);
method.invoke(instance, "argument");
5.4 类加载机制
理解类的加载过程:
- 加载:查找并加载类的二进制数据
- 验证:确保被加载类的正确性
- 准备:为类的静态变量分配内存并初始化默认值
- 解析:将符号引用转换为直接引用
- 初始化:执行类构造器
()方法
注意事项:在大型项目中,合理的类组织结构和包划分同样重要。建议按照功能模块划分包结构,避免将所有类都放在同一个包中。
