题海战术,面试必胜秘诀

news2025/1/23 23:32:03

目录

  • 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 方法,确保对象的相等性和哈希码的一致性。

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

总结

在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1978024.html

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

相关文章

【EtherCAT】Windows+Visual Studio配置SOEM主站——源码配置

目录 一、准备工作 1. Visual Studio 2022 2. Npcap 1.79 3. SOEM源码 二、源码部署 1. 新建Visual Studio工程 2. 创建文件夹 3. 创建主函数 4. 复制源代码 5. 删除无关项 6. 将soem源码添加进工程 7. 添加soem头文件 8. 配置头文件路径 9. 配置静态库和静态库路…

xdma的linux驱动编译给arm使用(中断检测-测试程序)

1、驱动链接 XDMA驱动源码官网下载地址为:https://github.com/Xilinx/dma_ip_drivers 下载最新版本的XDMA驱动源码,即master版本,否则其驱动用不了(xdma ip核版本为4.1)。 2、驱动 此部分来源于博客:xd…

多模态MLLM都是怎么实现的(12)-Florence-2

最近一直在打艾尔登法环DLC,疏于更新了,罪过罪过,今天把拉塔恩给过了,也该更新了,停更期间,催更的信息主要是啥时候更新GPU系列的第五篇,不是不更,是刚打完,正好有客户要…

C# Unity 面向对象补全计划 七大原则 之 里氏替换

本文仅作学习笔记与交流,不作任何商业用途,作者能力有限,如有不足还请斧正 本系列作为七大原则和设计模式的进阶知识,看不懂没关系 请看专栏:http://t.csdnimg.cn/mIitr,尤其是关于继承的两篇文章&#xff…

算法022:寻找峰值

寻找峰值. - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/find-peak-element/ 这个题跟上一个题很像,也是寻找一个峰值。此题还特意强调了如果有多个峰…

【数学思维培养】罗博深小学数学青少年数学思维分级课程(3-4年级)

【数学思维培养】罗博深小学数学青少年数学思维分级课程(3-4年级) 背景前摇: 虽然我是学理工科计算机的,但我感觉我在数学方面一直都存在劣势,无论是写程序到了涉及数学计算的地方(比如向量、余弦等&#…

【数据分析--带你认识数据分析,了解数据分析的】

前言: 💞💞大家好,我是书生♡,本阶段和大家一起分享和探索数据分析—基础介绍,本篇文章主要讲述了:数据分析的介绍,Python开源库,配置Jupyter等等。欢迎大家一起探索讨论…

C++程序的编译链接过程

一、预处理 (1) 将所有的#define删除,并且展开所有的宏定义 (2) 处理所有的条件预编译指令,如#if、#ifdef (3) 处理#include预编译指令,将被包含的文件插入到该预编译…

html+css 实现hover边框彩色流动

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…

人工智能深度学习系列—深入探索IoU Loss及其变种:目标检测与分割的精度优化利器

文章目录 1. 背景介绍2. Loss计算公式3. 使用场景4. 代码样例5. 总结 1. 背景介绍 在深度学习的目标检测和分割领域,评估预测结果与真实标注之间的一致性是提升模型性能的关键。IoU Loss(Intersection over Union Loss)及其变种损失函数&…

【人工智能五】人工智能基础习题

文章目录 壹. 内容补充一. VR/AR/MR的区别1. 三者概念2. 区别 二. 深度学习重要算法及人物介绍1. 反向传播算法2. 卷积神经网络 贰. 习题精选1一. 选择二. 判断题三. 填空题四. 简单题1. 综合2. 深度学习与神经网络 壹. 内容补充 一. VR/AR&…

人工智能与机器学习的相关介绍

文章目录 人工智能的发展历程人工智能与机器学习关系图谱数据处理机器学习ML和深度学习DL的区别人工智能按照学习方式划分监督学习算法无监督学习算法总结 人工智能的发展历程 重要的时间点了解一下: 早在1950年人工智能就已经开始兴起 1997年deep blue战胜了人类国…

一款功能强大的屏幕演示工具,免费版足够使用!

鼠标换肤 | 屏幕画笔 | 放大镜 | 聚光灯 | 屏幕放大 | 倒计时,功能强大的屏幕演示工具 屏幕演示工具适用于Windows平台,特别是Windows 10及以上版本。该软件提供了多种实用功能,包括鼠标换肤、屏幕画笔、放大镜、聚光灯、屏幕放大和倒计时等…

k8s集群的资源发布方式(滚动/蓝绿/灰度发布)及声明式管理方法

目录 1.常见的发布方式 2.滚动发布 3.蓝绿发布 4.实现金丝雀发布(Canary Release) 5.声明式管理方法 1.常见的发布方式 蓝绿发布:两套环境交替升级,旧版本保留一定时间便于回滚优点:用户无感知,部署和回滚速度较…

基于强化学习算法玩CartPole游戏

什么事CartPole游戏 CartPole(也称为倒立摆问题)是一个经典的控制理论和强化学习的基础问题,通常用于测试和验证控制算法的性能。具体来说,它是一个简单的物理模拟问题,其目标是通过在一个平衡杆(倒立摆&a…

Cesium初探-坐标转换

Cesium的坐标系分三种:屏幕坐标、笛卡尔空间直角坐标、地理坐标。 屏幕坐标 屏幕坐标系是一个是平面直角坐标系,即二维笛卡尔坐标系,屏幕左上角为原点(0,0),单位为像素值,屏幕水平方向为X轴&a…

Python | SyntaxError: invalid syntax 深度解析

Python | SyntaxError: invalid syntax 深度解析 在Python编程中,SyntaxError: invalid syntax是一个常见的错误,它表明Python解释器在尝试解析代码时遇到了语法问题。这个错误通常是由于代码中存在拼写错误、缺少符号(如括号、冒号或逗号&a…

Java中的Map(如果想知道Java中有关Map的知识点,那么只看这一篇就足够了!)

前言:在Java编程语言中,集合框架(Collection Framework)提供了一系列用于存储和操作数据的接口和类。其中,Map和Set是两个非常重要的接口,分别用于存储键值对和无重复元素的集合。 ✨✨✨这里是秋刀鱼不做梦…

Nerd Fonts

文章目录 关于 Nerd Fonts重要告示TL;DR字体的各种下载选项 特点 Glyph Setsshell中的图标名称 修补字体Variations 字体安装Option 1: Release Archive DownloadOption 2: Homebrew FontsOption 3: Unofficial Chocolatey or Scoop RepositoriesOption 4: Arch Extra Reposito…

AI在医学领域:医学成像中针对深度神经网络(DNN)的对抗性攻击及其防御策略

关键词:对抗性攻击、医学图像、深度神经网络、模型安全、鲁棒性 机器学习(ML)是医学领域快速发展的一个分支,它利用计算机科学和统计学的方法来解决医学问题。众所周知,攻击者可能通过故意为机器学习分类器创建输入来…