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

【Java基础常见辨析】重载与重写,深拷贝与浅拷贝,抽象类与普通类

文章目录

      • 一、重载 (Overload) vs 重写 (Override)
      • 二、抽象类 (Abstract Class) vs 普通类 (Normal Class)
      • 三、`final` 字段的作用
      • 四、深拷贝 (Deep Copy) vs 浅拷贝 (Shallow Copy)
      • 五、实现深拷贝的三种方法
      • 六、泛型 (Generics)
      • 七、Java 创建对象的 5 种方法
      • 八、获取私有对象的两种方法

一、重载 (Overload) vs 重写 (Override)

特性重载 (Overload)重写 (Override)
作用范围同一个类中父子类之间
方法签名方法名相同,参数列表不同方法名、参数列表、返回值完全相同
访问权限无要求子类方法权限 ≥ 父类方法
异常处理无要求子类异常范围 ≤ 父类异常
// 重载示例
class Calculator {int add(int a, int b) { return a + b; }          // 方法1double add(double a, double b) { return a + b; } // 方法2(参数类型不同)
}// 重写示例
class Animal {void sound() { System.out.println("Animal sound"); }
}
class Dog extends Animal {@Overridevoid sound() { System.out.println("Bark!"); } // 重写父类方法
}

二、抽象类 (Abstract Class) vs 普通类 (Normal Class)

特性抽象类普通类
实例化❌ 不能直接实例化✅ 可以直接实例化
方法实现可包含抽象方法(无实现)所有方法必须有实现
继承关系只能作为基类被继承可继承/被继承
构造器可以有构造器(用于子类初始化)必须有构造器
// 抽象类示例
abstract class Shape {abstract void draw();          // 抽象方法(无实现)void rotate() { /* 具体实现 */ } // 普通方法
}// 普通类示例
class Circle extends Shape {@Overridevoid draw() { System.out.println("Drawing circle"); } // 必须实现抽象方法
}

三、final 字段的作用

修饰目标效果示例
禁止被继承final class MyFinalClass {}
方法禁止被子类重写public final void lock() {}
变量禁止重新赋值(常量)final int MAX_SIZE = 100;

四、深拷贝 (Deep Copy) vs 浅拷贝 (Shallow Copy)

特性浅拷贝深拷贝
对象复制复制对象本身复制对象及其引用的所有子对象
引用字段新旧对象共享同一引用递归创建引用对象的新副本
内存开销
独立性修改引用对象会影响原对象新旧对象完全独立
// 浅拷贝示例(默认 clone() 行为)
class Person implements Cloneable {String name;Address address; // 引用类型字段@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone(); // 浅拷贝:address 被直接复制引用}
}

五、实现深拷贝的三种方法

  1. 重写 clone() 方法(递归复制)

    @Override
    protected Object clone() throws CloneNotSupportedException {Person cloned = (Person) super.clone();cloned.address = (Address) address.clone(); // 手动复制引用对象return cloned;
    }
    
  2. 序列化/反序列化

    public Person deepCopy() throws IOException, ClassNotFoundException {ByteArrayOutputStream bos = new ByteArrayOutputStream();ObjectOutputStream oos = new ObjectOutputStream(bos);oos.writeObject(this);ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());ObjectInputStream ois = new ObjectInputStream(bis);return (Person) ois.readObject();
    }
    
  3. 手动递归复制

    public Person deepCopyManual() {Person copy = new Person();copy.name = this.name;copy.address = new Address(this.address.street); // 创建新对象return copy;
    }
    

六、泛型 (Generics)

核心作用:在编译期进行类型安全检查,避免运行时 ClassCastException
应用场景

// 泛型类
class Box<T> {private T content;void setContent(T content) { this.content = content; }T getContent() { return content; }
}// 使用示例
Box<String> stringBox = new Box<>();
stringBox.setContent("Hello Generics!");
String value = stringBox.getContent(); // 无需强制类型转换

七、Java 创建对象的 5 种方法

  1. new 关键字
    Person p = new Person();

  2. 反射 Class.newInstance()
    Person p = Person.class.newInstance();

  3. 反射 Constructor.newInstance()

    Constructor<Person> constructor = Person.class.getConstructor();
    Person p = constructor.newInstance();
    
  4. 序列化/反序列化

    ObjectInputStream ois = new ObjectInputStream(inputStream);
    Person p = (Person) ois.readObject();
    
  5. clone() 方法
    Person p = originalPerson.clone();


八、获取私有对象的两种方法

  1. 通过 Getter 方法(标准做法)

    public class User {private String secret = "Confidential";public String getSecret() { return secret; } // 提供公共访问接口
    }
    
  2. 通过反射(打破封装性)

    Field field = User.class.getDeclaredField("secret");
    field.setAccessible(true); // 关闭访问检查
    String secretValue = (String) field.get(userInstance); // 强制获取
    

http://www.dtcms.com/a/337179.html

相关文章:

  • 基于 JSP+Mysql实现MVC房屋租赁系统
  • Word 中 MathType 公式编号问题与解决
  • 自定义table
  • SpringBoot--Spring MVC 拦截器注入与 new 的区别
  • OSCP - Proving Grounds - Vanity
  • 分布式系统的“不可能三角”:CAP定理深度解析
  • 【数据结构】堆中插入数据,删除数据
  • Android Handler 线程执行机制
  • python遇到异常流程
  • 【Langchain系列二】LangChain+Prompt +LLM智能问答入门
  • Unix Domain Socket(UDS)和 TCP/IP(使用 127.0.0.1)进程间通信(IPC)的比较
  • Baumer高防护相机如何通过YoloV8深度学习模型实现网球运动员和网球速度的检测分析(C#代码UI界面版)
  • Spring AI Alibaba 项目接入兼容 OpenAI API 的大模型
  • Midjourney绘画创作入门操作创作(在线教育背景系列)
  • IOPaint 远程修图:cpolar 内网穿透服务实现跨设备图片编辑
  • Ansible文件部署与大项目多主机管理
  • 【Git】windows系统删除同名路径
  • 机器翻译论文阅读方法:顶会(ACL、EMNLP)论文解析技巧
  • IntelliJ IDEA中Maven的“Sync“与“Reload“详解:小白的避坑指南
  • python DataFrame基础操作
  • 从零开始部署经典开源项目管理系统最新版redmine6-Linux Debian12
  • 链路聚合路由器OpenMPTCProuter源码编译与运行
  • 如何在 Ubuntu 24.04 安装 Python 3.12 ?
  • SpringAI集成MCP
  • 详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
  • 【金融数据分析】用Python对金融产品价格进行时间序列分解
  • MySQL的锁:
  • Python入门第9课:面向对象编程(OOP)从零开始,类、对象与三大特性
  • Leetcode 3650. Minimum Cost Path with Edge Reversals
  • Vue Router的常用API有哪些?