Java笔试面试题AI答之面向对象(5)

文章目录

  • 25. Java 包装类的实例是否可变?
      • 不可变类(Immutable Classes)
      • 特殊情况
      • 总结
  • 26. 简述Java什么是自动装箱和自动拆箱?
      • 自动装箱(Autoboxing)
      • 自动拆箱(Unboxing)
      • 注意事项
  • 27. Java中什么时候应用带参构造函数?
  • 28. 简述Java内部类的作用?
  • 29. Java构造器Constructor是否可被Override?
      • 覆盖(Override)与重载(Overload)的区别:
      • 构造器只能被重载
  • 30. 解释Java 接口的修饰符可以是 ?

25. Java 包装类的实例是否可变?

Java中的包装类(Wrapper Classes)是基本数据类型的对象表示形式。这些类包括BooleanByteShortCharacterIntegerLongFloatDouble等。关于这些包装类的实例是否可变,我们需要根据具体的类来讨论。

不可变类(Immutable Classes)

  • IntegerLongShortByteCharacterBoolean(对于BooleanTRUEFALSE实例):这些类的实例在创建后,其内部状态(即它们所封装的基本数据类型值)是不可变的。一旦你创建了一个Integer对象并给它赋了一个值,你就不能改变这个对象所持有的整数值。尝试修改这些对象的状态(如果可能的话)将会失败,或者导致创建一个新的对象。

特殊情况

  • Boolean:虽然BooleanTRUEFALSE实例是不可变的,但你可以创建Boolean类的其他实例(通过new Boolean(boolean value)),这些实例是可变的(尽管这通常不是一个好的做法,因为Boolean类被设计为不可变类,并且直接使用truefalse字面量或Boolean.TRUEBoolean.FALSE是更常见和推荐的做法)。然而,从Java 9开始,Boolean的构造函数被标记为已弃用,进一步强调了使用Boolean.TRUEBoolean.FALSE或布尔字面量的做法。

  • FloatDouble:这些类封装了浮点值。虽然它们的实例在创建后封装的值在逻辑上被视为不可变的(即你不能直接改变一个FloatDouble对象所持有的浮点值),但浮点数本身在表示上可能受到精度问题的影响,这可能导致一些看似“变化”的行为,但这并不是因为对象本身的状态被修改了。

总结

在大多数情况下,Java的包装类实例是不可变的。这意味着一旦你创建了一个包装类对象并给它赋了一个值,你就不能改变这个对象所持有的值了。然而,需要注意的是,尽管这些类被设计为不可变,但某些情况下(如Boolean的弃用构造函数)可能会创建出可变实例,但这并不是推荐的做法。此外,浮点数(FloatDouble)的精度问题可能导致看似“变化”的行为,但这与对象本身的状态是否可变是两个不同的概念。

26. 简述Java什么是自动装箱和自动拆箱?

Java中的自动装箱(Autoboxing)和自动拆箱(Unboxing)是Java 5(也称为Java 1.5)引入的两个特性,它们简化了基本数据类型(primitive types)和它们对应的包装类(wrapper classes)之间的转换。这两个过程主要通过编译器自动完成,减少了编程的复杂性。

自动装箱(Autoboxing)

自动装箱是指将基本数据类型(如int、double等)自动转换成它们对应的包装类对象(如Integer、Double等)的过程。在Java 5之前,如果你想要将一个基本数据类型的值赋给一个包装类类型的变量,你需要显式地进行转换,例如使用Integer.valueOf(int)方法。但Java 5及以后,这种转换可以由编译器自动完成。

示例

Integer num = 5; // 自动装箱,相当于 Integer num = Integer.valueOf(5);

自动拆箱(Unboxing)

自动拆箱则是指将包装类对象自动转换成它们对应的基本数据类型的过程。与自动装箱相反,在Java 5之前,如果你想要从一个包装类类型的变量获取基本数据类型的值,你需要显式地调用包装类中的转换方法(如intValue()doubleValue()等)。但在Java 5及以后,这种转换也可以由编译器自动完成。

示例

Integer num = 5;
int i = num; // 自动拆箱,相当于 int i = num.intValue();

注意事项

虽然自动装箱和自动拆箱为Java编程带来了便利,但它们也引入了一些需要注意的问题,比如:

  • 性能开销:每次装箱和拆箱操作都会创建或销毁对象,这可能会带来一定的性能开销,尤其是在性能敏感的应用中。
  • 空指针异常:拆箱操作如果遇到一个null的包装类对象,将会抛出NullPointerException,这在处理可能为null的包装类对象时需要特别注意。
  • 缓存机制:Java为某些包装类(如IntegerByteShortCharacterLong)的值提供了缓存机制,在自动装箱时,如果值在缓存范围内,则直接返回缓存中的对象,这可以减少不必要的对象创建。但是,这一特性也可能会导致一些不易察觉的错误,比如两个看上去不相等的Integer对象实际上可能指向同一个对象。

27. Java中什么时候应用带参构造函数?

在Java中,带参构造函数(也称为参数化构造函数)的应用场景非常广泛,主要用在需要根据输入参数来初始化对象状态的情况下。这里列举一些常见的使用场景:

  1. 依赖注入:在依赖注入(Dependency Injection, DI)的设计模式中,类的实例可能需要依赖其他类的实例来完成其功能。此时,通过带参构造函数可以将依赖的对象传递给类的实例,实现解耦和灵活性。

  2. 初始化特定状态:当你创建的类实例需要在创建时就具备某些特定的状态时,可以使用带参构造函数来初始化这些状态。例如,创建一个用户对象时,可能需要根据用户ID、用户名、密码等信息来初始化该对象。

  3. 限制实例的创建:虽然这不是带参构造函数独有的用途,但通过提供一个或多个带参构造函数而不提供无参构造函数,可以限制对象以特定的方式被创建。这在确保对象在创建时具有必要的初始化状态时非常有用。

  4. 配置类实例:在一些情况下,你可能需要根据外部配置(如数据库连接信息、日志文件路径等)来初始化类的实例。通过带参构造函数,可以轻松地将这些配置信息传递给类实例。

  5. 单例模式:虽然单例模式通常通过私有构造函数和静态方法来控制实例的创建,但在某些实现中,可以通过一个私有的带参构造函数和公开的静态工厂方法来确保实例的创建基于特定的参数(虽然这并不常见,因为单例模式的目标是确保一个类只有一个实例)。

  6. 多态性:在涉及多态性的场景中,父类的带参构造函数可以为子类提供一个通用的初始化模板,子类可以通过自己的带参构造函数来调用父类的带参构造函数(使用super关键字),以实现对父类初始化逻辑的扩展或定制。

  7. 链式编程:虽然这通常与Builder模式或方法链调用更相关,但带参构造函数也可以是链式调用的一部分,特别是当对象初始化过程可以分解为多个步骤时。不过,在实际应用中,为了实现真正的链式调用,通常会更倾向于使用具有返回当前对象引用的setter方法或专门的Builder类。

综上所述,带参构造函数在Java中扮演着至关重要的角色,尤其是在需要基于特定参数初始化对象状态的场景中。

28. 简述Java内部类的作用?

Java内部类(Inner Class)是定义在另一个类(外部类)内部的类。内部类在Java中扮演着非常重要的角色,它们提供了一些独特的功能和优势,这些功能和优势主要体现在以下几个方面:

  1. 封装:内部类可以将类的一些实现细节隐藏起来,从而提高了类的封装性。特别是当内部类只被外部类使用,或者作为外部类的一个组件时,内部类可以将这些细节完全封装在外部类内部,避免了对外暴露。

  2. 增强可读性:当内部类用于实现一些只在外部类中有意义的功能时,将内部类放在外部类内部可以提高代码的可读性。这样做使得类的职责更加明确,也使得阅读和理解代码变得更加容易。

  3. 方便访问外部类的成员:内部类可以直接访问外部类的私有成员(包括私有字段和私有方法),而不需要通过外部类提供的公共方法来访问。这一特性在编写事件监听器或回调函数时特别有用,因为内部类可以很容易地访问到外部类的当前状态。

  4. 实现多重继承:虽然Java不直接支持多重继承(一个类继承多个类),但内部类提供了一种实现多重继承效果的机制。外部类可以继承一个类,而内部类可以继承另一个类,从而实现间接的多重继承。

  5. 避免命名冲突:内部类可以作为外部类的一个命名空间,从而避免了与外部类或其他类之间的命名冲突。特别是当内部类名与外部类名或其他类名相同时,这种优势尤为明显。

  6. 非静态内部类持有外部类的引用:非静态内部类实例隐式地持有创建它的外部类实例的引用。这意呀着你可以通过内部类访问外部类的成员,即使这些成员是私有的。但是,这也意呀着非静态内部类实例的创建总是依赖于外部类实例。

  7. 静态内部类:静态内部类与普通类相似,但它被嵌套在另一个类的内部。静态内部类不持有外部类的引用,也不能直接访问外部类的非静态成员(除非通过外部类实例)。静态内部类主要用于组织相关代码,减少类的数量,并使得代码更加模块化。

总之,Java内部类提供了许多有用的功能和优势,使得开发者能够以更加灵活和高效的方式组织代码,实现复杂的功能。

29. Java构造器Constructor是否可被Override?

在Java中,构造器(Constructor)本身不能被覆盖(Override),但可以被重载(Overload)。这是因为构造器不属于任何类的成员方法,而是类在实例化时用于初始化对象状态的特殊方法。构造器没有返回类型(连void都没有),并且它的名称必须与类名完全相同。

覆盖(Override)与重载(Overload)的区别:

  • 覆盖(Override):发生在有继承关系的两个类之间,子类可以定义一个与父类方法签名完全相同的方法(包括方法名、返回类型、参数列表),从而实现父类方法的特殊化。这是一种多态的体现。

  • 重载(Overload):在同一个类中,可以有多个同名方法,只要它们的参数列表不同(参数的数量或类型不同),就可以被重载。这是为了提供方法的灵活性,允许一个类有多个相同名称但功能不同的方法。

构造器只能被重载

由于构造器不属于类的成员方法,并且没有返回类型,因此它们不能被覆盖。然而,你可以在子类中定义与父类构造器具有不同参数列表的构造器,这实际上是构造器的重载。

例如:

class Parent {Parent() {System.out.println("Parent default constructor");}Parent(String name) {System.out.println("Parent constructor with name: " + name);}
}class Child extends Parent {// 构造器重载,而不是覆盖Child() {super(); // 调用父类的无参构造器System.out.println("Child default constructor");}// 另一个构造器重载Child(String name) {super(name); // 调用父类的带参构造器System.out.println("Child constructor with name: " + name);}
}

在这个例子中,Child类定义了两个构造器,它们都重载了Parent类的构造器,但并没有覆盖任何构造器。注意,在子类的构造器中,如果父类没有无参构造器(且你没有在子类的构造器中显式调用父类的其他构造器),则必须显式调用父类的一个构造器(通过super())。

30. 解释Java 接口的修饰符可以是 ?

在Java中,接口(Interface)的修饰符主要用于控制接口的访问级别以及是否允许被扩展(即是否允许其他接口继承)。接口修饰符可以包括以下几种,但并非所有这些修饰符都适用于接口:

  1. public:这是最常用的接口修饰符。如果你将一个接口声明为public,那么它就可以被任何其他类访问。

  2. protectedprivate:这两个修饰符不适用于接口。因为接口是用来定义一组方法规范,旨在被不同的类实现,因此它必须是可以被其他类访问的。protected和private修饰符会限制接口的访问范围,这与接口的设计初衷相违背。

  3. 默认(无修饰符):如果接口没有被显式地声明为public,且它位于默认(包级私有)访问级别的类中,那么该接口也是默认访问级别,即只能被同一个包中的类访问。但是,接口本身通常不放在另一个类中(除了内部接口),所以这种情况较少见。如果接口直接位于包中,并且没有public修饰符,那么它就是包级私有的。

  4. staticfinal:虽然final修饰符在技术上可以用于接口(实际上,因为接口默认就是final的,即不能被继承为类,但可以被其他接口继承),但这样做通常没有意义,因为final在接口上的行为是隐式的。而static修饰符不能用于接口声明上,因为接口总是隐式地静态的,且Java语法不允许显式地使用static来修饰接口。

  5. strictfp:这个修饰符可以用来确保接口中所有浮点运算都是精确的,按照IEEE 754标准执行。然而,由于接口本身不包含实现(即不包含方法体),这个修饰符主要影响的是实现了该接口的类中的方法。这个修饰符的使用并不常见,但在需要精确浮点运算的上下文中可能会很有用。

综上所述,Java接口最常用的修饰符是public,用于允许接口被任何其他类访问。其他修饰符(如protected、private、static、final)在接口声明中通常不被使用,或者有其特定的限制和含义。而strictfp虽然可以用于接口,但其影响主要体现在实现了该接口的类的方法上。

答案来自文心一言,仅供参考

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【6678专题】-点亮LED灯(寄存器方式)

本章需要参考的资料为 《General Purpose Input Output (GPIO) User Guide.pdf》,具体在创龙资料文件夹目录下D:\JYTL\12DSP_FPGA\08_文档\创龙\TL6678ZH-EVM_V1.5\TL6678ZH-EVM_V1.5\6-开发参考资料\数据手册\核心板元器件\DSP\Technical Reference Manual 《Multi…

黑神话:悟空 56项修改器

感谢作者:peizhaochen 说明: 1.先开游戏,再开修改器。 2.了解修改器使用说明。 3.开启修改器主项再使用相应子项[无主项则不用开启][主项如"开启…修改"]。 4.有"Num"的键位为小键盘数字键。 键位功能介绍: F11&#…

iOS/iPadOS18.1Beta3发布,新增通知摘要和AI消除功能

除了iOS/iPadOS18 Beta8,苹果今天一同推送的还有iOS/iPadOS 18.1开发者预览版Beta 3!iOS/iPadOS18.1Beta3的内部版本号为22B5034e,距离上次发布Beta/RC间隔8天。 依旧是仅针对支持Apple Intelligence的iPhone 15 Pro和iPhone 15 Pro Max两款…

数据库:头歌实验三数据库完整性

一、定义s表完整性 编程要求 请按下面s表的结构定义完整性; sno主码,sname非空、city缺省值为天津。 create table s( sno char(2), sname varchar(10), status int, city varchar(10) ); use demo;#代码开始#定义s表; sno主码&a…

CAN Intel格式与Motorola格式的区别

在CAN(Controller Area Network)通信中,CAN报文的编码格式对于数据的有效传输和准确解析至关重要。CAN报文的编码格式主要包括Intel格式和Motorola格式。尽管这两种格式在单个字节内部的数据表示上是一致的,但在处理跨字节数据时&…

el-dialog中使用el-uplode滚动条穿模问题

问题: 解决办法:在dialog中添加 append-to-body属性 原因: append-to-body 属性用于将 el-dialog 组件附加到 body 元素,而不是它的父元素。这在某些情况下非常有用,例如: 避免滚动条穿模问题:…

PHP多功能投票系统小程序源码社群决策与趣味互动新潮流

🌟【引领社群新风尚,一键决策更轻松】🌟 你还在为社群活动意见不合而烦恼吗?多功能投票小程序来拯救你的选择困难症!无论是团队项目方案、周末出游地点,还是晚餐吃什么的小纠结,只需轻轻一点&a…

Python+VScode 两个不同文件夹里的py文件相互调用|python的模块调用|绝对导入

第一次用VScode写python遇到了模块无法识别的问题,搞了一整天, 上网查,chatGPT都不行,现在时解决了。 首先项目结构如下,四个文件夹,四个py文件 代码: def f1fun():print("f1") de…

Linux---FTP文件服务器搭建及实战

一、FTP简介 FTP: File Transfer Protocol文件传输协议 FTP是用于在网络上进行文件传输的一套标准协议,使用客户/服务器模式。它属于网络传输协议的应用层。文件传送(file transfer)和文件访问(file access)之间的区别在于:前者…

谷粒商城实战笔记-282~283-商城业务-订单服务-提交订单的问题

文章目录 一,282-商城业务-订单服务-提交订单的问题调试过程中出现的问题services面板介绍什么是 Services Panel?主要作用解决的痛点使用方法 二,283-商城业务-分布式事务-本地事务在分布式下的问题分布式事务问题解决方案分布式事务处理流程…

福建聚鼎:装饰画做起来一家店铺需要多久

在如今快节奏、高效率的社会环境中,许多人追求即时满足,希望所有事情都能迅速完成。然而,在艺术的世界里,时间往往是一个被精心雕琢的概念。今天,让我们来探讨一下,如果从零开始做起来一家装饰画店铺&#…

解决Selenium元素拖拽不生效Bug

前几天在使用Selenium进行元素拖拽操作时,发现Selenium自带的元素拖拽方法(dragAndDrop())不生效,网上的回答也是五花八门,比较混乱,尝试了以下几种方法均无法解决。 方案1:通过dragAndDrop()方…

Nucleus创建LocalServer后没有localhost

1.问题 在Omniverse平台上使用Nucleus模块时,需要本地创建一个Server,然后安装。安装完成后如下图所示。 会发现在Omniverse下是空的,没有localhost,需要点击Add Server,弹出如下所示。 然后输入创建之前的用户名和密码…

51单片机串口通信

一.通信 1.通信认识 随着多微机系统的广泛应用和计算机网络技术的普及,计算机的通信功能愈来愈显得重要。计算机通信是指单片机与外部设备(传感器)或计算机与计算机之间的信息交换。通信有并行通信和串行通信两种方式。在多微机系统以及现代…

工作中常用的100个知识点

1. Permission deniedGit解决Permission denied, please try again问题_git permission denied, please try again.-CSDN博客 cd ~/.ssh/ 回车,进入.ssh路径下; 接下来在.ssh路径下配置全局的name和email,输入以下命令: git con…

sql-labs41-45关通关攻略

第41关 一.查询数据库 http://127.0.0.1/Less-41/?id-1%20union%20select%201,2,database()--http://127.0.0.1/Less-41/?id-1%20union%20select%201,2,database()-- 二.查表 http://127.0.0.1/Less-41/?id-1%20union%20select%201,2,(select%20group_concat(table_name)…

青岛实训day33(8/21)

1、配置一主二从mysql 1. mycat对mysql8不完全支持 2. mysql8主从问题不大get_pub_key1 3. gtids事务复制 4. 删除/etc/my.cnf 5. 同步data文件需要先停用mysql服务,删除data目录中的auto.cnf 6. gtid模式以及经典模式都需要锁表 flush tables with read lock;unlock tables;…

想学gis开发,java和c++哪个比较好?

java与C的应用场景不同,究竟选择谁,应该由开发者的兴趣方向来决定。 你选择Java,意味着以后的业务方向就是偏后台服务开发,如果你非得说我用java也可以写界面,对不起,别人不会。不管是从项目还是产品的角度…

【Redis】Redis 的消息队列 List、Streams—(六)

目录 一、消息队列二、List 方案三、Streams 方案 一、消息队列 我们一般把消息队列中发送消息的组件称为生产者,把接收消息的组件称为消费者,下图是一个通用的消息队列的架构模型: 消息队列在存取消息时,必须要满足三个需求&…

超详细超实用!!!java开发之IntelliJ IDEA下载与安装破解以及汉化教程(三)

云风网 云风笔记 云风知识库 一、安装包下载 1、官网下载 2、ideaIU-2024.2.0.2.exe 百度网盘资源 安装包下载完成后进行傻瓜式下一步安装就可以了 二、破解激活 由于IntelliJ IDEA可免费一个月,后续需要付费购买激活码,这里采用破解激活的方式 将…