java中对于静态方法的理解

2024-05-26 05:38
文章标签 java 理解 静态方法

本文主要是介绍java中对于静态方法的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天看到一个web项目,所有的serviceImpl实现类中定义的方法都是static修饰的;

跟以前接触过的项目都不一样,以前我们是实例方法,没有用static修饰的,

一般用static的场景:要么是一些工具类,要么是一些通用的方法(不想每次用的时候都new对象或者注入对象);

 

既然这个项目这么用,我这边也整理下这种用法的区别:

静态方法和非静态方法的区别

静态方法(类方法)

非静态方法(普通方法/实例方法/成员方法)

静态方法,是使用static关键字修饰的方法,又叫类方法。

属于类的,不属于对象,在实例化对象之前就可以通过类名.方法名调用静态方法。

(静态属性,静态方法都是属于类的,可以直接通过类名调用)。

1.在静态方法中,可以调用静态方法。
2.在静态方法中,不能调用非静态方法。
3.在静态方法中,可以引用类变量(即,static修饰的变量)。
4.在静态方法中,不能引用成员变量(即,没有static修饰的变量)。
5.在静态方法中,不能使用super和this关键字

非静态方法,是不含有static关键字修饰的普通方法,又称为实例方法,成员方法。

属于对象的,不属于类的。

(成员属性,成员方法是属于对象的,必须通过new关键字创建对象后,再通过对象调用)。


1.在普通方法中,可以调用普通方法。
2.在普通方法中,可以调用静态方法
3.在普通方法中,可以引用类变量和成员变量
4.在普通方法中,可以使用super和this关键字

 

生命周期

静态方法的生命周期跟相应的类一样长,静态方法和静态变量会随着类的定义而被分配和装载入内存中。一直到线程结束,静态方法和静态属性才会被销毁。(也就是静态方法属于类)

非静态方法的生命周期和类的实例化对象一样长,只有当类实例化了一个对象,非静态方法才会被创建,而当这个对象被销毁时,非静态方法也马上被销毁。(也就是非静态方法属于对象)

总结:类方法可以直接通过类名调用;实例方法必需先实例化类,再初始化对象,然后通过类的实例对象才能调用;
 

并发问题

其实:java是线程安全的,即对任何方法(包括静态方法)都可以不考虑线程冲突,但有一个前提,就是不能存在全局变量。如果存在全局变量,则需要使用同步机制。

在多线程中使用静态方法会发生什么事?也就是说多线程访问同一个类的static静态方法会发生什么事?是否会发生线程安全问题?

证明只要在静态函数中没有处理多线程共享数据,就不存在着多线程访问同一个静态方法会出现资源冲突的问题。
静态方法是否引起线程安全问题主要看该静态方法是否对全局变量(静态变量static)进行修改操作。
public class TestUtil {private static User user=new User();public static void setName(String name){//在静态方法中调用了全局变量并进行了修改操作,线程不安全user.setUsername(name);}public synchronized static void setName1(String name){//在静态方法中调用了全局变量并进行了修改操作,使用了同步关键字,线程安全user.setUsername(name);}
}

总结:只要你的静态方法不访问全局变量的话,就不会有并发问题

访问全局变量肯定会出现并发问题,这是毫无疑问的;
静态方法内部的变量,都是局部变量,每次调用静态方法时都会重新分配内存空间,所以是安全的;

也就是是说只要你的静态方法不访问全局变量的话,就不会有并发问题;

 

 

 

 

这篇关于java中对于静态方法的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1003631

相关文章

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

Spring MVC如何设置响应

《SpringMVC如何设置响应》本文介绍了如何在Spring框架中设置响应,并通过不同的注解返回静态页面、HTML片段和JSON数据,此外,还讲解了如何设置响应的状态码和Header... 目录1. 返回静态页面1.1 Spring 默认扫描路径1.2 @RestController2. 返回 html2

Spring常见错误之Web嵌套对象校验失效解决办法

《Spring常见错误之Web嵌套对象校验失效解决办法》:本文主要介绍Spring常见错误之Web嵌套对象校验失效解决的相关资料,通过在Phone对象上添加@Valid注解,问题得以解决,需要的朋... 目录问题复现案例解析问题修正总结  问题复现当开发一个学籍管理系统时,我们会提供了一个 API 接口去

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Spring核心思想之浅谈IoC容器与依赖倒置(DI)

《Spring核心思想之浅谈IoC容器与依赖倒置(DI)》文章介绍了Spring的IoC和DI机制,以及MyBatis的动态代理,通过注解和反射,Spring能够自动管理对象的创建和依赖注入,而MyB... 目录一、控制反转 IoC二、依赖倒置 DI1. 详细概念2. Spring 中 DI 的实现原理三、

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.