题海战术,面试必胜秘诀
目录
- 1.Java 的优势是什么?
- 2.什么是 Java 的多态特性?
- 3.Java 中的参数传递是按值还是按引用?
- 4.为什么 Java 不支持多重继承?
- 5.什么是 Java 中的不可变类?
- 总结
题目
来自面试鸭刷题神器
1.Java 的优势是什么?
Java 的跨平台性、垃圾回收机制以及其强大的生态是其成为业界广泛使用的语言的关键因素。
-
跨平台性(Write Once, Run Anywhere,WORA):
Java 的这一特性得益于 JVM(Java 虚拟机),它作为运行 Java 字节码的中间层,允许 Java 程序在任何安装了 JVM 的平台上运行。这种平台无关性极大地简化了开发和部署过程,减少了为不同操作系统编写和维护不同版本代码的需要。 -
垃圾回收机制(Garbage Collection):
Java 的垃圾回收(GC)机制自动管理内存,这意味着开发者无需手动分配和释放内存,从而减少了内存泄漏和其他内存管理错误的风险。虽然这可能会导致一些运行时的性能开销,尤其是在 GC 进行时,但对于大多数应用程序而言,这种开销被自动内存管理带来的开发效率提升和减少错误的便利所抵消。 -
丰富的生态系统:
Java 拥有一个庞大且活跃的开发者社区,这导致了大量第三方库、框架和工具的产生,覆盖了从企业级应用开发到移动应用开发的广泛领域。Spring、Hibernate、Struts 等框架极大地简化了企业级应用的开发,而 Android 开发主要使用 Java,进一步扩大了 Java 的应用范围。此外,丰富的文档和在线资源使得学习和解决问题更加容易。
综上所述,Java 的跨平台性、自动垃圾回收和强大的生态系统,使其成为开发高效、可移植和可维护软件的理想选择,特别是在企业级应用、Web 开发和移动应用开发等领域。这些特性共同促进了 Java 的广泛应用和持续的流行。
2.什么是 Java 的多态特性?
多态是面向对象编程中的一个核心概念,它允许子类对象被当作其父类类型来使用,从而提高了代码的灵活性和扩展性。多态在 Java 中主要通过继承和接口实现,它允许我们编写更加通用和可重用的代码。
在你提到的例子中,Person 是一个父类(或接口),Student 是 Person 的一个子类。Person 类中定义了一个 work() 方法,而 Student 类重写了这个方法,使其具有特定的实现,例如 “上学”。当我们声明 Person 类型的变量 person 并将其初始化为 Student 类的对象时:
Person person = new Student();
尽管 person 的类型是 Person,但它实际上引用的是 Student 对象。当我们调用 person.work() 方法时,实际上调用的是 Student 类中的 work() 方法,即 “上学”。这就是多态的体现,即 Person 类型的引用可以调用 Student 类中特定的实现。
多态的另一个常见应用场景是方法重载(overloading)和方法重写(overriding)。方法重载是在同一类中使用相同方法名但参数列表不同的多个方法,而方法重写是在子类中提供与父类方法相同签名但不同实现的方法。
多态的好处在于:
- 代码复用性:子类可以继承父类的属性和方法,同时可以重写父类的方法以提供特定的实现。
- 灵活性:使用父类类型的引用可以调用任何子类的方法,这使得我们可以编写更加通用的代码,而不需要关心具体实现。
- 扩展性:如果需要添加新的子类,只需实现父类或接口的方法即可,无需修改使用这些类的现有代码。
综上所述,多态是 Java 面向对象编程中一个非常强大的特性,它允许我们编写更加灵活、可扩展和可重用的代码。
3.Java 中的参数传递是按值还是按引用?
jvm内存有划分为栈和堆,局部变量和方法参数是在栈上分配的,
参数传递确实遵循“按值传递”的原则,这一点对于基本数据类型和引用类型都适用。但理解这一点的关键在于认识到“值”的含义在两种类型中有所不同。
-
基本数据类型:当我们将基本数据类型的变量作为参数传递给方法时,实际上传递的是该变量的值的副本。这意味着在方法中对参数的修改不会影响到原始变量的值。这是因为基本数据类型(如
int、double等)直接存储在栈中,而方法调用时传递的是这些值的副本。 -
引用类型:对于引用类型的变量(如对象的引用),情况略有不同。虽然 Java 中的参数传递仍然是按值传递,但这里“值”指的是对象在堆中的引用,而不是对象本身。因此,当我们传递一个引用类型的参数时,实际上传递的是指向堆中对象的引用的副本。这意味着如果在方法中修改了对象的属性(而不是修改引用本身),这些改变会反映在原始对象上,因为方法中和原始代码中使用的是指向同一堆中对象的引用。
例如,考虑以下代码:
class Point {int x, y;Point(int x, int y) {this.x = x;this.y = y;}
}public class Test {public static void main(String[] args) {Point p1 = new Point(10, 20);changePoint(p1);System.out.println(p1.x + ", " + p1.y); // 输出:100, 200}public static void changePoint(Point p) {p.x = 100;p.y = 200;}
}
在这个例子中,changePoint 方法接收一个 Point 类型的参数 p。虽然传递的是 p1 引用的副本,但是对 p 对象属性的修改(p.x 和 p.y)会反映在原始的 p1 对象上,因为 p 和 p1 都指向堆中同一 Point 对象。
总结来说,Java 中无论是基本类型还是引用类型,参数传递都是按值传递。但对于引用类型,值是指向堆中对象的引用,而不是对象本身。因此,方法内部对对象的修改会影响原始对象,但对引用的重新赋值(如 p = new Point(0, 0);)则不会影响到方法外部的原始引用。
4.为什么 Java 不支持多重继承?
Java 语言设计者决定不支持多重继承(multiple inheritance)主要是为了避免一些复杂性和潜在的问题。下面是一些主要原因:
-
钻石问题:这是多重继承中最著名的冲突之一。当一个类从两个或多个父类继承,并且这些父类又有一个共同的父类时,就会出现这个问题。这会导致类的实例不知道使用哪个版本的方法或属性,从而产生歧义。
-
命名冲突:如果一个类从两个不同的类继承了同名的方法或变量,那么该类将无法确定使用哪一个定义。
-
复杂的依赖关系:多重继承可能导致复杂的类层次结构和难以追踪的依赖关系,这增加了理解和维护代码的难度。
-
设计哲学:Java 的设计者们希望保持语言简单、一致并且易于学习。多重继承可能会使语言变得过于复杂。
为了应对这些问题并仍然提供类似多重继承的功能,Java 引入了接口(interface)。接口可以包含方法声明但不能包含方法实现(在 Java 8 之后,接口可以包含默认方法和静态方法),类可以实现多个接口来获得多重继承的一些好处,同时避免上述提到的问题。
此外,Java 还通过使用内部类、匿名类和 lambda 表达式等特性提供了其他方式来实现代码复用和模块化。这些机制有助于解决单一继承带来的限制,同时保持语言的简洁性。
5.什么是 Java 中的不可变类?
在 Java 中,不可变类(Immutable Class)是指一旦创建了一个类的实例(对象),其状态(成员变量的值)就不能再被改变的类。不可变类的主要特点包括:
-
成员变量不可更改:所有的成员变量都应该声明为
final,以确保它们只能在构造函数中被初始化一次,并且之后不能被修改。 -
没有 setter 方法:不可变类通常不提供任何方法来修改其成员变量的值。
-
只读访问:提供 getter 方法来获取成员变量的值,但如果是可变对象,则返回该对象的不可变副本或防御性副本,以防止外部修改。
-
线程安全性:由于不可变对象的状态不会改变,它们自然具备线程安全性。多个线程可以共享同一个不可变对象实例,而不用担心数据竞争或同步问题。
-
哈希码一致性:不可变对象的
hashCode()和equals(Object obj)方法实现必须保证即使在多次调用时也始终返回相同的值。这是因为不可变对象的值不会改变,所以它们的哈希码也不应该改变。
Java 中常见的不可变类包括:
String:字符串一旦创建后,其内容就不可更改。- 包装类如
Integer、Long、Double等:这些类封装了基本数据类型,并且一旦创建,其值就不能改变。 BigInteger和BigDecimal:这两个类处理大整数和高精度数值,也是不可变的。
创建不可变类的一般步骤如下:
- 将所有字段声明为
private和final。 - 提供一个构造函数,在其中初始化这些
final字段。 - 不提供任何可以修改这些字段的方法(即不提供 setter 方法)。
- 如果类中包含可变对象,那么提供这些对象的不可变视图或副本。
- 实现
equals和hashCode方法,确保对象的相等性和哈希码的一致性。
不可变类在并发编程中非常有用,因为它们不需要额外的同步措施就可以在多线程环境中安全地共享。
总结

面试题目比较友好,可以去看看。
相关文章:
题海战术,面试必胜秘诀
目录 1.Java 的优势是什么?2.什么是 Java 的多态特性?3.Java 中的参数传递是按值还是按引用?4.为什么 Java 不支持多重继承?5.什么是 Java 中的不可变类?总结 题目 来自面试鸭刷题神器 1.Java 的优势是什么? Java 的跨平台性、垃圾回收机制以及其强…...
设计模式详解(十九)——命令模式
命令模式简介 命令模式定义 命令模式(Command Pattern)是一种在面向对象程序设计中常用的行为型设计模式。命令模式的核心思想在于将请求封装成一个对象,从而使发出请求的责任和执行请求的责任分割开。它可以让请求发送者和请求接收者之间消…...
实战:MySQL数据同步神器之Canal
1.概叙 场景一:数据增量实时同步 项目中业务数据量比较大,每类业务表都达到千万级别,虽然做了分库分表,每张表数据控制在300W以下,但是效率还是达不到要求,为了提高查询效率,打算使用ES进行数…...
5.6软件工程-运维
运维 系统转换系统维护系统评价练习题 系统转换 新老系统的转换 系统转换是指:新系统开发完毕,投入运行,取代现有系统的过程,需要考虑多方面的问题,以实现与老系统的交接,有一下三种转换计划: …...
在JavaScript中如何确保构造函数只被new调用
构造函数是一个特殊的函数,用于初始化一个新创建的对象。它是在创建对象时自动调用的。构造函数通常用于为对象的属性赋值,或者执行其他必要的设置。 使用函数名大写字母开头,这是一种命名约定,用于区分构造函数和普通函数。如何…...
【数据结构算法经典题目刨析(c语言)】反转链表(图文详解)
💓 博客主页:C-SDN花园GGbond ⏩ 文章专栏:数据结构经典题目刨析(c语言) 目录 一、题目描述 二、思路分析 三、代码实现 一、题目描述: 二、思路分析 : 通过三个指针n1,n2,n3来实现链表的反转 1.首先初始化 n1为…...
机器学习之争:Python vs R,谁更胜一筹?
一、引言 随着人工智能和大数据的迅速发展,机器学习已成为现代科技的重要组成部分。在医疗、金融、零售、制造等多个领域,机器学习技术的应用无处不在。从数据分析到预测建模,再到深度学习,机器学习正在改变我们的工作和生活方式…...
Vulnhub靶机:JANGOW_ 1.0.1
目录 前言: 一、安装虚拟机Jangow:1.0.1靶机 二、Web部分 前言: 难度:简单,本文使用VirtualBox打开,下载地址: https://download.vulnhub.com/jangow/jangow-01-1.0.1.ova 一、安装虚拟机J…...
Python脚本实现USB自动复制文件
USB驱动器作为常见的数据存储设备,经常用于数据传输和备份。 然而,我们在手动处理文件复制可能效率低下且容易出错。 因此,我们可以利用Python编写脚本来自动化这一过程,提高效率和数据安全性。 准备工作 首先,我们需…...
【C++学习第19天】最小生成树(对应无向图)
一、最小生成树 二、代码 1、Prim算法 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 510, INF 0x3f3f3f3f;int n, m; int g[N][N]; int dist[N]; bool st[N];int prim() {memset(dist, 0x3f, sizeof di…...
第一个 Flask 项目
第一个 Flask 项目 安装环境创建项目启动程序访问项目参数说明Flask对象的初始化参数app.run()参数 应用程序配置参数使用 Flask 的 config.from_object() 方法使用 Flask 的 config.from_pyfile() 方法使用 Flask 的 config.from_envvar() 方法步骤 1: 设置环境变量步骤 2: 编…...
利用 Angular 发挥环境的力量
一.介绍 您是否曾想过如何在不同的环境中为同一应用设置不同的颜色、标题或 API 调用?可以肯定的是,生产 API 和测试 API 是不同的,应谨慎使用。部署时,我们不会在项目的所有地方手动更改所有 API 调用。不应这样做,因…...
Vue3+TypeScript+printjs 实现标签批量打印功能
前言:临时性需求没怎么接触过前端,代码实现有问题及优化点希望大佬可以留言告知一下 开发工具:VS CODE 界面开发:Vue3TypeScriptElementPlus 打印组件:Print-JS 前端打印入口图: 标签页面: …...
微信文件如何直接打印及打印功能在哪里设置?
在数字化时代,打印需求依旧不可或缺,但传统打印店的高昂价格和不便操作常常让人头疼。幸运的是,琢贝打印作为一款集便捷、经济、高效于一体的网上打印平台,正逐渐成为众多用户的首选。特别是通过微信小程序下单,更是让…...
dataX -20240804-master分支
1、相关报错 Error: java.io.IOException: java.lang.RuntimeException: ORC split generation failed with exception: org.apache.orc.impl.SchemaEvolution$IllegalEvolutionException: ORC does not support type conversion from file type struct<nanos:int> (10)…...
【网络】传输层
传输层 一、预备知识1、端口号1、端口号范围划分2、知名端口号3、两个问题4、netstat && iostate5、pidof6、谈下面协议始终铭记两个问题 二、UDP协议(简单)1、UDP协议端格式2、UDP的特点3、面向数据报4、UDP缓冲区 三、TCP协议(重点…...
学生管理系统之更新和删除、筛选
学生管理系统之更新和删除 建立新的窗口 添加组件 进行布局 使用Widget把二个放在一块,作为一列,然后全选进行栅格布局,最后添加弹簧进行微调。 编写增加的槽函数 在主函数中调用对话框...
教您一键批量下载拼多多批发图片信息,节省时间
图片是电商的核心展示手段,高质量、吸引人的图片能显著提升商品吸引力,增强用户体验,促进购买决策。良好的视觉呈现有助于品牌形象的塑造,提高转化率和客户满意度,对电商平台的流量和销售业绩具有直接影响。 使用图快…...
基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)
博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙ÿ…...
去噪扩散恢复模型
去噪扩散恢复模型 Bahjat Kawar 计算机科学系 以色列海法理工学院 bahjat.kawarcs.technion.ac.il Michael Elad 计算机科学系 以色列海法理工学院 eladcs.technion.ac.il Stefano Ermon 计算机科学系 美国加利福尼亚州斯坦福大学 ermoncs.stanford.edu …...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
Golang dig框架与GraphQL的完美结合
将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用,可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器,能够帮助开发者更好地管理复杂的依赖关系,而 GraphQL 则是一种用于 API 的查询语言,能够提…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
CMake控制VS2022项目文件分组
我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
