Java基础面试重点-1

0. 符号:

@*@:记忆模糊,验证后特别标注的知识点。

@&@:容易忘记知识点。

*:重要的知识点。

1. 简述一下Java面向对象的基本特征(四个),以及你自己的应用?

  • 抽象:是将一类对象的共同特征总结出来构造类的过程。
  • 继承:基本概念解释,继承是多态的条件。
  • 封装:基本概念解释,侧重:隐藏实现细节、公开使用方式 。
  • 多态:是指不同子类对象对同一消息做出不同的响应。本质就是处理参数,多态符合里氏替换原则、接口打破单继承 。[必要条件:继承、重写、对象上转型。实现方式:接口实现、继承重写,同类重载]

应用体现:

        设计原则、设计模式

2. 程序的设计原则(六原则一法则):

  • 单一职责原则:每个类都应该只有一个职责,类只关注自身的职责。
  • 开闭原则:对功能的拓展开放,对修改关闭的原则。
  • 里氏代换原则:对继承关系中子类限制的描述。父类出现的地方,子类就能出现。子类出现的地方,父类未必能出现。
  • 依赖倒置原则:尽量依赖上层的接口和抽象类,不要依赖具体实现类。
  • 接口隔离原则:单一接口,功能专一。
  • 合成/聚合复用原则:优先使用聚合或合成关系复用代码。
  • 最小知道法则:一个对象应当对其他对象有尽可能少的了解(低耦合)。

拓展点:

        合成与聚合的区别(UML):合成是一种强依赖的特殊聚合,如果整体不存在了,则部分也不存在了;例如, 公司不存在,则部门也将不存在

3. Java中重写和重载的区别?

  • 说一下概念
  • Tips:
    • 重载返回值类型必须相同(@*@ )
    • 重载:参数个数与参数类型均相同的方法只能有一个。

拓展点:

        构造器可以重载,但是不可以重写,因为一个类的构造器不能被继承,所以它不能被重写。

4. final、finally和finalize的理解:

  • final 修饰变量(局部变量、修饰参数列表、成员变量),不能被修改,一般修饰静态成员变量。
  • final 修饰方法,不能被重写。
  • final 修饰类,不能被继承。
  • 局部内部类中,使用的变量得是final修饰的,JDK1.8中可以省略final,但是不能产生实际上的修改。
  • --- ---
  • finally是异常处理中的一个关键字,作用是定义一些无论异常是否出现都会执行的代码。
  • --- ---
  • finalize():垃圾收集器在销毁对象时调用,通过重写finalize()方法,可以整理系统资源或者执行其他清理工作。

拓展点:

finally语句块中应该尽量避免使用return返回结果,它会吞掉异常信息。原因:finally语句块中的return/抛出异常的优先级最高,程序会优先返回finally语句块中的立即结束语句的结果,此时try-catch语句块中的return/抛出异常(立即结束语句)的结果无效。

5. 怎样声明一个类不会被继承,什么场景下会用?

  • final修饰的类不能有子类,大部分都是出于安全考虑。例如String类。
  • ---- ----
  • 接口不能继承一般类。

6. 接口和抽象类的区别?

  • 相同:
    • 抽象类和接口都不能被实例化。(@&@ 20230129)
  • 不同点:
    • 抽象类(abstract),接口(interface);
    • 抽象类可有部分方法的实现,接口则不可以有(JDK1.8可以);
    • 抽象类可有构造方法,接口不可以;
    • 抽象类是单继承(java中的类都是单继承),接口可以多继承接口;
    • 抽象类的属性和方法可以使用private、默认、protected、public修饰符

7. equals()和==区别?为什么重写equal要重写hashcode?

区别:

  • == 是运算符;equals是Object类的方法。
  • == 用于基本数据类型和引用类型;equals只能用于引用类型。
  • --- ---
  • == 两端是基本数据类型,就是判断值是否相同。
  • equals在重写之后,判断两个对象的属性值是否相同。equals如果不重写,其实就是 ==

为什么重写equal要重写hashcode?

  • 首先源码注释要求:如果根据 equals(Object) 方法判断是相等的,这两个对象中的每个对象调用hashCode()的哈希值必须相等。
  • 具体原因:hashCode()生成哈希码目的,就是保证同一个类的不同对象的哈希值是不相同的。如果不重写hashCode(),会出逻辑上认为是同一个对象,但是Hash码却不相同。
  • 此外(可以不提):重写hashcCode()后,可以自定义哈希码的生成规则,可以通过对象的属性值计算出哈希码。

8. 描述一下Object类中常用的方法?

  • toString、hashCode、equals、clone(需要实现cloneable接口)、finalized(GC自救)、wait、notify、notifyAll。
  • 注意要解释每个方法的作用。

9. 代码块以及代码块和构造方法的执行顺序

代码块分类(四种):(@&@)

  • 普通代码块:类中方法的方法体。
  • 构造代码块:类中的"{}",对象每次实例化时执行一次。
  • 静态代码块:类中的"static{}",类加载的时执行一次。
  • 同步代码块:"用synchronized() {}"。

执行顺序原则:

  • 先父类,后子类。
  • 先静态,后普通。
  • 先(静态)成员变量,后(静态)代码块,最后构造方法。

10. 什么是序列化?

  • 概念:把对象转换为字节序列的过程。
  • 用途:
    • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
    • 在网络上传送对象的字节序列。
  • Tips:实体类都要实现序列化接口。

某些字段不想序列化怎么办:

        使用transient关键字修饰。

transient的作用是:

  • 阻止实例中那些用此关键字修饰的变量序列化。
  • transient只能修饰变量,不能修饰类和方法。

11. Java中的参数传递时传值呢?还是传引用?

概念:

值传递:是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。

引用传递:是指在调用函数时将实际参数的地址直接传递到函数中,那么在函数中对参数所进行的修改,将影响到实际参数。

Java是值传递:

Java中只有值传递,没有引用传递_java编程思想中的值传递与引用传递-CSDN博客

拓展点:

使用集合或Map作为方法入参,传递给多个方法时,注意方法内部对入参的修改,影响方法计算结果

12. 说一下反射,反射会影响性能吗?

在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制。

反射这种运行时动态的功能可以说是非常重要的,可以说无反射不框架。

反射方式实例化对象和属性赋值和调用方法肯定比直接的慢,但是程序运行的快慢原因有很多,不能主要归于反射,如果你只是偶尔调用一下反射,反射的影响可以忽略不计。

反射使用:

... ... Field f = stuClass.getDeclaredField("字段名"); //获得私有字段 Object obj = stuClass.getConstructor().newInstance(); //获得对象 f.setAccessible(true);//暴力反射,解除私有限定 f.set(obj, "18888889999"); //赋值 ... ...

13. 内部类层次结构图:

14. 当子类构造方法使用this调用其它构造方法,就不能再调用父类的无参构造方法(super())?

  • 是的,this() 和super() 都必须是子类构造方法的第一行代码。
  • 然后介绍一下:this的三个作用。super的两个作用(调用父类的构造方法、调用父类的隐藏的成员变量和方法)
  • --- ---
  • 其实,子类的构造方法无论再怎么调用其它构造方法,最终都会调用到父类的构造方法(隐式调用)。

15. 为什么要求一个类必须显示的书写无参构造方法?

  • 方便子类继承:子类构造方法中,往往默认使用super()调用父类的无参构造方法,super()往往可以省略不写,但是父类中如果没有定义构造方法,子类中就要显示写出super()并传参数。
  • 反射创建对象,一般用无参构造方法。
  • 自定义构造方法时,程序员可能会忽略已经没有空参构造方法。

16. String、StringBuffer和StringBuilder的区别是什么?String为什么是不可变的?

可变性:

String类中使用final关键字修饰字符数组,所以不可变的。

private final char value[];

StringBuilder与StringBuffer都继承自AbstractStringBuilder类,没有用final关键字修饰字符数组,所以可变。

char[] value;

线程安全性:

  • String中的对象是不可变的,理解为常量,线程安全。
  • StringBuffer对方法加上同步锁,线程安全的。
  • StringBuilder并没有对方法加同步锁,线程不安全的。   

性能:

  • String进行改变时,都会生成一个新的String对象,然后将指针指向新的String对象。
  • StringBuffer每次都会对StringBuffer对象本身进行操作,而不是生成新的对象。
  • 相同情况下使用StringBuilder相比使用StringBuffer仅能获得 10%~15%左右的性能提升,但却要冒多线程不安全的风险。

使用总结:

  • 操作少量的数据 -> String
  • 单线程操作字符串缓冲区下操作大量数据 -> StringBuilder
  • 多线程操作字符串缓冲区下操作大量数据 -> StringBuffer

扩容机制(StringBuffer StringBuilder):

  • 新容量 = 旧容量 * 2 + 2
  • 为什么要进行+2 ? 防止初识容量为0

17. 包装类缓存问题(Integer)?

  • 1. Integer与new Integer不会相等。
  • 2. 两个都是非new出来的Integer,如果数在-128到127之间,则是true,否则为false。
  • 3. 两个都是new出来的Integer,都为false。
  • 4. Int和Integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比。
  • --- ---
  • Integer i2 = 128在编译时,会Integer i2 = Integer.valueOf(128),即使用拆封箱的概念。
  • Integer 会把 -128 ~127的数组缓存在内存中,见静态内部类IntegerCache。
  • --- ---
  • 还有哪些包装类有缓存?
    • Byte short Long Integer Character 都有缓存。

18. 简述一下自定义异常的应用场景?

  • 说自己微服务定义的异常体系。

19. Java异常层次结构图:

20. 运行时异常和一般异常(受检异常,检查型异常)的区别是什么?

  • 运行时异常(RuntimeException):程序运行过程中,可能出现的异常,默认情况下,会自动处理(即不需要try-catch语句捕获和throws声明)[运行时异常是非受检异常]。
  • 受检异常(CheckedException):除了运行时异常以外,其它Exception类及其子类都属于受检异常。这种异常需要try-catch语句捕获和throws声明,否则编译不会通过。
  • 一般来讲,如果没有特殊的要求,我们建议使用RuntimeException异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/349866.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git提交错了?别慌,直接删除提交记录

git revert 和git reset !这两个命令都有撤销操作的功能!哪一个可以删除提提交记录??? 使用git revert撤销提交 revert的英文释义是回复、恢复(到原来的状态) 作用 git revert 是 Git 中用于撤…

WordPress如何删除内存中的缓存?

今天boke112百科将某篇文章修改分类和内容更新后,发现文章底部的相关文章显示的内容跟文章分类、标签毫无关系,还是显示原来的旧内容。后来查看YIA主题相关文章的代码,才发现相关文章的数据保存到内存中的,而且是永不过期&#xf…

深入理解计算机系统 家庭作业6.22

每条磁道存 位 有r-xr条磁道 二者相乘就是我们要求的容量) 所以最大值x0.5

问题(05)elementui 输入框里面禁止浏览器自动填充用户名密码、弹出浏览器历史密码提示框

问题描述 el-input&#xff0c;非密码框&#xff0c;在输入时&#xff0c; 问题1&#xff1a; 浏览器自动填充用户名密码。问题2&#xff1a;右边显示浏览器历史密码提示框。 问题解决 问题1&#xff1a;使用auto-complete"new-password" <input type"te…

C++语法08 数据类型之间的强制转换

目录 强制类型转换 强制类型转换格式 整型转换成浮点型 整型转换成浮点型其他写法 训练&#xff1a;糖果奖励 糖果奖励参考代码 浮点型转换成整型 浮点型转换成整型其他写法 训练&#xff1a;分离小数 分离小数参考代码 强制类型转换 强制类型转换&#xff0c;就是把…

计算机网络(6) UDP协议

一.UDP数据报格式 UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;是一种简单的传输层协议&#xff0c;与TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;相比&#xff0c;UDP提供一种无连接、不可靠的数据传…

深入解析Prometheus:强大的开源监控与告警系统

目录 引言 一、运维监控平台的设计思路 &#xff08;一&#xff09;设计思路 1.数据收集模块 2.数据提取模块 3.监控告警模块 &#xff08;二&#xff09;监控平台层级 二、Prometheus简介 &#xff08;一&#xff09;基本介绍 &#xff08;二&#xff09;核心特征 …

byzer 笔记总结

1.总览&#xff08;简单了解&#xff09; 1.1 数据挖掘的定义 基于大数据技术&#xff0c;针对有价值是业务场景&#xff0c;对数据中台沉淀的大量数据进行探索&#xff0c;分析。寻找数据与数据之间潜藏的关系&#xff0c;转化为自动化的算法模型&#xff0c;从而获取有价值的…

el-table 多选回显,分页回显

实现el-table多选分页回显功能&#xff0c;左侧是分页的数据源&#xff0c;右侧是选择后的人员数据&#xff0c;切换下一页&#xff0c;选中的数据会在左侧表格回显。 实现&#xff1a; <template><el-dialog :title"title" :visible.sync"show"…

如何将ai集成到项目中,方法二

上一篇文章&#xff1a;如何将ai集成到radsystems项目中&#xff0c;在项目中引入ai-CSDN博客 上一篇文章内容主要针对于未实现权限分离的项目&#xff0c;这篇文章主要来说一下权限分离的项目怎么做&#xff0c;以及注意的细节。 一、编写前端router.js 二、编写前端askai.vu…

Android启动流程

目标&#xff1a; 1.zygote怎么创建进程&#xff1f; fork进程&#xff1a;fork复制一份进程&#xff0c;对应的返回值有两个&#xff0c;pid0&#xff0c;子进程&#xff1b;pid!0父进程 写时拷贝&#xff1a; fork的子进程以后&#xff0c;子进程和父进程公用一份内存空间…

使用ShinyCell展示你的单细胞数据

在我参与发表我的第一篇植物单细胞文章中&#xff0c;我用Shiny开发了一个简单的单细胞可视化网站&#xff0c;目前已经运行了5年了&#xff0c;有上万的访问&#xff0c;唯一的不足就是太简陋。我一直想着能不能找个一个更好的工具进行展示&#xff0c;最近发现了一个工具&…

每日5题Day24 - LeetCode 116 - 120

每一步向前都是向自己的梦想更近一步&#xff0c;坚持不懈&#xff0c;勇往直前&#xff01; 第一题&#xff1a;116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; /* // Definition for a Node. class Node {public int val;public Node left;…

【数据质量人人有责】数据质量是什么?

引言&#xff1a;数据是当代企业的核心资源之一&#xff0c;对于支持业务决策、优化运营和增强竞争力至关重要。然而&#xff0c;仅仅拥有数据并不意味着能够充分发挥其潜在价值。只有先确保数据质量&#xff0c;才能保证后续数据分析和挖掘的正确的结果对管理和业务有价值&…

LabVIEW 与组态软件在自动化系统中的应用比较与选择

LabVIEW 确实在非标单机设备、测试和测量系统中有着广泛的应用&#xff0c;特别是在科研、教育、实验室和小型自动化设备中表现突出。然而&#xff0c;LabVIEW 也具备一定的扩展能力&#xff0c;可以用于更复杂和大型的自动化系统。以下是对 LabVIEW 与组态软件在不同应用场景中…

Mysql中使用where 1=1有什么问题吗

昨天偶然看见一篇文章&#xff0c;提到说如果在mysql查询语句中&#xff0c;使用where 11会有性能问题&#xff1f;&#xff1f; 这着实把我吸引了&#xff0c;因为我项目中就有不少同事&#xff0c;包括我自己也有这样写的。为了不给其他人挖坑&#xff0c;赶紧学习一下&…

关于JavaScript技术的基础内容汇总

目录 JavaScript 基础知识1. JavaScript 基本语法2. 变量和常量3. 数据类型4. 运算符5. 控制结构6. 函数7. 对象8. 数组9. 事件处理10. DOM 操作 JavaScript 基础知识 学习 JavaScript&#xff08;简称 JS&#xff09;是前端开发的重要组成部分&#xff0c;它是一种动态的、弱…

【总线】AMBA总线架构的发展历程

目录 引言 发展历程 第一代AMBA&#xff08;AMBA 1&#xff09; 第二代AMBA&#xff08;AMBA 2&#xff09; 第三代AMBA&#xff08;AMBA 3&#xff09; 第四代AMBA&#xff08;AMBA 4&#xff09; 第五代AMBA&#xff08;AMBA 5&#xff09; AMBA协议简介 ASB&#x…

【Linux】常见指令的使用

文章目录 which指令stat 指令wc指令echo指令tree 指令whoami指令clear指令alias指令ls指令pwd指令cd 指令touch指令mkdir指令&#xff08;重要&#xff09;rmdir指令 && rm 指令&#xff08;重要&#xff09;man指令&#xff08;重要&#xff09;cp指令&#xff08;重要…

Redis原理篇——分布式锁

Redis原理篇——分布式锁 分布式锁是什么&#xff1f;分布式锁有哪些特性&#xff1f;分布式锁常用实现方式Redis 实现分布式锁一、简单的 Redis 锁二、带过期时间的 Redis 锁三、加上 Owner 的 Redis 锁四、Lua 脚本确保原子性 分布式锁是什么&#xff1f; 分布式锁是在分布式…