持续总结中!2024年面试必问 100 道 Java基础面试题(二十九)

上一篇地址:持续总结中!2024年面试必问 100 道 Java基础面试题(二十八)-CSDN博客

五十七、静态内部类和普通内部类有什么区别?

在Java中,内部类是指定义在另一个类中的类,而内部类的类型有很多种,其中最常见的两种是静态内部类和非静态(普通)内部类。以下是静态内部类和普通内部类之间的区别:

静态内部类

  1. 静态修饰:静态内部类使用static关键字声明,这意味着它们不依赖于外部类的实例。
  2. 实例化:可以直接通过内部类本身进行实例化,无需创建外部类的实例。
  3. 访问控制:静态内部类不能访问外部类的非静态成员变量和方法,除非它们是public的。
  4. 目的:静态内部类通常用于实现辅助功能或逻辑,它们与外部类的关系较为松散。
  5. 生命周期:静态内部类的生命周期独立于外部类,它们不随外部类的实例创建而创建或销毁。

普通内部类

  1. 非静态修饰:普通内部类不使用static关键字声明,它们与外部类的实例有关联。
  2. 实例化:必须先创建外部类的实例,然后才能创建普通内部类的实例。
  3. 访问控制:普通内部类可以直接访问外部类的所有成员,包括私有(private)成员。
  4. 目的:普通内部类通常用于表示与外部类紧密相关的概念或对象,它们可以作为外部类的一部分实现特定的功能。
  5. 生命周期:普通内部类的生命周期与创建它的外部类实例的生命周期相关联。

示例代码

public class OuterClass {// 外部类的成员变量private int outerField = 100;// 静态内部类public static class StaticNestedClass {public void display() {// 错误:不能直接访问外部类的非静态成员// System.out.println(outerField);System.out.println("Static Nested Class");}}// 普通内部类public class InnerClass {public void display() {System.out.println("Inner Class. outerField = " + outerField);}}public static void main(String[] args) {// 静态内部类的实例化StaticNestedClass staticNested = new StaticNestedClass();staticNested.display();// 普通内部类的实例化// 错误:不能直接在没有外部类实例的情况下实例化// InnerClass inner = new InnerClass();OuterClass outer = new OuterClass();InnerClass inner = outer.new InnerClass();inner.display();}
}

在这个示例中,StaticNestedClass是一个静态内部类,可以直接实例化,并且它不能直接访问外部类的非静态成员。而InnerClass是一个普通内部类,它可以直接访问外部类的成员,并且需要通过外部类的实例来创建。

注意事项

  • 静态内部类可以有静态成员,也可以有非静态成员,但普通内部类只能有非静态成员。
  • 静态内部类不持有对其外部类对象的引用,而普通内部类则隐式持有对其外部类对象的引用。
  • 静态内部类通常用于实现与外部类松耦合的功能,而普通内部类则用于实现与外部类紧密相关的行为。

总结来说,静态内部类和普通内部类在实例化方式、成员访问权限以及它们与外部类的关系上存在明显的区别。选择合适的内部类类型对于组织代码和实现设计模式非常重要。

五十八、静态方法可以直接调用非静态方法吗?

在Java中,静态方法(也称为类方法)是在类级别上定义的方法,而非静态方法(也称为实例方法)是定义在类中但属于类的实例的方法。以下是关于静态方法是否能直接调用非静态方法的详细回答:

静态方法调用非静态方法

静态方法不能直接调用非静态方法,因为非静态方法的调用需要依赖于类的实例。静态方法在没有创建类实例的情况下就可以调用,而非静态方法需要通过类的实例来调用。

原因

  1. 实例依赖性:非静态方法需要一个实例上下文来执行,因为它们可能访问或修改实例的状态(即对象的字段)。

  2. 生命周期:静态方法与类的加载和初始化绑定,而实例方法与对象的生命周期绑定。在类加载时,静态方法就已经存在,而实例方法需要等到对象创建后才存在。

  3. 设计目的:静态方法设计用于实现不依赖于对象状态的功能,而实例方法设计用于实现与对象状态相关的行为。

示例代码

public class MyClass {// 静态方法public static void staticMethod() {System.out.println("This is a static method.");}// 非静态方法public void instanceMethod() {System.out.println("This is an instance method.");}public static void main(String[] args) {// 正确:静态方法可以直接调用MyClass.staticMethod();// 错误:静态方法不能直接调用非静态方法// MyClass.instanceMethod();MyClass myObject = new MyClass(); // 创建实例myObject.instanceMethod(); // 通过实例调用非静态方法}
}

在这个示例中,尝试在main方法中直接调用instanceMethod将会导致编译错误,因为instanceMethod是一个非静态方法,它需要一个MyClass的实例来调用。

解决方法

如果需要从静态方法中调用非静态的方法,可以采取以下几种方法:

  1. 通过类实例调用:创建类的实例,然后通过该实例调用非静态方法。

  2. 将方法静态化:如果方法不依赖于对象的状态,可以考虑将其改为静态方法。

  3. 使用辅助方法:将非静态方法的逻辑复制到静态方法中,或者创建一个单独的静态帮助方法来执行所需的操作。

总结来说,静态方法不能直接调用非静态方法,因为非静态方法需要类的实例来执行。在设计类和方法时,需要考虑方法是否依赖于对象的状态,以及它们的调用方式。

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

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

相关文章

分割回文串(力扣131)

解题思路&#xff1a;仍就是上递归三部曲&#xff0c;但于此同时要明白此时的index就可以作为切割回文串的线了 具体代码如下&#xff1a; class Solution { private: vector<vector<string>> result; vector<string> path; // 放已经回文的子串 void back…

批量抓取某电影网站的下载链接

思路&#xff1a; 进入电影天堂首页&#xff0c;提取到主页面中的每一个电影的背后的那个urL地址 a. 拿到“2024必看热片”那一块的HTML代码 b. 从刚才拿到的HTML代码中提取到href的值访问子页面&#xff0c;提取到电影的名称以及下载地址 a. 拿到子页面的页面源代码 b. 数据提…

【leetcode】DFS递归题目总结

DFS&#xff08;深度优先搜索&#xff09; 深度优先搜索是一种用于遍历或搜索树或图的算法&#xff0c;其基本思路是从起始节点开始&#xff0c;沿着一条路径一直走到底&#xff0c;直到无法再走下去为止&#xff0c;然后回溯到上一个节点&#xff0c;继续走到另外一个路径&…

第二代增强-创建采购申请时的增强

文章目录 第二代增强-创建采购申请时的增强业务要求实现过程创建项目编写代码激活增强 维护消息类运行效果断点 第二代增强-创建采购申请时的增强 业务要求 实现过程 创建项目 编写代码 "AFNAM&#xff0c;申请人 "需求&#xff1a;NB类型的采购申请&#xff0c;需要…

嵌入式全栈开发学习笔记---C语言笔试复习大全10

目录 字符数组&#xff08;笔试重点&#xff09; 字符数组初始化 字符串数组输出 字符串的输入 字符串处理函数 puts()输出字符串 gets()输入字符串 strlen()计算字符串长度 strcpy()将后面的字符串拷贝到前面的字符串数组里面 笔试题12 strcmp()比较字符串的大小 …

自动化机器学习——网格搜索法:寻找最佳超参数组合

自动化机器学习——网格搜索法&#xff1a;寻找最佳超参数组合 在机器学习中&#xff0c;选择合适的超参数是模型调优的关键步骤之一。然而&#xff0c;由于超参数的组合空间通常非常庞大&#xff0c;手动调整超参数往往是一项耗时且困难的任务。为了解决这个问题&#xff0c;…

大模型引领NLP研究新范式:从统计机器学习到预训练语言模型

自然语言处理&#xff08;NLP&#xff09;研究范式经历了从浅层到深层、从局部到整体、从特定到通用的演进过程。下面我们来详细回顾这一过程。 一、早期的统计机器学习方法&#xff08;20世纪90年代 - 21世纪初&#xff09; 词袋模型&#xff08;Bag-of-Words&#xff09; 将…

C语言 | Leetcode C语言题解之第67题二进制求和

题目&#xff1a; 题解&#xff1a; void reserve(char* s) {int len strlen(s);for (int i 0; i < len / 2; i) {char t s[i];s[i] s[len - i - 1], s[len - i - 1] t;} }char* addBinary(char* a, char* b) {reserve(a);reserve(b);int len_a strlen(a), len_b st…

性能优化(一):ArrayList还是LinkedList?

引言 集合作为一种存储数据的容器&#xff0c;是我们日常开发中使用最频繁的对象类型之一。JDK为开发者提供了一系列的集合类型&#xff0c;这些集合类型使用不同的数据结构来实现。因此&#xff0c;不同的集合类型&#xff0c;使用场景也不同。 很多同学在面试的时候&#x…

大厂案例 - 通用的三方接口调用方案设计(中)

文章目录 Pre阿里云华为云【AK和SK生成方案】最佳实践1. 创建API密钥管理系统2. 生成AK和SK3. 存储和管理AK和SK4. 提供API密钥分发机制5. 安全性6. 其他注意事项 DB Model Design表结构Next考虑其他建议 API接口设计指导1. 使用POST作为接口请求方式2. 客户端IP白名单3. 单个接…

【研发管理】产品经理知识体系-产品创新流程

导读&#xff1a;产品创新流程是一个系统性的过程&#xff0c;旨在通过创造和引入新的产品或改进现有产品来满足市场需求、解决用户问题或实现竞争优势。 目录 1、产品创新引论 2、决策基本框架 3、模糊前端 4、产品创新流程模型概论 5、门径管理流程 6、并行工程和集成产…

深度学习技术在运动想象脑电信号中分类中的学习实战

----&#xff08;本文由思影科技学习参考后得出&#xff09; 脑机接口&#xff08;BCI&#xff09;中运动想象脑电图&#xff08;MI-EEG&#xff09;是最常见的BCI范式之一&#xff0c;已经广泛应用于只能医疗&#xff0c;如中风后康复和移动辅助机器人。近年来&#…

Java与Go:并发

在此之前&#xff0c;我们先要明白什么是并发&#xff1f;为什么要并发编程&#xff1f; 在计算机中&#xff0c;同一时刻&#xff0c;只能有一条指令&#xff0c;在一个CPU上执行 后面的指令必须等到前面指令执行完才能执行&#xff0c;就是串行。在早年CPU核心数还少的时候倒…

Android版本依赖Version catalog

曾经我们使用config.gradle文件进行版本依赖配置&#xff0c;然后在project的build.gradle.kts中使用如下方式引入&#xff1a; apply(from "./config.gradle") 缺点&#xff1a;在project的module中引用无任何提示&#xff0c;无法跳转到指定引用 一、创建versio…

临床+康复的一体化治疗服务,把握黄金康复时间

随着我院脑血管病人&#xff0c;重症病人及骨科病人康复需求的日渐增多&#xff0c;为了使每位住院患者在治疗原发病的同时&#xff0c;第一时间接受到康复治疗&#xff0c;提高病人的生活质量&#xff0c;降低致残率&#xff0c;我院康复治疗科在院领导的大力支持下&#xff0…

C语言之递归函数、例题详解以及注意事项

目录 前言 一、递归的概念 二、递归例题详解 例1&#xff1a;斐波那契数列 例2&#xff1a;求次方 例3&#xff1a;求各位数之和 例4&#xff1a;阶乘 例5&#xff1a;顺序打印 三、递归的注意事项 总结 前言 本文将和大家分享一些递归函数的相关知识&#xff0c;技巧…

EPAI手绘建模APP颜色、贴图、材质、样式

⑦ 颜色选择页面 1) 颜色环选色。 图 65 颜色选择器-颜色环 2) RGB选色。 图 66 颜色选择器-RGB 3) HSL选色。 图 67 颜色选择器-HSL 4) 国风颜色库选色。 图 68 颜色选择器-国风 5) CSS颜色库选色。 图 69 颜色选择器-CSS 6) 历史颜色&#xff1a;保存最近使用的多个颜色&…

【C++语言】封装

当谈及面向对象编程&#xff08;OOP&#xff09;中的三个主要概念——封装、继承和多态时&#xff0c;封装是最基础和最重要的。封装是将数据和操作数据的函数捆绑在一起的概念。在C中&#xff0c;封装通过类来实现&#xff0c;类将数据成员和成员函数封装在一起。本文将详细讨…

Gunicorn与Nginx协同工作:配置Django应用的高效指南

Gunicorn和Nginx是常用的部署Django应用的组合。Gunicorn是一个Python Web服务器&#xff0c;用于运行Django应用程序的Web服务器。Nginx是一个高性能的反向代理服务器&#xff0c;常用于前端的负载均衡和静态文件服务。 下面是配置Django应用的高效指南&#xff1a; 安装Guni…

vue快速入门(五十三)使用js进行路由跳转

注释很详细&#xff0c;直接上代码 上一篇 新增内容 几种常用的路由跳转方式演示 源码 App.vue <template><div id"app"><div class"nav"><!-- router-link 自带两个高亮样式类 router-link-exact-active和router-link-active区别&a…