Java基础面试重点-1

news2024/11/26 16:45:34

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.coloradmin.cn/o/1816652.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c#调用c++dll方法

添加dll文件到debug目录,c#生成的exe的相同目录 就可以直接使用了,放在构造函数里面测试

【git使用四】git分支理解与操作(详解)

目录 (1)理解git分支 主分支(主线) 功能分支 主线和分支关系 将分支合并到主分支 快速合并 非快速合并 git代码管理流程 (2)理解git提交对象 提交对象与commitID Git如何保存数据 示例讲解 &a…

CorelDRAW2024官方最新中文破解版Crack安装包网盘下载安装方法

在设计的世界里,软件工具的更新与升级总是令人瞩目的焦点。近期,CorelDRAW 2024中文版及其终身永久版的发布,以及中文破解版Crack的出现,再次掀起了设计圈的热潮。对于追求专业精确的设计师而言,了解这些版本的下载安装…

Jemeter做性能测试

目录 1. 测试计划 2. 线程组 3. HTTP请求 4. 查看结果树 5. 聚合报告 【要求】 用JMeter取样器,实现对云边AI (qinzhi.xyz)的访问 【步骤】 1. 测试计划 2. 线程组 右击测试计划——添加——线程(用户)——线程组 3. HTTP请求 右击线程组——添加——取样…

鸿蒙轻内核A核源码分析系列五 虚实映射(6)虚拟映射修改转移

6.1 映射属性修改函数LOS_ArchMmuChangeProt 函数LOS_ArchMmuChangeProt用于修改进程空间虚拟地址区间的映射保护属性,其中参数archMmu为进程空间的MMU结构体,vaddr为虚拟地址,count为映射的页数,flags为映射使用的新标签属性信息…

easyrecovery专业版破解无需注册绿色版免费下载 easyrecovery16数据恢复软件永久激活码密钥百度网盘crack文件

EasyRecovery (易恢复中国)是由全球著名数据厂商Ontrack 出品的一款数据文件恢复软件。支持恢复不同存储介质数据:硬盘、光盘、U盘/移动硬盘、数码相机、Raid文件恢复等,能恢复包括文档、表格、图片、音视频等各种文件。 开发背景…

【网络安全的神秘世界】2024.6.6 Docker镜像停服?解决最近Docker镜像无法拉取问题

🌝博客主页:泥菩萨 💖专栏:Linux探索之旅 | 网络安全的神秘世界 | 专接本 解决Docker镜像无法拉取问题 🙋‍♂️问题描述 常用镜像站:阿里云、科大、南大、上交等,全部挂掉 执行docker pull命…

手机数据删除很意外?失而复得,2个技巧揭晓

在这个快节奏的时代,手机就像是我们的“第二心脏”,不仅用来跟人聊天,还藏着我们的秘密宝藏——个人数据。但有时候,手一抖,心一慌,重要数据就消失了!是不是感觉天都要塌下来了?别怕…

翻译: Gen AI生成式人工智能学习资源路线图一

Introduction 介绍 本文档旨在作为学习现代人工智能系统背后的关键概念的手册。考虑到人工智能最近的发展速度,确实没有一个好的教科书式的资源来快速了解 LLMs 或其他生成模型的最新和最伟大的创新,但互联网上有大量关于这些主题的优秀解释资源&#x…

postman教程-21-Newman运行集合生成测试报告

上一小节我们Postman Newman的安装方法,本小节我们讲解一下Postman Newman的具体使用方法。 使用Newman运行集合 1、导出Postman集合: 在Postman中,选择你想要运行的集合,然后点击“导出”按钮,选择导出为“Collect…

Figma文字标注工具的使用方法是什么?

在UI设计过程中,有一个让设计师头疼的工作环节,那就是文字标注的问题。相信大家对Figma软件都很熟悉,但是这个软件的使用也有自己的缺点,就是文字标注等问题,日常使用自己是做不到的,需要依靠第三方工具来执…

推荐使用三丰云免费云服务器、免费虚拟主机

官网地址:www.sanfengyun.com 三丰云服务器: 配置高:能够轻松运行应用程序和网站,在处理大量请求和保持高可靠性方面表现出色。 易用性好:界面直观、简单,能够轻松管理服务器和资源,快速创建和…

面向计算病理学的通用基础模型| 文献速递-视觉通用模型与疾病诊断

Title 题目 Towards a general-purpose foundation model for computational pathology 面向计算病理学的通用基础模型 01 文献速递介绍 组织图像的定量评估对于计算病理学(CPath)任务至关重要,需要从全幻灯片图像(WSIs&…

访问方法(反射)

文章目录 前言一、访问成员方法的方法二、Method类 1.常用方法2.实操展示总结 前言 为了实现在某类中随时可以调用其他类的方法,java.lang.reflect包中提供了Method方法类来实现该效果。每一个Method对象代表着一个方法,利用Methoc对象可以操纵相应的方法…

高效处理风电时序数据,明阳集团的 TDengine 3.0 应用实录

作为全国 500 强企业,明阳集团在风电行业拥有领先实力。目前全球超过 800 个项目采用明阳各种型号风电机组,安装数量超过 15000 台。每台风电机组配备数百至上千个监测点,生成的时序数据每秒一条,每天产生亿级以上的数据量。这些数…

Android RTSP/RTMP多路播放时动态切换输出View类型(SurfaceView和TextureView 动态切换)

SurfaceView和TextureView的区别和优缺点等, 相关的资料很多. 从Android低延时播放器实现角度来看, 总结了下主要区别有: 1. MediaCodec输出到SurfaceView延时一般比到TextureView更低. 2. MediaCodec用SurfaceView比TextureView占用的资源一般更少些(CPU和内存都小一些, 不过还…

【STM32】输入捕获应用-测量脉宽或者频率(方法1)

图1 脉宽/频率测量示意图 1 测量频率 当捕获通道TIx 上出现上升沿时,发生第一次捕获,计数器CNT 的值会被锁存到捕获寄存器CCR中,而且还会进入捕获中断,在中断服务程序中记录一次捕获(可以用一个标志变量来记录&#…

Spring Cloud Netflix 之 Ribbon

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言前言1、负载均衡1.1、服务端负载均衡1.2、客户端负载均衡 2、Ribbon实现服务…

uni-im:云端一体、全平台、免费开源的即时通讯系统解析

一、引言 随着移动互联网的迅猛发展,即时通讯(IM)系统已成为人们日常沟通不可或缺的一部分。然而,开发一个稳定、高效、跨平台的IM系统并非易事。为了降低开发成本、提高开发效率,越来越多的开发者开始寻找成熟的开源…

LIN 入门(1)

1、概述 LIN 是什么 LIN 是 Local Interconnect Network 的缩写,是基于 UART/SCI(Universal Asynchronous Receiver-Transmitter / Serial Communication Interface,通用异步收发器/串行通信接口)的低成本串行通信协议。可用于汽车、家电、办 公设备等…