当前位置: 首页 > news >正文

题海战术,面试必胜秘诀

目录

  • 1.Java 的优势是什么?
    • 2.什么是 Java 的多态特性?
    • 3.Java 中的参数传递是按值还是按引用?
    • 4.为什么 Java 不支持多重继承?
    • 5.什么是 Java 中的不可变类?
      • 总结

题目
来自面试鸭刷题神器

1.Java 的优势是什么?

Java 的跨平台性、垃圾回收机制以及其强大的生态是其成为业界广泛使用的语言的关键因素。

  1. 跨平台性(Write Once, Run Anywhere,WORA)
    Java 的这一特性得益于 JVM(Java 虚拟机),它作为运行 Java 字节码的中间层,允许 Java 程序在任何安装了 JVM 的平台上运行。这种平台无关性极大地简化了开发和部署过程,减少了为不同操作系统编写和维护不同版本代码的需要。

  2. 垃圾回收机制(Garbage Collection)
    Java 的垃圾回收(GC)机制自动管理内存,这意味着开发者无需手动分配和释放内存,从而减少了内存泄漏和其他内存管理错误的风险。虽然这可能会导致一些运行时的性能开销,尤其是在 GC 进行时,但对于大多数应用程序而言,这种开销被自动内存管理带来的开发效率提升和减少错误的便利所抵消。

  3. 丰富的生态系统
    Java 拥有一个庞大且活跃的开发者社区,这导致了大量第三方库、框架和工具的产生,覆盖了从企业级应用开发到移动应用开发的广泛领域。Spring、Hibernate、Struts 等框架极大地简化了企业级应用的开发,而 Android 开发主要使用 Java,进一步扩大了 Java 的应用范围。此外,丰富的文档和在线资源使得学习和解决问题更加容易。

综上所述,Java 的跨平台性、自动垃圾回收和强大的生态系统,使其成为开发高效、可移植和可维护软件的理想选择,特别是在企业级应用、Web 开发和移动应用开发等领域。这些特性共同促进了 Java 的广泛应用和持续的流行。


2.什么是 Java 的多态特性?

多态是面向对象编程中的一个核心概念,它允许子类对象被当作其父类类型来使用,从而提高了代码的灵活性和扩展性。多态在 Java 中主要通过继承和接口实现,它允许我们编写更加通用和可重用的代码。

在你提到的例子中,Person 是一个父类(或接口),StudentPerson 的一个子类。Person 类中定义了一个 work() 方法,而 Student 类重写了这个方法,使其具有特定的实现,例如 “上学”。当我们声明 Person 类型的变量 person 并将其初始化为 Student 类的对象时:

Person person = new Student();

尽管 person 的类型是 Person,但它实际上引用的是 Student 对象。当我们调用 person.work() 方法时,实际上调用的是 Student 类中的 work() 方法,即 “上学”。这就是多态的体现,即 Person 类型的引用可以调用 Student 类中特定的实现。

多态的另一个常见应用场景是方法重载(overloading)和方法重写(overriding)。方法重载是在同一类中使用相同方法名但参数列表不同的多个方法,而方法重写是在子类中提供与父类方法相同签名但不同实现的方法。

多态的好处在于:

  1. 代码复用性:子类可以继承父类的属性和方法,同时可以重写父类的方法以提供特定的实现。
  2. 灵活性:使用父类类型的引用可以调用任何子类的方法,这使得我们可以编写更加通用的代码,而不需要关心具体实现。
  3. 扩展性:如果需要添加新的子类,只需实现父类或接口的方法即可,无需修改使用这些类的现有代码。

综上所述,多态是 Java 面向对象编程中一个非常强大的特性,它允许我们编写更加灵活、可扩展和可重用的代码。

3.Java 中的参数传递是按值还是按引用?

jvm内存有划分为栈和堆,局部变量和方法参数是在栈上分配的,
参数传递确实遵循“按值传递”的原则,这一点对于基本数据类型和引用类型都适用。但理解这一点的关键在于认识到“值”的含义在两种类型中有所不同。

  1. 基本数据类型:当我们将基本数据类型的变量作为参数传递给方法时,实际上传递的是该变量的值的副本。这意味着在方法中对参数的修改不会影响到原始变量的值。这是因为基本数据类型(如 intdouble 等)直接存储在栈中,而方法调用时传递的是这些值的副本。

  2. 引用类型:对于引用类型的变量(如对象的引用),情况略有不同。虽然 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.xp.y)会反映在原始的 p1 对象上,因为 pp1 都指向堆中同一 Point 对象。

总结来说,Java 中无论是基本类型还是引用类型,参数传递都是按值传递。但对于引用类型,值是指向堆中对象的引用,而不是对象本身。因此,方法内部对对象的修改会影响原始对象,但对引用的重新赋值(如 p = new Point(0, 0);)则不会影响到方法外部的原始引用。

4.为什么 Java 不支持多重继承?

Java 语言设计者决定不支持多重继承(multiple inheritance)主要是为了避免一些复杂性和潜在的问题。下面是一些主要原因:

  1. 钻石问题:这是多重继承中最著名的冲突之一。当一个类从两个或多个父类继承,并且这些父类又有一个共同的父类时,就会出现这个问题。这会导致类的实例不知道使用哪个版本的方法或属性,从而产生歧义。

  2. 命名冲突:如果一个类从两个不同的类继承了同名的方法或变量,那么该类将无法确定使用哪一个定义。

  3. 复杂的依赖关系:多重继承可能导致复杂的类层次结构和难以追踪的依赖关系,这增加了理解和维护代码的难度。

  4. 设计哲学:Java 的设计者们希望保持语言简单、一致并且易于学习。多重继承可能会使语言变得过于复杂。

为了应对这些问题并仍然提供类似多重继承的功能,Java 引入了接口(interface)。接口可以包含方法声明但不能包含方法实现(在 Java 8 之后,接口可以包含默认方法和静态方法),类可以实现多个接口来获得多重继承的一些好处,同时避免上述提到的问题。

此外,Java 还通过使用内部类、匿名类和 lambda 表达式等特性提供了其他方式来实现代码复用和模块化。这些机制有助于解决单一继承带来的限制,同时保持语言的简洁性。

5.什么是 Java 中的不可变类?

在 Java 中,不可变类(Immutable Class)是指一旦创建了一个类的实例(对象),其状态(成员变量的值)就不能再被改变的类。不可变类的主要特点包括:

  1. 成员变量不可更改:所有的成员变量都应该声明为 final,以确保它们只能在构造函数中被初始化一次,并且之后不能被修改。

  2. 没有 setter 方法:不可变类通常不提供任何方法来修改其成员变量的值。

  3. 只读访问:提供 getter 方法来获取成员变量的值,但如果是可变对象,则返回该对象的不可变副本或防御性副本,以防止外部修改。

  4. 线程安全性:由于不可变对象的状态不会改变,它们自然具备线程安全性。多个线程可以共享同一个不可变对象实例,而不用担心数据竞争或同步问题。

  5. 哈希码一致性:不可变对象的 hashCode()equals(Object obj) 方法实现必须保证即使在多次调用时也始终返回相同的值。这是因为不可变对象的值不会改变,所以它们的哈希码也不应该改变。

Java 中常见的不可变类包括:

  • String:字符串一旦创建后,其内容就不可更改。
  • 包装类如 IntegerLongDouble 等:这些类封装了基本数据类型,并且一旦创建,其值就不能改变。
  • BigIntegerBigDecimal:这两个类处理大整数和高精度数值,也是不可变的。

创建不可变类的一般步骤如下:

  1. 将所有字段声明为 privatefinal
  2. 提供一个构造函数,在其中初始化这些 final 字段。
  3. 不提供任何可以修改这些字段的方法(即不提供 setter 方法)。
  4. 如果类中包含可变对象,那么提供这些对象的不可变视图或副本。
  5. 实现 equalshashCode 方法,确保对象的相等性和哈希码的一致性。

不可变类在并发编程中非常有用,因为它们不需要额外的同步措施就可以在多线程环境中安全地共享。

总结

在这里插入图片描述

面试题目比较友好,可以去看看。

相关文章:

题海战术,面试必胜秘诀

目录 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 调用&#xff1f;可以肯定的是&#xff0c;生产 API 和测试 API 是不同的&#xff0c;应谨慎使用。部署时&#xff0c;我们不会在项目的所有地方手动更改所有 API 调用。不应这样做&#xff0c;因…...

Vue3+TypeScript+printjs 实现标签批量打印功能

前言&#xff1a;临时性需求没怎么接触过前端&#xff0c;代码实现有问题及优化点希望大佬可以留言告知一下 开发工具&#xff1a;VS CODE 界面开发&#xff1a;Vue3TypeScriptElementPlus 打印组件&#xff1a;Print-JS 前端打印入口图&#xff1a; 标签页面&#xff1a; …...

微信文件如何直接打印及打印功能在哪里设置?

在数字化时代&#xff0c;打印需求依旧不可或缺&#xff0c;但传统打印店的高昂价格和不便操作常常让人头疼。幸运的是&#xff0c;琢贝打印作为一款集便捷、经济、高效于一体的网上打印平台&#xff0c;正逐渐成为众多用户的首选。特别是通过微信小程序下单&#xff0c;更是让…...

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协议&#xff08;简单&#xff09;1、UDP协议端格式2、UDP的特点3、面向数据报4、UDP缓冲区 三、TCP协议&#xff08;重点…...

学生管理系统之更新和删除、筛选

学生管理系统之更新和删除 建立新的窗口 添加组件 进行布局 使用Widget把二个放在一块,作为一列,然后全选进行栅格布局,最后添加弹簧进行微调。 编写增加的槽函数 在主函数中调用对话框...

教您一键批量下载拼多多批发图片信息,节省时间

图片是电商的核心展示手段&#xff0c;高质量、吸引人的图片能显著提升商品吸引力&#xff0c;增强用户体验&#xff0c;促进购买决策。良好的视觉呈现有助于品牌形象的塑造&#xff0c;提高转化率和客户满意度&#xff0c;对电商平台的流量和销售业绩具有直接影响。 使用图快…...

基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)

博主介绍&#xff1a;✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍&#xff1a;我是程序员阿龙&#xff…...

去噪扩散恢复模型

去噪扩散恢复模型 Bahjat Kawar 计算机科学系 以色列海法理工学院 bahjat.kawarcs.technion.ac.il Michael Elad 计算机科学系 以色列海法理工学院 eladcs.technion.ac.il Stefano Ermon 计算机科学系 美国加利福尼亚州斯坦福大学 ermoncs.stanford.edu …...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

三体问题详解

从物理学角度&#xff0c;三体问题之所以不稳定&#xff0c;是因为三个天体在万有引力作用下相互作用&#xff0c;形成一个非线性耦合系统。我们可以从牛顿经典力学出发&#xff0c;列出具体的运动方程&#xff0c;并说明为何这个系统本质上是混沌的&#xff0c;无法得到一般解…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

select、poll、epoll 与 Reactor 模式

在高并发网络编程领域&#xff0c;高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表&#xff0c;以及基于它们实现的 Reactor 模式&#xff0c;为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。​ 一、I…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...