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

文章目录

抽象类和普通类的区别

复制代码
// 普通类
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-a can-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()
相关推荐
3 小时前
java关于内部类
java·开发语言
好好沉淀3 小时前
Java 项目中的 .idea 与 target 文件夹
java·开发语言·intellij-idea
gusijin3 小时前
解决idea启动报错java: OutOfMemoryError: insufficient memory
java·ide·intellij-idea
To Be Clean Coder3 小时前
【Spring源码】createBean如何寻找构造器(二)——单参数构造器的场景
java·后端·spring
吨~吨~吨~3 小时前
解决 IntelliJ IDEA 运行时“命令行过长”问题:使用 JAR
java·ide·intellij-idea
你才是臭弟弟3 小时前
SpringBoot 集成MinIo(根据上传文件.后缀自动归类)
java·spring boot·后端
短剑重铸之日3 小时前
《设计模式》第二篇:单例模式
java·单例模式·设计模式·懒汉式·恶汉式
码农水水3 小时前
得物Java面试被问:消息队列的死信队列和重试机制
java·开发语言·jvm·数据结构·机器学习·面试·职场和发展
summer_du3 小时前
IDEA插件下载缓慢,如何解决?
java·ide·intellij-idea
东东5164 小时前
高校智能排课系统 (ssm+vue)
java·开发语言