当前位置: 首页 > java >正文

Java学习笔记(对象)

一、对象本质

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

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

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

对象的三大特性:​

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

二、对象生命周期 

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

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

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

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

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

Person person = new Person(); 

(二)内存存储结构

区域

存储内容

特点

栈内存

引用变量

线程私有,自动释放

堆内存

对象实例

线程共享,GC 管理

方法区

类信息 / 静态变量

共享,存储元数据

(三)对象销毁机制 

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

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

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

三、核心应用

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

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

@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 ()​

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

class ShallowClone implements Cloneable {int[] array = new int[5];@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
}

四、高级特性

(一)反射机制操作对象

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

(二)代理模式增强对象

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
);

(三)对象序列化规范

class SerializableObject implements Serializable {private static final long serialVersionUID = 1L;transient String sensitiveInfo;
}

http://www.xdnf.cn/news/5341.html

相关文章:

  • 游戏引擎学习第272天:显式移动转换
  • app加固
  • Vue.js 页面切换空白与刷新 404 问题深度解析
  • 《智能网联汽车 自动驾驶功能道路试验方法及要求》 GB/T 44719-2024——解读
  • 视频编解码学习三之显示器续
  • 鸿蒙跨平台开发教程之Uniapp布局基础
  • LWIP的ICMP协议
  • 小刚说C语言刷题—1058 - 求出100至999范围内的所有水仙花数
  • 每日算法刷题 Day3 5.11:leetcode数组2道题,用时1h(有点慢)
  • UE5定序器中摇臂挂载摄像机 让摄像机始终朝向目标
  • CDGP数据治理主观题评分标准与得分策略
  • 杆件的拉伸与压缩变形
  • 海康相机无损压缩
  • 深入浅出之STL源码分析2_类模版
  • 向前传播(forward)和反向传播
  • vue vite 无法热更新问题
  • navicat112_premium_cs_x64.exe PatchNavicat.exe
  • 【Text2reward】关于general.py与specific.py的区别的咨询笔记
  • Helix:一种用于通用人形控制的视觉语言行动模型
  • OrangePi Zero 3学习笔记(Android篇)5 - usbutils编译(更新lsusb)
  • KEIL_C51和KEIL_MDK共存
  • 批量导出docker镜像
  • JAVA练习题(2) 找素数
  • Openai开源的对文本进行Token编码、解码的库:Tiktoken 库
  • 【Linux系统编程】进程属性--标识符
  • MySql 年,月,日 查询 某时间段的 日期列表
  • Yocto中`${S}`和`${WORKDIR}`的联系与区别
  • C++(5):有符号整数和无符号整数差异
  • RAG 赋能客服机器人:多轮对话与精准回复
  • C++STL——stack,queue