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

华为OD技术面真题 - JAVA开发 - 5

文章目录

  • 抽象类和普通类的区别
  • 抽象类和接口的区别
  • 注解的作用
  • 注解的分类
  • 说说JAVA中异常类体系结构
  • throw和throws的区别
  • JAVA中创建对象的方式有哪些?
  • 如何实现深拷贝

抽象类和普通类的区别

// 普通类 class Animal { void eat() { System.out.println("Animal eats"); } } // 抽象类 abstract class Bird { abstract void fly(); // 抽象方法,没有实现 void sleep() { System.out.println("Bird sleeps"); } }
特性普通类抽象类
能否实例化可以不可以
是否可包含抽象方法可以
方法实现必须有实现可以有抽象方法,也可以有实现方法
继承用途可继承,也可直接用用于规范子类,必须被继承实现抽象方法
典型使用场景功能完整的对象框架、模板、规范类

抽象类和接口的区别

特性抽象类接口
是否可以实例化不可以不可以
定义抽象方法可以默认是抽象方法
定义普通方法可以Java 8+ 可以有 default 方法,在JDK9中允许有私有普通方法
定义静态方法可以可以(Java 8+)
成员变量可以有实例变量只能有常量public static final
构造方法可以不可以
继承方式单继承多实现
适用关系is-acan-do
使用场景复用 + 规范统一规范 + 多实现功能

注解的作用

注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面:

  • 生成文档,通过代码里标识的元数据生成javadoc文档。
  • 编译检查,通过代码里标识的元数据让编译器在编译期间进行检查验证。
  • 编译时动态处理,编译时通过代码里标识的元数据动态处理,例如动态生成代码。
  • 运行时动态处理,运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。

注解的分类

  • Java自带的标准注解,包括@Override@Deprecated@SuppressWarnings,分别用于标明重写某个方法、标明某个类或方法过时、标明要忽略的警告,用这些注解标明后编译器就会进行检查。
  • 元注解,元注解是用于定义注解的注解,包括@Retention@Target@Inherited@Documented
    • @Retention用于标明注解被保留的阶段
    • @Target用于标明注解使用的范围
    • @Inherited用于标明注解可继承
    • @Documented用于标明是否生成javadoc文档
  • 自定义注解,可以根据自己的需求定义注解,并可用元注解对自定义注解进行注解。

说说JAVA中异常类体系结构

Throwable是 Java 语言中所有错误与异常的超类

  • Error及其子类:程序中无法处理的错误
  • Exception:程序本身可以捕获并且可以处理的异常
    • 运行时异常:RuntimeException类及其子类异常,这些异常是不检查异常,程序中可以选择捕获处理,也可以不处理。这些异常一般是由程序逻辑错误引起的,程序应该从逻辑角度尽可能避免这类异常的发生。编译器不会检查
    • 非运行时异常:必须进行处理的异常,如果不处理,程序就不能编译通过。

throw和throws的区别

  • throws: 若方法中存在非运行时异常,如果不对其捕获,那必须在方法头中显式声明该异常,以便于告知方法调用者此方法有异常,需要进行处理。 在方法中声明一个异常,方法头中使用关键字throws,后面接上要声明的异常。若声明多个异常,则使用逗号分割.
public static void method() throws IOException, FileNotFoundException{ //something statements }
  • throw: 如果代码可能会引发某种错误,可以创建一个合适的异常类实例并抛出它,这就是抛出异常。
public static double method(int value) { if (value == 0) { throw new ArithmeticException("参数不能为0"); } return 5.0 / vlaue; }

JAVA中创建对象的方式有哪些?

  • 使用new创建对象。User user = new User()
  • 使用反射创建对象
// 方式1:Class.newInstance()(已废弃,不推荐) Person p1 = Person.class.newInstance(); // 方式2:Constructor.newInstance() Constructor<Person> constructor = Person.class.getConstructor(); Person p2 = constructor.newInstance();
  • 使用克隆创建对象
class Person implements Cloneable { String name; public Object clone() throws CloneNotSupportedException { return super.clone(); } } Person p1 = new Person(); Person p2 = (Person) p1.clone(); // 复制对象
  • 通过序列化/反序列化创建对象
// 假设 person.ser 是序列化文件 ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.ser")); Person p = (Person) ois.readObject(); ois.close();

如何实现深拷贝

先介绍一下深拷贝和浅拷贝

  • 浅拷贝: 对象的基本类型会被复制,但对象中的引用类型仍指向同一个实例。
  • 深拷贝:对象及其引用类型都被完整复制,互不影响。

实现深拷贝的方式:

  • 手动实现clone()方法:
    • 所有引用对象也要实现Cloneable并重写clone()
    • 逐层调用 clone,实现对象图的深度复制
  • 通过序列化反序列化实现深拷贝:
    • 将对象写入字节流,再读回来,自动生成新的对象
    • 要求对象及其引用对象都实现Serializable
  • 使用第三工具:
    • Gson / Jackson可以先序列化成 JSON 再反序列化
    • Apache Commons Lang提供SerializationUtils.clone()
http://www.jsqmd.com/news/323056/

相关文章:

  • 比话降AI和嘎嘎降AI哪个好?花了200块测完结果意外
  • LangChain v1.0+ Model模块全解析:构建高效、灵活的大模型应用
  • Python实战:基于Playwright与异步技术的房产信息智能爬虫
  • 2026毕业论文降AI攻略:从90%降到10%的完整流程
  • 一款基于开源免费AI视觉平台的线下门店的用户画像系统
  • 2000-2024年上市公司融资约束数据SA WW KZ FC指数
  • 【Week6_Day27】【软件测试学习记录与反思】【阶段四 Python, 收集问题, 反思改进,写博客】
  • 2000-2024年上市公司平台生态嵌入程度数据+Stata代码
  • 寒假学习笔记1.27
  • 2017-2024年科技型中小企业名单数据
  • Python招聘信息聚合爬虫实战:使用Playwright与异步技术构建高效数据采集系统
  • Spark SQL与数据立方体:构建高效大数据分析平台
  • 爵士舞资源合集
  • 传感器数据助力大数据农业精准生产
  • 量化交易资源合集
  • Cursor@2.4.22基础设置
  • AI应用架构师:推动半导体良率AI预测的进步
  • 智能茶几:AI Agent的客厅使用模式分析
  • 宝藏指南!AI提示工程边缘计算优化,提示工程架构师指南
  • 成功案例| CUTTag多组学揭示谷物胚乳发育与灌浆的表观遗传机制
  • 合作文章|关键发现:ACK1 IDR1区域介导凝聚体形成,调控肺鳞癌STAT5信号
  • 你想了解这份Vue项目`.env`配置文件中`CLIENT_ID=f9d6262000304e1b83b00eb616edfb87`的作用,结合你之前提到的Jeecg微服务、OAuth2获取Token
  • 阿里云ESA
  • 分享坚果二手投影仪回收价格,支持全国上门回收
  • 2026-01-30 在线医疗人智混合交互:理论溯源、范式变革与前沿趋势
  • 记事本加密原理
  • 代码源挑战赛 Round 48
  • Honor of Kings (S42) 33star 2026.01.30
  • 你的智能穿戴灵感,由此一键启动
  • Comake PI D2 ,开发者开箱测评分享