Java学习笔记(对象)

一、对象本质

状态(State):通过成员变量(Field)描述

行为(Behavior):通过成员方法(Method)实现

java 复制代码
class Person {
    String name;
    int age;
    void eat() {
        System.out.println(name + "正在吃饭");
    }
}

对象的三大特性:​

  1. 封装性:将数据和操作封装成独立单元
  1. 继承性:通过extends实现代码复用
  1. 多态性:父类引用指向子类对象的动态特性

二、对象生命周期

(一)对象创建的四个阶段

类加载检查:JVM 检查是否已加载该类的字节码​

内存分配:在堆内存中划分存储区域(TLAB 优化机制)​

初始化零值:基本类型赋默认值(int=0,boolean=false)​

执行初始化:构造方法执行前的显式初始化

java 复制代码
Person person = new Person(); 

(二)内存存储结构

|-----|------------|------------|
| 区域 | 存储内容 | 特点 |
| 栈内存 | 引用变量 | 线程私有,自动释放 |
| 堆内存 | 对象实例 | 线程共享,GC 管理 |
| 方法区 | 类信息 / 静态变量 | 共享,存储元数据 |

(三)对象销毁机制

引用计数法:循环引用问题无法解决​

可达性分析:通过 GC Roots 标记可回收对象​

finalize () 方法:对象销毁前的最后回调机会

三、核心应用

(一)构造方法的深度运用

java 复制代码
class Student {
    private String name;
    private int age;
    public Student() {}
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public Student(String name) {
        this(name, 18);
    }
}

(二)对象比较的正确姿势

== 运算符:比较引用地址(基本类型比较值)​

equals () 方法:建议重写实现内容比较​

hashCode () 契约:重写 equals 必须重写 hashCode

java 复制代码
@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    Student student = (Student) o;
    return age == student.age && Objects.equals(name, student.name);
}

@Override
public int hashCode() {
    return Objects.hash(name, age);
}

(三)对象克隆的实现方式

浅克隆:实现 Cloneable 接口,重写 clone ()​

深克隆:通过序列化 / 反序列化实现对象复制

java 复制代码
class ShallowClone implements Cloneable {
    int[] array = new int[5];
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

四、高级特性

(一)反射机制操作对象

java 复制代码
Class<?> clazz = Class.forName("com.example.Person");
Person person = (Person) clazz.getDeclaredConstructor().newInstance();
Method method = clazz.getDeclaredMethod("privateMethod");
method.setAccessible(true);
method.invoke(person);

(二)代理模式增强对象

java 复制代码
InvocationHandler handler = (proxy, method, args) -> {
    System.out.println("前置处理");
    Object result = method.invoke(target, args);
    System.out.println("后置处理");
    return result;
};
Service proxy = (Service) Proxy.newProxyInstance(
    ClassLoader.getSystemClassLoader(),
    new Class[]{Service.class},
    handler
);

(三)对象序列化规范

java 复制代码
class SerializableObject implements Serializable {
    private static final long serialVersionUID = 1L;
    transient String sensitiveInfo;
}
相关推荐
panxianren6 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
“AI国潮设计-小江”8 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人8 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
sunshine22 girl8 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
省钱兄--zs8 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang9 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl9 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat10 小时前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
菜鸟~noob23310 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
惊讶的猫11 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python