静态关键字:static

static的作用

static是静态的意思,可以修饰成员变量和成员方法。

static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改。

成员变量

分为2类

静态成员变量(有static修饰,属于类,内存中加载一次): 常表示如在线人数信息等需要被共享的信息,可以被共享访问。

实例成员变量(无static修饰,存在于每个对象中):常表示姓名name、年龄age等属于每个对象的信息。

访问格式

类名.静态成员变量(推荐)

对象.静态成员变量(不推荐)

对象.实例成员变量

使用场景

静态成员变量:表示在线人数等需要被共享的信息。

实例成员变量:属于每个对象,且每个对象信息不同时(name,age,…等)

示例

public class User {// 在线人数信息:静态成员变量public static int onLineNumber = 161;// 实例成员变量private String name;private int age;public static void main(String[] args) {// 1、类名.静态成员变量User.onLineNumber++;// 注意:同一个类中访问静态成员变量,类名可以省略不写System.out.println(onLineNumber);// 2、对象.实例成员变量// System.out.println(name);User u1 = new User();u1.name = "猪八戒";u1.age = 36;System.out.println(u1.name);System.out.println(u1.age);// 对象.静态成员变量(不推荐这样访问)u1.onLineNumber++;User u2 = new User();u2.name = "孙悟空";u2.age = 38;System.out.println(u2.name);System.out.println(u2.age);// 对象.静态成员变量(不推荐这样访问)u2.onLineNumber++;System.out.println(onLineNumber);}
}

static修饰成员变量的内存原理

static修饰成员方法的基本用法

成员方法的分类:

静态成员方法(有static修饰,属于类),建议用类名访问,也可以用对象访问。

实例成员方法(无static修饰,属于对象),只能用对象触发访问。

访问格式

类名.静态成员方法。

对象.静态成员方法。(不推荐)

对象.实例成员方法。

使用场景

表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须声明成实例方法。

如果该方法是以执行一个共用或通用功能为目的,则可以申明成静态方法。

示例

public class Student {private String name;private int age;/**实例方法:无static修饰,属于对象的,通常表示对象自己的行为,可以访问对象的成员变量*/public void study(){System.out.println(name + "在好好学习,天天向上~~");}/**静态方法:有static修饰,属于类,可以被类和对象共享访问。*/public static void getMax(int a, int b){System.out.println(a > b ? a : b);}public static void main(String[] args) {// 1、类名.静态方法Student.getMax(10, 100);// 注意:同一个类中访问静态成员 可以省略类名不写getMax(200, 20);// 2、对象.实例方法// study(); // 报错的Student s = new Student();s.name = "全蛋儿";s.study();// 3、对象.静态方法(不推荐)s.getMax(300,20);}
}

static修饰成员方法的内存原理

static实际应用案例:设计工具类

工具类中定义的都是一些静态方法,每个方法都是以完成一个共用的功能为目的。

案例导学:

在企业的管理系统中,通常需要在一个系统的很多业务处使用验证码进行防刷新等安全控制。

现状问题分析:

如果登录和注册等多处地方都存在验证码逻辑,就会导致同一个功能多处开发,会出现代码重复度过高。

代码实现

public class VerifyTool {/**私有构造器*/private VerifyTool(){}/**静态方法*/public static String createCode(int n){// 1、使用String开发一个验证码String chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";// 2、定义一个变量用于存储5位随机的字符作为验证码String code = "";// 3、循环Random r = new Random();for (int i = 0; i < n; i++) {int index = r.nextInt(chars.length());// 4、对应索引提取字符code += chars.charAt(index);}return code;}
}

工具类的好处

一是调用方便,二是提高了代码复用(一次编写,处处可用)。

为什么工具类中的方法不用实例方法做?

实例方法需要创建对象调用,此时用对象只是为了调用方法,这样只会浪费内存。

工具类的定义和使用的建议 

建议将工具类的构造器进行私有,工具类无需创建对象。

里面都是静态方法,直接用类名访问即可。 

static的注意事项总结[面试热点] 

静态方法只能访问静态的成员,不可以直接访问实例成员。

实例方法可以访问静态的成员,也可以访问实例成员。

静态方法中是不可以出现this关键字的。

static应用知识:代码块

代码块概述

代码块是类的5大成分之一(成员变量、构造器,方法,代码块,内部类),定义在类中方法外。 在Java类下,使用 { } 括起来的代码被称为代码块 。

代码块的分类

静态代码块:

        格式:static{}

        特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次

        使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用。  

构造代码块(了解,用的少):

        格式:{}

        特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行。

        使用场景:初始化实例资源。

静态代码块的应用案例--斗地主游戏

需求: 在启动游戏房间的时候,应该提前准备好54张牌,后续才可以直接使用这些牌数据。

分析:

        该房间只需要一副牌。

        定义一个静态的ArrayList集合存储54张牌对象,静态的集合只会加载一份。

        在启动游戏房间前,应该将54张牌初始化好。

        当系统启动的同时需要准备好54张牌数据,此时可以用静态代码块完成。

代码实现:

public class StaticCodeTest3 {/**模拟初始化牌操作点数: "3","4","5","6","7","8","9","10","J","Q","K","A","2"花色: "♠", "♥", "♣", "♦"1、准备一个容器,存储54张牌对象,这个容器建议使用静态的集合。静态的集合只加载一次。*/// int age = 12;public static ArrayList<String> cards = new ArrayList<>();/**2、在游戏启动之前需要准备好54张牌放进去,使用静态代码块进行初始化*/static{// 3、加载54张牌进去。// 4、准备4种花色:类型确定,个数确定了String[] colors = {"♠", "♥", "♣", "♦"};// 5、定义点数String[] sizes = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};// 6、先遍历点数、再组合花色for (int i = 0; i < sizes.length; i++) {// sizes[i]for (int j = 0; j < colors.length; j++) {cards.add(sizes[i] + colors[j]);}}// 7、添加大小王cards.add("小🃏");cards.add("大🃏");}public static void main(String[] args) {System.out.println("新牌:" +  cards);}
}

static应用知识:单例

设计模式

开发中经常遇到一些问题,一个问题通常有n种解法的,但其中肯定有一种解法是最优的,这个最优的解法被人总结出来了,称之为设计模式。

设计模式有20多种,对应20多种软件开发中会遇到的问题,学设计模式主要是学2点:

第一:这种模式用来解决什么问题。

第二:遇到这种问题了,该模式是怎么写的,他是如何解决这个问题的。

单例模式介绍

可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象。

例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间。

饿汉单例模式

在用类获取对象的时候,对象已经提前为你创建好了。

设计步骤:

        定义一个类,把构造器私有。

        定义一个静态变量存储一个对象。

代码实现:

public class SingleInstance1 {/**static修饰的成员变量,静态成员变量,加载一次,只有一份*/// public static int onLineNumber = 21;public static SingleInstance1 instance = new SingleInstance1();/**1、必须私有构造器:私有构造器对外不能被访问。*/private SingleInstance1(){}
}

懒汉单例模式

在真正需要该对象的时候,才去创建一个对象(延迟加载对象)。

设计步骤:

        定义一个类,把构造器私有。

        定义一个静态变量用来指向一个对象。

        提供一个返回单例对象的方法。

代码实现:

public class SingleInstance2 {/**2、定义一个静态的成员变量用于存储一个对象,一开始不要初始化对象,因为人家是懒汉*/private static SingleInstance2 instance;/**1、私有构造器啊*/private SingleInstance2(){}/**3、提供一个方法暴露,真正调用这个方法的时候才创建一个单例对象*/public static SingleInstance2 getInstance(){if(instance == null){// 第一次来拿对象,为他做一个对象instance = new SingleInstance2();}return instance;}
}

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

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

相关文章

通用web自动扩缩容_智能运维引擎CudgX

一、概述 CudgX是星汉未来自主研发的面向云原生时代的智能运维引擎&#xff0c;支持根据 MetricQPS 分段耗时指标进行自动扩缩容。 通过各类服务的多维度、大规模的日志数据采集以及机器学习训练分析&#xff0c;对服务进行数字化、指标化度量&#xff0c;并基于部署的…

【Java】设计模式之顺序控制

实际开发中&#xff0c;有时候一些场景需求让多个线程按照固定的顺序依次执行。这个时候就会使用这种模式。 这种模式说白了&#xff0c;就是给线程设定不同的条件&#xff0c;不符合条件的话&#xff0c;就算线程拿到锁也会释放锁进入等待&#xff1b;符合条件才让线程拿到锁…

重生奇迹mu中的智力妹妹都能召唤出哪些宠物呢?

身为重生奇迹mu中的智力妹妹&#xff0c;其实是女性玩家最爱的一种职业&#xff0c;因为她是一种辅助职业&#xff0c;不需要直接参与到战役之中&#xff0c;只需躲藏在队友身后&#xff0c;提供各种BUFF的支援&#xff0c;就能充分发挥其作用&#xff0c;而且身为团队中的唯一…

Redis Geo:掌握地理空间数据的艺术

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Redis Geo&#xff1a;掌握地理空间数据的艺术 前言Redis Geo基本概念Geo模块的目的工作原理地理坐标系统 GEO的分值1. 经纬度范围2. 二分编码3. Base32编码4. 精度为什么使用Geohash&#xff1f; GEO…

Axure RP Extension For Chrome 插件安装

1. 下载好 AXURE RP EXTENSION For Chrome 插件之后解压成文件夹 2. 打开浏览器&#xff0c;找到设置--更多工具--扩展程序--加载已加压的扩展程序&#xff0c;选择解压好的文件夹 3. 点击详细信息&#xff0c;打开访问网址权限

I.MX6ULL_Linux_驱动篇(52)linux CAN驱动

CAN 是目前应用非常广泛的现场总线之一&#xff0c;主要应用于汽车电子和工业领域&#xff0c;尤其是汽车领域&#xff0c;汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。 CAN 总线目前是自动化领域发展的热点技术之一&#xff0c;由于其高可靠性&#xff0c; CAN 总线…

【性能测试】JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种&#xff0c;它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈&#xff0c;确保能满足业务需求。很多系统都需要做性能测试&#xff0c;如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…

< Linux >缓冲区

在上一篇文件的重定向&#xff0c;通常会涉及文件描述符的操控。文件描述符1&#xff08;fd 1&#xff09;通常代表着标准输出&#xff08;stdout&#xff09;&#xff0c;它默认是指向用户的终端或控制台。当执行文件重定向操作时&#xff0c;如果我们关闭文件描述符1&#xf…

AUTOSAR Builder—符合AUTOSAR(CPAP)的嵌入式系统设计工具

产品概述 AUTOSAR Builder是达索旗下一款基于Eclipse并使用Artop的可扩展工具套件。Artop是由AUTOSAR成员和合作伙伴共同推动的开放的AUTOSAR工具环境。它使用户能够构建自己的工具并与其他工具供应商进行集成。AUTOSAR Builder在此基础上新增了多个工具套件&#xff0c;更加能…

华为HarmonyOS 创建第一个鸿蒙应用 运行Hello World

使用DevEco Studio创建第一个项目 Hello World 1.创建项目 创建第一个项目&#xff0c;命名为HelloWorld&#xff0c;点击Finish 选择Empty Ability模板&#xff0c;点击Next Hello World 项目已经成功创建&#xff0c;接来下看看效果 2.预览 Hello World 点击右侧的预…

INT201 形式语言与自动机笔记(下)

L6 Context-Free Languages 上下文无关语言 Context-Free Grammar (CFG) 是一组用于生成字符串模式的递归规则。上下文无关的语法可以描述所有的常规语言&#xff0c;但它们不能描述所有可能的语言。 e.g 遵循这些规则&#xff0c;我们可以生成一种语言: 上下文无关文法 Co…

热钱涌向线控底盘!XYZ全栈集成引领新风向

在车身、底盘部分&#xff0c;中央计算区域控制带动传统车控、底盘及动力控制ECU市场迎来新一轮技术升级和域融合窗口期。线控制动、转向及空气悬架&#xff0c;正在加速与智能驾驶融合并进一步提升驾乘体验。 12月13-15日&#xff0c;2023&#xff08;第七届&#xff09;高工…

树莓派3B+ /+ CSI摄像头 + FFmpeg + SRS 实现直播推流

简介&#xff1a; 手头有一个树莓派3B 和一块CSI摄像头&#xff0c;想要实现一个推拉流直播的效果。 所需材料&#xff1a;开发板&#xff08;我用的是树莓派3B&#xff09;、CIS摄像头、云服务器&#xff08;用来搭建SRS服务器&#xff09; 具体实现思路&#xff1a; 使用…

[排序算法] 如何解决快速排序特殊情况效率低的问题------三路划分

前言 在[C/C]排序算法 快速排序 (递归与非递归)一文中,对于快速排序的单趟排序一共讲了三种方法: hoare、挖坑法、双指针法 ,这三种方法实现的快速排序虽然在一般情况下效率很高,但是如果待排序数据存在大量重复数据,那这几种方法的效率就很低,而为了解决快速排序在这样特殊情况…

XCode Build报错

XCode Build时报以下错误 B/BL out of range 143266484 (max /-128MB) 错误提示表明生成的机器代码太大&#xff0c;超出了限制 需要在XCode工程中添加宏定义&#xff0c;使得生成的可执行文件超过限制 步骤&#xff1a; 在项目设置页面中&#xff0c;选择 “Build Settings…

labelme的安装

首先尝试在(openmmlab)的python3.8的环境下安装&#xff08;失败&#xff09;。应该是我环境其他部分不对&#xff0c;和python版本应该没什么关系。&#xff08;后续&#xff0c;创建新的环境后成功&#xff0c;可直接看最后一部分。&#xff09; 首先安装是没问题的 pip in…

浅谈智能照明系统调试阶段节能方案的探究与产品选型

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 【摘要】针对当今智能照明系统调试完成前能源浪费的问题&#xff0c;本文结合工程案例&#xff0c;分析研究了智能照明系统调试阶段的节能方法&#xff0c;提出了采用时间控制器来解决能源及人工浪费等问题的方式。实践证明&a…

基于spark的个性化招聘推荐系统

介绍 本就业推荐系统是一个基于Spark框架的个性化推荐平台&#xff0c;使用Python Django框架、Vue和Element-Plus UI组件库构建而成。该系统通过Scrapy爬虫框架抓取招聘网站的职位数据&#xff0c;用户可以根据关键词查询符合条件的职位信息&#xff0c;同时还提供了基于协同…

QT应用篇:QT自定义最小化托盘显示和操作

将应用程序最小化到托盘任务栏中,可以使用Qt框架中的QSystemTrayIcon类。该类允许应用程序在关闭窗口后最小化到系统托盘,保持在后台运行,同时可以显示应用程序图标、添加右键菜单功能以及发送消息通知等。通过学习这些技术,能够为自己的Qt应用程序增加更多的交互性和便利性…

关于Js深拷贝的三种方法详细讲解

目录 前言 一、pandas是什么&#xff1f; 二、使用步骤 1.利用函数递归来实现深拷贝 2.利用引入lodash包 3.利用JSON字符串转换 总结 前言 当涉及到JavaScript数据拷贝的时候&#xff0c;深拷贝是一个非常关键的概念。在JavaScript中&#xff0c;对象和数组被认为是引用类型&a…