Java对象、类、接口——针对实习面试

目录

  • Java对象、类、接口
    • 你知道类和对象的区别吗?
    • 抽象类和接口有什么共同点?
    • 抽象类和接口有什么区别?
    • 说一下面向对象的三大特征及其特点?
    • 你知道Java中方法重载和重写的区别吗?
    • 静态成员和非静态成员有什么区别?
    • 使用==和equals方法有什么区别?
    • hashCode()有什么用?
    • 为什么重写equals()时必须要重写hashCode()方法?

Java对象、类、接口

在这里插入图片描述

你知道类和对象的区别吗?

  1. 定义

    • :类是一个蓝图或模板,它定义了一类对象的属性(成员变量)和方法(成员函数)。类描述了对象的行为和状态,但不占用内存空间。
    • 对象对象是根据类创建的实例,是类的具体化。每个对象都拥有自己的内存空间,并且包含类定义的所有属性和方法。
  2. 实例化

    • :类不能直接使用,需要通过实例化过程创建对象。
    • 对象:对象是类的实例,可以直接创建和使用。
  3. 代码与数据的结合

    • :类是代码和数据的结合,它封装了数据和操作数据的方法。
    • 对象:对象是类的实例,包含了实际的数据和可以操作这些数据的方法。
  4. 唯一性

    • :一个类可以被看作是一个模板,它是唯一的,不会因创建多个对象而改变。
    • 对象:每个对象都是独一无二的,即使它们来自同一个类,每个对象的状态(属性值)也可以不同。

简而言之,类是创建对象的模板,而对象是类的具体实例,具有类定义的所有属性和行为。类定义了对象的结构和行为,对象则体现了类的实体和状态

抽象类和接口有什么共同点?

  1. 不能被实例化

    • 抽象类和接口都不能直接实例化。你不能创建一个抽象类或接口类型的对象。
  2. 包含抽象方法

    • 它们都可以包含抽象方法,这些方法只有声明没有实现,目的是让子类或实现类去具体实现这些方法。

抽象类和接口有什么区别?

  1. 继承和实现

    • 一个类只能继承一个抽象类,但可以实现多个接口
    • 使用extends关键字来继承抽象类,使用implements关键字来实现接口。
  2. 成员变量

    • 抽象类可以有实例变量、静态变量和常量
    • 接口中只能有静态常量(Java 8之前)或默认方法和静态方法(Java 8及以后)。
  3. 方法实现

    • 抽象类可以包含非抽象方法,即具体实现的方法。
    • 接口中的所有方法默认都是抽象的,但在Java 8及以后的版本中,接口可以包含默认方法(有默认实现的方法)和静态方法。
  4. 访问修饰符

    • 抽象类中的成员可以是private、protected、public等。
    • 接口中的成员在Java 8之前默认是public static final的,方法默认是public abstract的。从Java 9开始,接口字段默认是private的,但可以通过publicprotectedprivate显式指定。
  5. 设计目的

    • 抽象类用于表示具有共同属性和方法的一组特定类型,它们之间通常存在“是一个”(is-a)的关系。
    • 接口用于定义类必须遵循的协议或行为规范,它们之间存在“实现”(implements)的关系。
  6. 方法体

    • 抽象类中可以有方法的实现(具体方法)。
    • 接口中的方法在Java 8之前都是没有实现的,但从Java 8开始,接口可以有默认方法和静态方法的实现。

说一下面向对象的三大特征及其特点?

面向对象编程(OOP)的三大特征是封装(Encapsulation)、继承(Inheritance)和多态(Polymorphism)。

  1. 封装(Encapsulation)

    • 定义:封装是将数据(属性)和操作数据的方法(行为)捆绑在一起的编程技术,它隐藏了对象的内部状态和复杂性,只暴露出对象的接口。
    • 特点
      • 数据隐藏:通过访问修饰符(如private)保护对象的内部状态,防止外部直接访问和修改。
      • 接口暴露:通过公共方法(如getter和setter)提供对内部状态的访问和修改。
      • 实现细节隐藏:对象的内部实现对使用者是透明的,提高了代码的安全性和易用性。
  2. 继承(Inheritance)

    • 定义:继承是一种创建新类的方式,新类(子类或派生类)可以继承现有类(父类或基类)的属性和方法,允许代码复用。
    • 特点
      • 代码复用:子类可以继承父类的代码,减少了重复代码的编写。
      • 层次结构:通过继承可以建立类之间的层次关系,体现了现实世界的“是一个”(is-a)关系。
      • 方法重写:子类可以重写父类的方法,以提供特定的实现,增强了代码的灵活性。
  3. 多态(Polymorphism)

    • 定义:多态是指允许不同类的对象对同一消息做出响应的能力,即同一个接口可以被不同的实例以不同的方式实现。
    • 特点
      • 接口多样性:不同的对象可以对同一消息(方法调用)做出不同的响应。
      • 动态绑定:在运行时根据对象的实际类型来决定调用哪个方法,而不是在编译时决定。
      • 代码灵活性:多态使得代码更加通用和灵活,易于扩展和维护。

通过封装,对象隐藏了内部的复杂性;
继承支持了代码的复用和层次结构;
多态则允许对象以统一的方式处理不同的实现,提高了代码的通用性和灵活性。

你知道Java中方法重载和重写的区别吗?

  1. 方法重载(Overloading)

    • 定义方法重载是指在同一个类中,可以有多个同名方法,只要它们的参数列表不同(参数的类型、数量或顺序不同)
    • 目的:允许开发者编写多个同名方法,这些方法可以有不同的参数,从而提供不同的功能。
    • 特点
      • 方法签名必须不同,即参数列表不同。
      • 返回类型可以相同也可以不同。
      • 与访问修饰符无关,只与参数列表有关。
      • 发生在编译时,称为编译时多态。
  2. 方法重写(Overriding)

    • 定义方法重写是指在子类中重新定义一个与父类中具有相同名称、参数列表和返回类型的方法
    • 目的:允许子类提供特定的实现,以改变从父类继承来的方法的行为。
    • 特点
      • 方法签名必须完全相同,即方法名、参数列表和返回类型都相同。
      • 子类方法的访问权限不能低于父类方法的访问权限。
      • 子类方法不能抛出新的检查异常或比父类方法声明更宽泛的异常。
      • 发生在运行时,称为运行时多态。

区别

  • 编译时 vs 运行时:重载在编译时确定具体使用哪个方法,而重写在运行时根据对象的实际类型来确定调用哪个方法。
  • 参数列表:重载的方法参数列表必须不同,而重写的方法参数列表必须相同。
  • 返回类型:重载的方法可以有不同返回类型,而重写的方法返回类型必须与父类方法相同或兼容。
  • 继承:重写涉及到继承,即子类重写父类的方法;而重载不涉及继承,是同一个类中方法的多态。

静态成员和非静态成员有什么区别?

  1. 内存分配

    • 静态成员静态成员属于类,而不是类的某个特定对象。它们在类加载时分配内存,并且由类的所有实例共享。
    • 非静态成员非静态成员属于对象,每个对象实例都有自己的一份拷贝,它们在对象创建时分配内存。
  2. 使用场景

    • 静态成员适用于不依赖于对象状态的数据和行为,例如工具类中的常量和工具方法。
    • 非静态成员适用于依赖于对象状态的数据和行为,每个对象实例可能有不同的状态。
  3. 与对象的关系

    • 静态成员不依赖于任何对象实例,即使没有创建类的任何实例,也可以访问静态成员。
    • 非静态成员依赖于对象实例,必须先创建实例,然后才能访问非静态成员。
  4. 继承和多态

    • 静态成员静态方法不能被重写(Override),但可以被隐藏(Hide)
    • 非静态成员:非静态方法可以被重写,这是实现多态的重要方式。

使用==和equals方法有什么区别?

在Java中,==equals() 方法都可以用来比较两个对象,但它们的区别和用途是不同的:

  1. == 操作符

    • == 是一个操作符,用来比较两个引用是否指向同一对象(即是否相同)。
    • 对于基本数据类型(如int、double等),== 比较的是
    • 对于引用数据类型(如类的对象),== 比较的是两个引用的内存地址,即它们是否指向堆内存中的同一个对象。
  2. equals() 方法

    • equals() 是一个方法,定义在Object类中,用来比较对象内容的相等性。
    • 默认行为是比较引用,即检查两个引用是否指向同一个对象,这与==相同。
      -== 但是,equals() 方法可以被覆写(override),以提供更复杂的逻辑来比较对象的状态(属性)是否相等==。
  3. 使用场景

    • 当你需要比较两个对象是否是同一个实例时,使用==
    • 当你需要比较两个对象的“内容”或“状态”是否相同时,使用equals()
  4. 性能

    • == 比较的是引用,所以它的执行速度非常快
    • equals() 方法可能包含更多的逻辑判断,所以它的执行速度可能比==
  5. 一致性

    • 对于equals()方法,有以下一致性约定:
      • 自反性:x.equals(x) 必须返回 true
      • 对称性:x.equals(y)y.equals(x) 必须返回相同的结果。
      • 传递性:如果 x.equals(y)y.equals(z) 都返回 true,那么 x.equals(z) 也必须返回 true
      • 一致性:如果 x.equals(y) 返回 true,那么在对象 xy 没有被修改的情况下,后续调用也必须返回 true
      • 对于任何非空引用值 xx.equals(null) 必须返回 false
  6. hashCode() 的关系

    • 如果两个对象通过 equals() 方法比较是相等的,那么它们的 hashCode() 方法必须返回相同的值。这是为了在哈希表(如 HashMap)中保持一致性

hashCode()有什么用?

在Java中,hashCode() 方法是一个非常关键的概念,主要用于以下几个方面:

  1. 哈希表的实现

    • hashCode() 方法是Object类的一个方法,它返回一个整数,这个整数是对象的哈希码。哈希码主要用于哈希表(如HashMapHashSet等)的实现,这些数据结构使用哈希码来快速定位对象的存储位置
  2. 快速查找

    • 在哈希表中,通过对象的哈希码可以快速计算出该对象在表中的索引位置,从而快速查找对象。这大大提高了查找效率,特别是在大型数据集中。
  3. 相等性检查

    • 当两个对象通过equals()方法比较结果为相等时,它们的hashCode()方法必须返回相同的值。这是equals()方法和hashCode()方法之间的一个约定,以确保在哈希表中相等的对象具有相同的哈希码。
  4. 集合操作

    • 在集合操作中,hashCode()方法用于检查对象是否已经存在于集合中,或者在集合中查找特定对象时,帮助快速定位对象。
  5. 性能优化

    • 良好的hashCode()实现可以减少哈希冲突,提高哈希表的性能。如果两个不同对象返回相同的哈希码,这称为哈希冲突,可能会导致性能下降。
  6. 缓存实现

    • 在缓存实现中,hashCode()方法可以用来快速确定对象的存储位置,从而实现快速的数据检索。
  7. 一致性

    • 在分布式系统中,hashCode()方法可以用于数据分区,确保相同对象被分配到相同的节点或分区。
  8. 对象的唯一标识

    • 在某些情况下,hashCode()方法可以作为对象的唯一标识,尤其是在对象存储在哈希表中时。

为什么重写equals()时必须要重写hashCode()方法?

在Java中,当你重写一个类的equals()方法时,通常也需要重写hashCode()方法,原因主要与哈希表(如HashMapHashSet)的内部实现机制有关。以下是详细解释:

  1. 一致性要求

    • equals()hashCode()方法之间有一个重要的一致性约定:如果两个对象通过equals()方法比较是相等的,那么它们的hashCode()方法必须返回相同的值。这个约定确保了在哈希表中相等的对象具有相同的哈希码。
  2. 哈希表的工作原理

    • 哈希表使用哈希码来确定对象存储的索引位置。如果两个对象的hashCode()返回不同的值,那么它们会被存储在哈希表的不同位置,即使它们通过equals()方法是相等的。
    • 如果你重写了equals()方法但没有重写hashCode()方法,那么即使两个对象是相等的(根据equals()),它们也可能被存储在哈希表的不同位置,这会导致哈希表无法正确地检索对象
  3. 影响哈希表的性能

    • 如果equals()hashCode()方法不一致,可能会导致哈希表的性能下降。例如,在HashMap中,如果两个相等的对象具有不同的哈希码,它们不会被存储在同一个桶(bucket)中,这可能会导致更多的哈希冲突,从而增加查找和插入操作的时间复杂度。
  4. 集合操作

    • 在使用集合(如HashSet)时,集合会依赖于hashCode()方法来快速检查对象是否已经存在。如果equals()hashCode()不一致,可能会导致集合错误地认为两个相等的对象是不同的,从而违反了集合中元素唯一性的原则。
  5. 示例

    • 假设你有一个Person类,你重写了equals()方法来比较名字和年龄是否相同,但没有重写hashCode()方法。那么,即使两个Person对象的名字和年龄相同,它们也可能因为不同的哈希码而被HashMap存储在不同的位置,导致无法正确地识别和操作这些对象。

因此,当你重写equals()方法时,为了保持一致性并确保哈希表和集合的正确性和性能,你也必须重写hashCode()方法。这样可以确保相等的对象具有相同的哈希码,从而在哈希表和集合中正确地存储和检索对象。

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

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

相关文章

Solana链上的Pump狙击机器人与跟单机器人的工作原理及盈利模式

随着加密货币市场的快速发展,越来越多的投资者和开发者开始关注Solana链上的自动化交易工具。尤其是Pump狙击机器人和跟单机器人,这两种工具为用户提供了在市场波动中获取利润的机会。本文将深入分析这两种机器人的工作原理及其盈利模式。 一、Pump狙击机…

Vue全栈开发旅游网项目(6)-接口开发

1.景点详情接口开发 1.设计响应数据结构 文件地址:sight/serializers.py 创建类: class SightDetailSerializers(BaseSerializer):#景点详情def to_dict(self):obj self.objreturn {id: obj.id,name: obj.name,desc: obj.desc,img: obj.banner_img.…

Flutter学习笔记(二)------ 第一个flutter项目

一、Dart语法 dart语法较为简单,学过python和c后发现大同小异。不过多介绍 1.函数可变参数 可以类比*args, **kwargs,与之不同的是dart中,*args **kwargs不能同时存在 void a(int a, [float x, double b0.0]) {//do something... }a(10, …

MySQL-如果你在添加外键时忘加约束名,如何找到系统默认的约束名

问题 在你添加约束的时候,一般都会为其取名以方便后期的修改,但是如果你忘记了呢,如何找到系统默认的约束名 解决方法 -- 查找约束名 SELECTCONSTRAINT_NAME FROMINFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERETABLE_NAME emp ANDREFERENCED_T…

2-Ubuntu/Windows系统启动盘制作

学习目标: 掌握使用Win32DiskImager、Rufus等工具制作系统启动盘的基本步骤。独立将ISO镜像文件写入USB闪存驱动器,确保在需要时顺利安装或修复系统。通过学习如何选择正确的源文件和目标驱动器,理解启动盘的使用场景和注意事项,…

上云管理之Git/GitHub/GitLab 详解(一)

上云管理之Git/GitHub/GitLab 详解(一) 引言1. GIT软件安装2.初始化配置与提交代码2.1. 初始化配置2.2 本地仓库代码提交2.2.1 初始化仓库并提交代码2.2.2 再次提交已修改的代码2.2.3 文件夹层次结构代码提交 2.3 GIT 的文件状态 3.GIT 分支3.1. 分支的切换与删除3.…

【UltraVNC】使用反向连接方式-部署私有远程工具(简版)

一、简要介绍 反向连接:客户电脑发起连接到维修工程师电脑。 场景:计算机A 无公网IP ,计算机B无公网IP,AB直接进行远程的行为。 核心:借助中继方式 二、安装环境和安装包 中继器服务:linux系统安装包&…

技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代

在当今数字化时代,软件安全问题的严峻性日益凸显。随着网络攻击手段变得愈发复杂多样,切实保障软件系统的安全性已然成为开发者以及企业所面临的核心挑战。依据国际网络安全机构的相关报告,网络攻击事件的发生频率与复杂程度呈现出逐年递增的…

【图书管理与推荐系统】Python+Django网页界面+协同过滤推荐算法+网站系统

一、介绍 图书管理与推荐系统。使用Python作为主要开发语言。前端采用HTML、CSS、BootStrap等技术搭建界面结构,后端采用Django作为逻辑处理,通过Ajax等技术实现数据交互通信。在图书推荐方面使用经典的协同过滤算法作为推荐算法模块。主要功能有&#…

达梦asm创建磁盘组

达梦ASM磁盘组创建过程 安装dsc建库前需要配置asm磁盘组,通常编辑一个文件 vim /dm/dmdbms/config/create_asm_group.txt #asm script file create diskgroup ARCH asmdisk /dev/asmdisk/dsc_asm1 create diskgroup DATA asmdisk /dev/asmdisk/dsc_asm2 alter di…

Selenium常见问题解析

1、元素定位失败: 在使用Selenium自动化测试时,最常见的问题之一是无法正确地定位元素,这可能导致后续操作失败。解决方法包括使用不同的定位方式(如xpath、CSS selector、id等),等待页面加载完全后再进行…

C++:set和map的使用

目录 序列式容器和关联式容器 set set类的介绍 构造和迭代器 增删查 insert find和erase erase迭代器失效 lower_bound与upper_bound multiset和set的区别 map map类的介绍 pair类型介绍 构造和迭代器 增删查 map数据修改:重载operator[] multimap…

达梦dsc环境dcr vote磁盘大小

达梦dsc环境中磁盘管理通过asm来实现,必须创建dcr和vote磁盘,那么这两个asm磁盘大小最小是多少? 32M asm文件最小为4个au,au大小为1M,因此asm文件最小为4M。但是创建vote时,命令只支持最小32M 通常生产环…

python操作MySQL以及SQL综合案例

1.基础使用 学习目标:掌握python执行SQL语句操作MySQL数据库软件 打开cmd下载安装 安装成功 connection就是一个类,conn类对象。 因为位置不知道,所以使用关键字传参。 表明我们可以正常连接到MySQL 演示、执行非查询性质的SQL语句 pytho…

鸿蒙进阶-AlphabetIndexer组件

大家好,这里是鸿蒙开天组,今天我们来学习AlphabetIndexer组件,喜欢就点点关注吧! 通过 AlphabetIndexer 组件可以与容器组件结合,实现导航联动,以及快速定位的效果 核心用法 AlphabetIndexer不是容器组件…

Mac电脑技巧:适用于Mac的免费外置硬盘数据恢复软件

“我有一个 1 TB 的外置硬盘,它被意外格式化了。我尝试从中恢复丢失的数据。我把它连接到我的Mac,但里面什么也没找到。我正在寻找适用于Mac的免费外置硬盘数据恢复软件,例如奇客数据恢复Mac版或其他Mac数据恢复免费软件来扫描它并恢复数据。…

推荐一款高级的安装程序打包工具:Advanced Installer Architect

AdvanCEd Installer Architect是一款高级的安装程序打包工具,我们有时候可能用nsis用的多,Advanced Installer Architect也是一款打包工具,有兴趣的朋友也可以试试。有了Advanced Installer Architect你就可以创建MSI打包。 主要功能 *先进的…

LeetCode 热题100(七)【链表】(1)

7.链表 7.1相交链表(简单) 题目描述:leetcode链接 160.相交链表 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c…

OpenAI正在与台积电(TSMC)和博通(Broadcom)合作,打造自己的AI推理芯片

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

小新学习k8s第四天之发布管理

一、金丝雀发布(灰度发布) Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。 ①比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的…