题海战术,面试必胜秘诀
目录
- 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 …...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

ArcGIS Pro制作水平横向图例+多级标注
今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作:ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等(ArcGIS出图图例8大技巧),那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...