从对象模型到构造器,夯实 OOP 的第一层基础
本页聚焦「类与对象」核心概念,覆盖对象创建过程、构造器、this/super、值传递等高频考点。
概念:
JVM 对应:
以 HotSpot 为例,一个普通 Java 对象在堆中的布局通常包含三部分:
注意:引用本身只是一个「地址值」,真正的数据在堆上的对象里。
Person p = new Person("Tom", 18);
// 简化理解:
// 1. 检查 Person 类是否已加载
// 2. 在堆上分配内存
// 3. 字段设为 0 / null / false
// 4. 执行构造器,写入 name 和 age
// 5. 将引用赋给栈上的变量 p
new 时由 JVM 调用;普通方法由程序员显式调用。class User {
private String name;
private int age;
// 无参构造
public User() {}
// 重载:有参构造
public User(String name, int age) {
this.name = name;
this.age = age;
}
// 普通方法
public void sayHello() {
System.out.println("Hello " + name);
}
}三大用法:
this.name = name;this("default");,必须写在第一行。return this;class User {
private String name;
private int age;
public User(String name) {
this(name, 0); // 调用另一个构造器
}
public User(String name, int age) {
this.name = name; // 区分成员变量和参数
this.age = age;
}
public User grow() {
this.age++;
return this; // 链式调用
}
}标准回答:Java 只有值传递,没有引用传递。
void change(User u) {
u.setName("B"); // 会影响外部对象
u = new User("C"); // 只改变形参引用,不影响外部
}
User user = new User("A");
change(user);
// user.getName() == "B"class Address implements Cloneable {
String city;
@Override
protected Address clone() throws CloneNotSupportedException {
return (Address) super.clone();
}
}
class User implements Cloneable {
String name;
Address address;
// 浅拷贝
@Override
protected User clone() throws CloneNotSupportedException {
return (User) super.clone();
}
// 深拷贝
protected User deepClone() throws CloneNotSupportedException {
User copy = (User) super.clone();
copy.address = address.clone();
return copy;
}
}class Demo {
int member; // 成员变量
void method() {
int local = 0; // 局部变量
}
}String a = new String("java");
String b = new String("java");
System.out.println(a == b); // false,两个不同对象
System.out.println(a.equals(b)); // true,内容相同
Integer x = 128;
Integer y = 128;
System.out.println(x == y); // false,超出缓存范围
System.out.println(x.equals(y)); // true
原因:因为集合框架(如 HashMap、HashSet)在判断元素相等时,会同时用到 hashCode 和 equals。
class User {
private String id;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
return Objects.equals(id, user.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}按功能分类:
public class User {
// 状态
private String name; // 实例变量
private static int count; // 静态变量
public static final int MAX = 100; // 常量
// 代码块
static { /* 静态代码块 */ }
{ /* 实例代码块 */ }
// 构造器
public User(String name) {
this.name = name;
count++;
}
// 行为
public void login() { }
public static int onlineCount() { return count; }
// 元信息
public static class Builder { }
}设计要点:
final,防止被继承。private final。public final class UserProfile {
private final String name;
private final int age;
private final List tags;
public UserProfile(String name, int age, List tags) {
this.name = name;
this.age = age;
// 防御性拷贝
this.tags = tags == null ? List.of() : List.copyOf(tags);
}
public String getName() { return name; }
public int getAge() { return age; }
public List getTags() { return tags; } // 返回的 List 也是不可变的
} 以下题目来自阿里巴巴、字节跳动、腾讯、美团等知名企业的真实面试,难度较高,建议在掌握基础知识后挑战。
核心考察点:JVM内存模型、类加载机制、对象创建流程、性能优化、阿里巴巴技术栈。
从JVM底层机制到性能优化的完整分析:
// 核心优化策略对比
// 1. 对象池:ThreadLocal重用对象
private static final ThreadLocal POOL =
ThreadLocal.withInitial(() -> new StringBuilder(256));
public String process(String input) {
StringBuilder sb = POOL.get();
sb.setLength(0); // 重置而非创建新对象
return sb.append("prefix:").append(input).toString();
}
// 2. 享元模式:缓存不可变对象
private static final Map CACHE = new ConcurrentHashMap<>();
public Data getData(String key) {
return CACHE.computeIfAbsent(key, Data::new);
} 阿里巴巴性能优化实践:
监控与调优:
面试官关注点:是否理解JVM对象创建的底层机制,能否进行性能优化和问题排查。
核心考察点:并发编程、对象池设计、内存管理、性能优化、字节跳动技术栈。
从并发控制到内存管理的对象池设计:
// 高并发对象池核心设计
public class ObjectPool {
private final ConcurrentLinkedQueue pool = new ConcurrentLinkedQueue<>();
private final Supplier factory;
// 借出对象:无锁获取
public T borrow() {
T obj = pool.poll();
return obj != null ? obj : factory.get();
}
// 归还对象:重置后放回池中
public void returnObj(T obj, Consumer reset) {
reset.accept(obj); // 重置状态
pool.offer(obj);
}
}
// 使用ThreadLocal减少竞争
private static final ThreadLocal LOCAL_POOL =
ThreadLocal.withInitial(StringBuilder::new); 字节跳动性能优化策略:
内存管理优化:
面试官关注点:是否理解高并发场景下的对象池设计原理,能否解决内存泄漏和性能瓶颈问题。
核心考察点:游戏引擎设计、对象管理、组件化架构、内存优化、腾讯游戏业务。
从游戏引擎架构角度设计对象管理系统:
// ECS架构核心设计
public class Entity {
private final Component[] components = new Component[64];
public T get(Class type) {
return type.cast(components[ComponentRegistry.getIndex(type)]);
}
public void add(Component c) {
components[ComponentRegistry.getIndex(c.getClass())] = c;
}
}
// 游戏对象池
public class GameObjectPool {
private final Queue pool = new ArrayDeque<>();
public Entity create() {
Entity e = pool.poll();
return e != null ? e : new Entity();
}
public void recycle(Entity e) {
e.reset(); // 重置组件状态
pool.offer(e);
}
} 腾讯游戏架构特色:
性能优化策略:
面试官关注点:是否理解游戏引擎的架构设计原理,能否设计高性能的对象管理系统。
核心考察点:分布式系统、缓存设计、版本控制、数据一致性、美团电商业务。
从分布式电商角度设计商品对象管理:
// 多级缓存核心逻辑
public Product getProduct(String id) {
// 1. 本地缓存
Product p = localCache.get(id);
if (p != null) return p;
// 2. Redis缓存
p = redis.get("product:" + id);
if (p != null) {
localCache.put(id, p);
return p;
}
// 3. 数据库
p = db.findById(id);
if (p != null) {
redis.set("product:" + id, p, 30, MINUTES);
localCache.put(id, p);
}
return p;
}
// 乐观锁更新(版本控制)
public boolean update(Product p) {
Product current = getProduct(p.getId());
if (current.getVersion() != p.getVersion()) {
return false; // 版本冲突
}
p.setVersion(p.getVersion() + 1);
return db.updateWithVersion(p);
}美团电商架构特色:
性能优化策略:
面试官关注点:是否理解分布式环境下的对象管理挑战,能否设计高性能、高可用的电商系统。