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

Java面试宝典:核心基础知识精讲

Java面试宝典:核心基础知识精讲

这篇笔记整理了 Java 编程中的核心基础知识,涵盖面向对象编程、常见类与方法区别等内容,适合初学者快速复习或深入理解 Java 的核心概念。以下内容经过精心整理,结构清晰,适合作为博客发布。


1. 面向对象编程(OOP)的核心理念

面向对象编程(OOP)是一种通过将现实世界的事物抽象为类和对象的编程范式。它通过以下三大特性实现代码的模块化与可维护性:

  • 封装(Encapsulation):将数据(属性)与操作数据的方法绑定,限制对数据的直接访问,只能通过定义好的接口操作。
  • 继承(Inheritance):通过从现有类派生新类,复用父类的属性和方法,减少代码冗余。
  • 多态(Polymorphism):允许不同子类对象对同一消息(方法调用)做出不同响应,增强代码灵活性。

示例

class Animal {void eat() {System.out.println("This animal eats food.");}
}class Dog extends Animal {@Overridevoid eat() {System.out.println("Dog eats bones.");}
}

2. 方法重载(Overloading)与重写(Overriding)的区别

  • 重载(Overloading)

    • 发生在同一类中。
    • 方法名相同,参数列表不同(数量或类型),与返回值无关。
    • 编译时多态,静态绑定。
    • 示例:
      class Calculator {int add(int a, int b) { return a + b; }double add(double a, double b) { return a + b; }
      }
      
  • 重写(Overriding)

    • 发生在子类重写父类方法。
    • 方法名、参数列表、返回值类型必须完全相同
    • 子类方法的访问权限不能低于父类,异常范围不能扩大。
    • 构造函数不能被重写。
    • 示例:
      class Animal {void sound() { System.out.println("Some sound"); }
      }
      class Cat extends Animal {@Overridevoid sound() { System.out.println("Meow"); }
      }
      

3. 接口(Interface)与抽象类(Abstract Class)的对比

特性抽象类接口
继承/实现被子类继承(extends被类实现(implements
多继承只能继承一个抽象类可实现多个接口
构造器可以有构造器(用于子类初始化)不能有构造器
实例化不能直接实例化不能直接实例化
访问修饰符可使用 publicprotected方法默认 public
成员变量可包含普通成员变量只能声明常量(public static final

注意:抽象类的构造器仅在子类实例化时被调用,用于初始化父类部分。


4. 深拷贝与浅拷贝的区别

  • 浅拷贝(Shallow Copy)

    • 仅拷贝对象本身,对象中的引用类型字段仍指向原内存地址。
    • 新旧对象共享引用类型字段,修改可能相互影响。
    • 示例:
      class Person implements Cloneable {String name;Address address;@Overrideprotected Object clone() throws CloneNotSupportedException {return super.clone();}
      }
      
  • 深拷贝(Deep Copy)

    • 拷贝对象及其所有引用对象,生成完全独立的新对象。
    • 修改新对象不会影响原对象。
    • 示例:
      class Person implements Cloneable {String name;Address address;@Overrideprotected Object clone() throws CloneNotSupportedException {Person p = (Person) super.clone();p.address = (Address) address.clone();return p;}
      }
      

5. sleep()wait() 的区别

特性sleep()wait()
所属类ThreadObject
锁资源不释放锁释放锁
唤醒方式自动唤醒(指定时间后)需要 notify()notifyAll()
使用场景不需要 synchronized必须在 synchronized 块中使用

注意:调用 wait() 而不使用 synchronized 会抛出 IllegalMonitorStateException

synchronized (obj) {obj.wait(); // 释放锁,等待唤醒
}

6. 自动装箱与拆箱:intInteger

  • 自动装箱(Autoboxing):将基本数据类型(如 int)转换为包装类对象(如 Integer)。
  • 自动拆箱(Unboxing):将包装类对象转换为基本数据类型。
  • 实现原理:通过 Integer.valueOf()(装箱)和 Integer.intValue()(拆箱)实现,属于编译器的语法糖。
  • 用途:便于在集合(如 List<Integer>)中使用基本类型数据。

int vs Integer

  • int 是基本数据类型,直接存储值,默认值为 0
  • Integer 是包装类,引用类型,默认值为 null,需实例化后使用。
List<Integer> list = new ArrayList<>();
list.add(1); // 自动装箱:int -> Integer
int value = list.get(0); // 自动拆箱:Integer -> int

7. ==equals() 的区别

  • ==
    • 基本数据类型:比较值是否相等。
    • 引用类型:比较内存地址。
  • equals()
    • 默认(Object 类):比较地址(与 == 等效)。
    • 重写后:通常比较对象内容(例如 String 类重写了 equals())。
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)

8. 为什么 String 类使用 final 修饰?

  • String 不可继承final 修饰的类不能被继承,防止子类修改其行为。
  • 效率String 是高频使用的类,固定实现避免了重写导致的性能问题。
  • 安全性String 使用 native 方法调用系统 API,禁止继承防止恶意代码注入。

9. StringBufferStringBuilder 的对比

特性StringBufferStringBuilder
线程安全线程安全(方法加 synchronized非线程安全
性能较慢(因加锁开销)较快(无加锁开销)
使用场景多线程环境单线程环境
StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" World"); // 高效拼接

10. finalfinallyfinalize

  • final
    • 修饰类:不可被继承。
    • 修饰方法:不可被重写。
    • 修饰变量:不可修改,需初始化为常量。
  • finally
    • 用于 try-catch 块后,确保代码无论异常与否都执行(常用于资源释放)。
  • finalize
    • Object 类方法,垃圾回收前调用,用于清理资源(不推荐使用,建议用 try-with-resources)。
try {// 可能抛出异常的代码
} catch (Exception e) {// 处理异常
} finally {// 释放资源
}

总结

以上内容涵盖了 Java 的核心基础知识,从面向对象编程到常见类与方法的区别。希望这篇笔记能帮助你快速复习或深入理解 Java 编程的精髓!如果有其他问题,欢迎随时探讨。

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

相关文章:

  • Python9-逻辑回归-决策树
  • 神经网络核心机制深度解析:链式法则驱动下的梯度流动与参数优化
  • Spring事务和事务传播机制(半)
  • 61.[前端开发-Vue3]Day03-购物车-v-model-组件化-Vue脚手架
  • Kafka学习笔记(p1-p14)
  • C++:四大智能指针
  • Roo Code 键盘导航与快捷键
  • SQL从入门到起飞:完整学习数据库与100+练习题
  • MyBatis 动态 SQL 详解:优雅处理复杂查询场景
  • 如何看待Qt中的QObject这个类
  • utf8mb4_bin 与 utf8mb4_generate_cli区别
  • CAN总线学习(一)CAN总线通讯&硬件电路
  • 13. LangChain4j + 加入检索增加生成 RAG(知识库)
  • TriggerRecovery
  • OpenAI 开源 GPT-oss 模型:从闭源到开源的模型架构创新之路
  • 微服务技术栈一文串讲
  • 从浅入深:自编码器(AE)与变分自编码器(VAE)的核心原理与Pytorch代码讲解
  • 低功耗超宽带收发器:DW1000设备驱动API指南
  • 2012/07 JLPT听力原文 问题四
  • Redis最佳实践——性能优化技巧之集群与分片
  • springboot的注解
  • iOS App 混淆与热更新兼容实战 混淆后如何安全可靠地推送热修复(Hotfix)与灰度回滚
  • 从 0 到 1 保姆级实现C语言双向链表
  • 2 IP地址规划与设计案例分析
  • Vue 中 8 种组件通信方式
  • 十三、vue3后台项目系列——sidebar的实现,递归组件
  • LeetCode 383 - 赎金信
  • compose multiplatform reader3
  • Redis 入门与实践
  • 【OpenGL】texture 纹理