【JavaSE】Java(五十五):核心要点总结

news2024/12/26 10:48:26

文章目录

  • 1. 为什么不允许静态方法访问非静态变量
  • 2. Java的内存模型
  • 3. 在Java中什么时候用重载什么时候用重写
  • 4. 举例说明什么情况下更倾向于用抽象类而不是接口
  • 5. 实例化对象有哪几种方式


在这里插入图片描述

1. 为什么不允许静态方法访问非静态变量


在Java中,静态方法属于类级别的方法,它不依赖于任何实例对象,只能访问类变量(即static修饰的变量)和其他静态方法。而非静态变量是实例级别的变量,需要通过实例对象才能访问。

这里有两个原因导致在静态方法中不能直接访问非静态变量:

对于一个静态方法来说,它的执行是在类加载时完成的,也就是说在运行时并没有实例化任何对象。因此,在静态方法中无法确定我们要操作哪个实例的非静态变量。
类变量存储在静态内存中,可以在整个程序生命周期内访问。如果允许在静态方法中访问实例变量,那么将可能会出现非常危险和意外的情况,因为实例变量的值随着实例对象的创建和销毁而改变,在静态方法中直接引用未知/不存在的值将导致代码错误。

由于静态方法不依赖于实例对象,因此不能访问和操作实例变量,必须使用 this 关键字指定当前对象,并通过对象访问实例变量。


2. Java的内存模型


Java的内存模型(Java Memory Model,简称JMM)是指一组规范,定义了在多线程环境下Java虚拟机(JVM)如何与计算机物理内存交互,以及线程间如何共享变量、协同工作等机制

简单来说,JMM确保了Java程序在不同的硬件平台上都能够正确地运行,避免了由多线程访问共享变量而引发的各种问题(比如死锁、竞争条件和内存可见性等问题)。

JMM主要包括两部分:内存屏障和共享变量。其中,内存屏障指令用来限制指令重排序,从而避免了多线程的内存读写操作产生干扰;共享变量指的是在多个线程之间共享的对象和数据。

在Java中,静态区域、堆区域、栈区域和方法区域都有其特定的内存管理方式,其中静态区和方法区通常被视为共享变量的存储区域。

JMM中的主要概念包括原子性、可见性和有序性。其中,原子性是指一个操作要么完成,要么不完成,不会出现中间状态;可见性是指当一个线程修改了一个共享变量时,其他线程可以立即看到这个修改;有序性是指程序中各操作的执行顺序必须要符合代码的先后顺序。

JMM定义了Java程序在多线程并发执行时应该如何正确地行为,遵循JMM规范可以帮助我们编写更加健壮、高效和可靠的Java多线程程序


3. 在Java中什么时候用重载什么时候用重写


在Java中,方法的重载(Overloading)和重写(Overriding)是两个常用的概念。

方法重载主要用于改变方法的参数列表,使得方法能够接收不同类型或个数的参数。方法名相同,而参数列表不同,返回类型可以相同也可以不同。方法重载是一种静态多态性(编译时多态),它允许我们使用相同的方法名来实现不同的行为,提高了代码的可读性和复用性。

而方法重写则是子类对父类继承的方法进行重新定义,使其具有特定的行为。方法重写必须保证方法名、参数列表和返回类型完全一致,并且满足里氏替换原则。方法重写是一种动态多态性(运行时多态)的体现,它允许我们在运行时根据对象的实际类型来调用相应的方法,实现了多态性。

当我们需要改变方法的参数列表,以适应不同的输入时,应该考虑使用方法重载;而当我们需要修改已有的方法逻辑或者实现某种特定的功能时,应该考虑使用方法重写。同时,在重载和重写中,注意避免产生歧义和冲突,使程序具备更清晰、简洁和易于理解和维护的特点。

4. 举例说明什么情况下更倾向于用抽象类而不是接口


在Java中,抽象类和接口都是用于实现多态性的重要机制。通常情况下,我们应该优先考虑使用接口来定义规范和行为,并在需要时再使用抽象类进行补充或扩展。但在某些场景下,我们更倾向于使用抽象类而不是接口。

以下是一些情况下更适合使用抽象类的例子:

  1. 抽象类可以提供默认的方法实现。如果继承的类没有覆盖这些方法,就会自动继承父类的默认实现。这对于类似模板方法、钩子方法这种公共实现比较重要的场景很有用,而接口需要将方法全部声明为抽象方法,无法提供默认实现。

  2. 当需要将代码逻辑和属性封装到一个基础类中,并为它提供特定的行为时,抽象类更为适合。因为抽象类具有完整的面向对象特性,可以包含抽象方法、构造函数、静态成员变量等所有类型的成员,而接口只能包含静态常量和抽象方法。

  3. 当设计初期不能确保每个子类都能够遵守接口协定时(例如某个接口规定了大量的抽象方法),抽象类就有比较明显的优势。因为设计时可以指定某些方法必须被实现,而某些方法则可以选择性实现或者通过抛出异常来使得子类强制实现。

  4. 当需要向已有的类库中添加新功能时,如果这些类已经是抽象类的形式,就可以方便地定义基于这个抽象类的新子类来扩展功能;而如果这些类只是普通类或接口,又不能轻易地出现胶合代码或空实现等问题。

在使用抽象类和接口时,应该根据具体需求来综合考虑两者的特点和优缺点,以便选择更加适合自己业务场景的方式。


5. 实例化对象有哪几种方式


在Java中,可以通过以下几种方式来实例化对象:

  1. 使用new关键字实例化对象。这是最常见的一种方式,只需要通过类名和参数列表调用构造函数即可创建对象,例如:MyClass obj = new MyClass();

  2. 使用反射机制实例化对象。通过Class对象的newInstance()方法或Constructor对象的newInstance()方法可以创建一个类的实例。例如:MyClass obj = MyClass.class.newInstance();或者 MyClass obj = constructor.newInstance();

  3. 使用克隆方法实例化对象。如果一个类实现了Cloneable接口,并重写了Object类的clone()方法,那么就可以通过调用其clone()方法来创建一个新的对象,例如:MyClass obj2 = (MyClass) obj1.clone();

  4. 使用序列化和反序列化实例化对象。如果一个类实现了Serializable接口,并且将对象序列化到磁盘文件或网络中,那么就可以从磁盘文件或网络中反序列化出一个新的对象,例如:ObjectInputStream in = new ObjectInputStream(new FileInputStream(“object.dat”)); MyClass obj = (MyClass) in.readObject();

  5. 使用工厂模式实例化对象。在工厂模式中,通过定义一个专门的工厂类来负责创建对象,客户端只需要向工厂类请求所需对象即可,例如:MyClassFactory factory = new MyClassFactory(); MyClass obj = factory.createInstance();

以上是Java中常用的实例化对象的方式,不同的方式适用于不同的场景和需求。尤其需要注意的是,在每种方式下都需要保证正确地调用构造函数,在使用反射和序列化时还需要特别关注安全性和性能问题。



在这里插入图片描述

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

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

相关文章

【HTML】第 4 节 - 列表标签

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 ! 时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、列表 3、无序列表 4、有序列表 5、定义列表 6、总结 1、缘起 微信小程序的列表标签是一种用于展示多个数据项的…

量子 AI,是融合还是颠覆?

光子盒研究院 前言:如今,量子技术早已走出实验室、广泛赋能电力、化学、医学等各个领域;创新赛道上,加速奔跑的量子产业,将带来无限可能。现在,光子盒特开启「量子」专栏,一一解读量子技术将为下…

chatgpt赋能python:Python安装教程:从下载到配置

Python安装教程:从下载到配置 Python作为一门高级编程语言,越来越受到开发人员的欢迎。Python的灵活性和易用性,让许多人选择Python作为他们的程序语言。本文将详细介绍Python安装教程,帮助初学者轻松入门。 1. 下载Python安装包…

【JavaSE】Java(五十四):核心要点总结

文章目录 1. try-catch-finally中 如果 catch 中 return 了,finally 还会执行吗?2. 常见的异常类有哪些3. hashcode 是什么 ,有什么作用4. java中操作字符串有哪些类,他们之间有什么区别5. Java 中有哪些引用类型 1. try-catch-finally中 如…

$2$驱动模块

目录 1.驱动模块(驱动程序的框架) 2.内核中的打印函数(编写第一个驱动程序) Source Insight 使用: 打印函数编写 分析 3.驱动的多文件编译 4.模块传递参数 安装好驱动之后如何传参? 多驱动之间调用&…

智能照明控制系统在现代建筑工程中的应用 安科瑞 许敏

摘要: 文章分析了在现代建筑工程中智能照明控制系统所具有的优越性,并对如何解决该技术在实际应用中遇到的问题提出了看法与建议。 关键词:智能照明 控制系统 应用节能 引言 随着人们的物质和精神生活水平不断提高,对生活的追求…

MMC整流器Matlab仿真模型子模块个数N=18(含技术文档)

资源地址: MMC整流器Matlab仿真模型子模块个数N=18(含技术文档)资源-CSDN文库 模型介绍: 1.MMC工作在整流侧,子模块个数N=18,直流侧电压Udc=25.2kV,交流侧…

算法设计与分析期末复习(二)

动态规划 基本思想:把求解的问题分成许多阶段或多个子问题,然后按顺序求解各个子问题。**前一个子问题的解为后一个子问题的求解提供了有用的信息。**在求解任何一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优…

Linux面试题汇总

Linux面试题汇总 网络拓展Linux 概述什么是LinuxUnix和Linux有什么区别?什么是 Linux 内核?Linux的基本组件是什么?Linux 的体系结构BASH和DOS之间的基本区别是什么?Linux 开机启动过程?Linux系统缺省的运行级别&#…

javaScript蓝桥杯----外卖给好评

目录 一、介绍二、准备三、⽬标四、代码五、完成 一、介绍 外卖是现代⽣活中必备的⼀环。收到外卖后,各⼤平台软件常常会邀请⽤户在⼝味,配送速度等多个⽅⾯给与评分。在 element-ui 组件中,已经有相应的 Rate 组件,但是已有组件…

前端052_单点登录SSO_单点退出系统

单点退出系统 1、 需求分析2、EasyMock 添加退出系统模拟接口3、定义Api调用退出接口4、定义 Vuex 退出行为1、 需求分析 所有应用系统退出,全部发送请求到当前认证中心进行处理,发送请求后台删除用户登录数据,并将 cookie 中的用户数据清除。 2、EasyMock 添加退出系统模拟…

大数据分析案例-基于LightGBM算法构建银行客户流失预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

第四章:运算符

第四章:运算符 4.1:算术运算符 ​ 算术运算符主要用于数学运算,其可以连接运算符前后的两个数值或表达值,对数值或表达式进行加()、减(-)、乘(*)、除(/)、取模(%)运算。 运算符名称作用示例加法运算符计算两个值或表达式的和SE…

chatgpt赋能python:Python如何遍历文件:一篇完整的指南

Python如何遍历文件: 一篇完整的指南 在进行文件操作时,遍历文件是相当普遍的需求。Python中提供了多种方法来遍历文件夹和文件,包括os模块,glob模块和os.walk方法。这篇文章将会介绍这些方法及其应用。 什么是遍历文件? 遍历文…

使用 ConstraintLayout

ConstraintLayout解析 1.前言2.了解ConstraintLayout3.基本用法3.1 看一个布局3.2再看一个布局 1.前言 你是不是一直不敢用ConstraintLayout,是以为属性太多太复杂?你心理上的惰性,畏惧它。它其实很好用很强大,如果要用就需要一个…

Day_40关于图的总结

一. 实际问题的抽象与建模 如果我们需要研究一个实际问题,首先第一步就是对这个实际问题进行抽象,抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征的过程。具体地说,抽象就是人们在实践的基础上&#xff0c…

Java中的金钱陷阱

前言 有多少小伙伴是被标题 骗 吸引进来的呢,我可不是标题党,今天的文章呢确实跟”金钱“有关系。 但是我们说的不是过度追求金钱而掉入陷阱,而是要说一说在Java程序中,各种跟金钱运算有关的陷阱。 日常工作中我们经常会涉及到…

chatgpt赋能python:Python字幕滚动:如何让你的视频内容更吸引人

Python字幕滚动:如何让你的视频内容更吸引人 如果你是一位视频创作者,你可能知道如何通过字幕来增加你的视频的吸引力。Python提供了一种简单且高效的方法来制作字幕滚动。字幕滚动是指将文字逐个显示在视频下方,以帮助观众跟上视频的进展。…

让我们彻底了解Maven(一)--- 基础和进阶

Maven大家都很熟悉,但是我们很多人,对它其实都是似乎很熟,但是又好像不熟悉的感觉,包括我,今天咱们就一起来彻底了解Maven的所有功能,我们从入门,到原理剖析,再到实践操作&#xff0…

chatgpt赋能python:Python如何遍历列表并提取

Python如何遍历列表并提取 在Python编程语言中,列表是一种非常常见的数据类型。它是一个有序的集合,可以存储多个元素,可以是任何类型的数据,例如整数、字符串、布尔值等等。遍历一个列表并提取其中的元素是一个基本的操作&#…