题海战术,面试必胜秘诀
目录
- 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 …...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

C++ 设计模式 《小明的奶茶加料风波》
👨🎓 模式名称:装饰器模式(Decorator Pattern) 👦 小明最近上线了校园奶茶配送功能,业务火爆,大家都在加料: 有的同学要加波霸 🟤,有的要加椰果…...

FFmpeg:Windows系统小白安装及其使用
一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】,注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录(即exe所在文件夹)加入系统变量…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...