> 技术文档 > Java常见面试题(Java基础篇)

Java常见面试题(Java基础篇)


一、请简述Java中的封装、继承和多态概念,并举例说明

封装是Java中面向对象的三大特性之一,它主要指的是将对象的属性和行为(方法)结合在一起,并尽可能地隐藏对象内部的细节。在Java中,通过访问修饰符(private、protected、public等)来控制类中的成员变量和成员方法的访问权限,同时提供公共的getter和setter方法来获取或修改私有变量,从而实现对数据的保护,防止外部随意修改。

举例:


  1. public class Student {

  2. private String name; // 私有化姓名属性

  3. private int age;

  4. // 提供公共的getter和setter方法

  5. public String getName() {

  6. return name;

  7. }

  8. public void setName(String name) {

  9. this.name = name;

  10. }

  11. public int getAge() {

  12. return age;

  13. }

  14. public void setAge(int age) {

  15. this.age = age;

  16. }

  17. }

AI写代码

继承是Java面向对象的另一个重要特性,它允许一个类(子类)继承另一个类(父类)的属性和方法,这样可以减少代码重复,提高代码复用性。子类还可以根据需要扩展或覆盖父类的方法。

举例:


  1. public class Animal { // 父类

  2. public void eat() {

  3. System.out.println(\"动物会吃东西\");

  4. }

  5. }

AI写代码


  1. public class Dog extends Animal { // 子类继承Animal

  2. @Override

  3. public void eat() {

  4. System.out.println(\"狗喜欢吃骨头\"); // 覆盖父类eat方法

  5. }

  6. public void bark() {

  7. System.out.println(\"狗会叫\");

  8. }

  9. }

AI写代码

多态: 多态是指同一个接口,使用不同的实例而表现出不同的行为。在Java中,多态主要是依靠继承以及接口实现来体现。编译时类型与运行时类型不一致,就可以体现出多态。多态可以减少程序中的if-else条件判断,使得程序更加灵活且易于扩展。


  1. public class Test {

  2. public static void main(String[] args) {

  3. Animal a1 = new Dog(); // 多态,父类引用指向子类对象

  4. a1.eat(); // 输出\"狗喜欢吃骨头\"

  5. Animal a2 = new Cat();

  6. a2.eat(); // 输出\"猫喜欢吃鱼\"

  7. }

  8. }

  9. interface Animal {

  10. void eat();

  11. }

  12. class Dog implements Animal {

  13. public void eat() {

  14. System.out.println(\"狗喜欢吃骨头\");

  15. }

  16. }

  17. class Cat implements Animal {

  18. public void eat() {

  19. System.out.println(\"猫喜欢吃鱼\");

  20. }

  21. }

AI写代码

篇幅限制下面就只能给大家展示小册部分内容了。这份面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记的【点击此处即可-免费获取】​https://docs.qq.com/doc/DQXdYWE9LZ2ZHZ1ho

二、Java中的四种访问权限修饰符是什么,各有什么区别

        public:公开的。使用public修饰的类、属性或方法对所有类都是可见的,无论它们是否在同一包中。任何类都可以直接访问public修饰的成员。

        protected:受保护的。protected修饰的类成员对同一包中的其他类和所有子类都是可见的,但对不同包中的非子类不可见。这意味着子类可以访问父类中被protected修饰的属性和方法。

        (默认)无修饰符(package-private):没有明确指定任何访问修饰符时,属性或方法只对同一包内的其他类可见。如果在不同的包中,则无法访问这些成员。

        private:私有的。private修饰的类成员只能在该类内部访问,对同一包或其他包中的任何类都不可见。

三、ArrayList和LinkedList有何不同?在什么场景下更适合使用LinkedList

        ArrayList基于动态数组实现,查询速度快,增删慢;LinkedList基于双向链表实现,增删快,查询慢。在频繁进行插入和删除操作且对元素顺序不敏感的情况下,更适合使用LinkedList

四、请解释HashMap的工作原理,包括它的内部结构以及扩容机制。

        HashMap基于哈希表实现,内部使用数组+链表/红黑树存储数据,通过key的hashCode计算其在数组中的位置,当哈希冲突时,采用链表或红黑树解决。扩容机制是在负载因子超过阈值时,会自动扩大为原来的2倍大小,并重新散列所有元素

五、反射是什么?

        通过反射机制,代码能够在运行时动态地获取类、接口、字段、方法等程序元素的信息,并且可以创建对象实例、调用方法、修改字段值等,这些操作通常在编译时是未知或者未确定的。

八、请描述Java内存区域划分(堆、栈、方法区等),并简述各自作用。

        堆存放对象实例,栈存放基本类型变量和对象引用,方法区存放类信息、常量、静态变量等,程序计数器记录当前线程执行的字节码地址,本地方法栈为JNI方法服务。

九、•Java的垃圾回收机制是怎样的?你知道哪些常见的垃圾收集器?

        Java的垃圾回收机制主要是自动回收不再使用的对象所占用的内存空间,避免内存泄露。常见的垃圾收集器有Serial、ParNew、Parallel Scavenge(年轻代)、CMS、G1、ZGC和Shenandoah等。

十、如何避免Java中的内存泄漏问题?

        及时关闭流、数据库连接等资源;弱引用、软引用合理使用;尽量减少全局变量和大对象的使用,防止长生命周期对象持有短生命周期对象引用。