静态关键词:static

article/2025/9/12 15:49:36
static关键字的作用    static是静态的意思,可以修饰成员变量,表示给成员变量只在内存中存储一份,可以被共享访问、修改
成员变量可以分为2类1、静态成员变量(有static修饰,属于类,内存中加载一次):常表示如在线人数信息、等需要被共享的信息,可以被共享访问public class User{//静态成员变量public static String onlineNumber = 161;}访问格式:类名.静态成员变量(推荐)对象.静态成员变量(不推荐)2、实例成员变量(无static修饰,存在于每个对象中):常表示姓名name、年龄age、等属于每个对象的信息public class User{//静态成员变量public static String onlineNumber = 161;//实例成员变量private String name;private int age;}访问格式:对象.实例成员变量

public class User {//在线人数,静态成员变量public static int onlineNumber = 161;//实例成员变量private String name;private int age;public static void main(String[] args) {//1.类名.静态成员变量User.onlineNumber++;//162//注意:同一个类中访问静态成员变量,类名可以省略不写System.out.println(onlineNumber);//162//2、对象.实例成员变量//只能通过对象访问User u1 = new User();u1.name = "张三";u1.age = 24;System.out.println(u1.name + "今年" + u1.age);//张三今年24//对象.静态成员变量(不推荐这样访问)u1.onlineNumber++;System.out.println(onlineNumber);//163}
}

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

成员方法的分类:静态成员方法(有static修饰,属于类),建议用类名访问,也可以用对象访问实例成员方法(无static修饰,属于对象),只能用对象进行访问
使用场景:1、表示对象自己的行为的,且方法中需要访问实例成员的,则该方法必须申明成实例方法2、如果该方法是以执行一个通用功能为目的,或者需要方便访问,则可以申明成静态方法

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, 20);//注意:同一个类中,类名可以省略不写getMax(100, 200);//2、对象.实例方法//study();//报错,得用对象访问Student s = new Student();s.name = "懒洋洋";s.study();//3、对象.静态方法s.getMax(30, 10);}
}

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

 static实际应用案例:使用静态方法定义工具类

案例导学:

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

        

 现状问题分析:

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

工具类对于一些应用程序中多次需要用到的功能,可以将这些功能封装成静态方法,放在一个类中,这个类就是工具类
工具类的作用:一是方便调用,二是提高了代码的复用
工具类原理和延伸一次编写,处处可用建议将工具类的构造器私有,不让工具类对外产生对象
为什么工具类中的方法不用实例方法来做?实例方法需要创建对象调用,此时用对象只是为了调用方法,这样只会浪费内存
构造器私有也是同样道理

import java.util.Random;public class VerifyTool {/**构造器私有*/private VerifyTool() {}/*** 静态方法*/public static String creatCode(int n) {//1、使用String开发验证码String s = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";//2、定义一个变量用来存储验证码String code = "";Random r = new Random();for (int i = 0; i < n; i++) {int index = r.nextInt(s.length());code += s.charAt(index);}return code;}
}
//调用验证码这个工具类
类名.静态方法
VerifyTool.creatCode(5);

练习:定义数组工具类

//工具类public class ArraysUtils {/*** 构造器私有*/private ArraysUtils() {}/*** 静态方法*/public static String toString(int[] arr) {if (arr != null) {String result = "[";for (int i = 0; i < arr.length; i++) {result += (i == arr.length - 1 ? arr[i] : (arr[i] + " ,"));}result += "]";return result;} else {return null;}}public static double getAverage(int[] arr) {//总和 最大值 最小值int max = arr[0];int min = arr[0];int sum = 0;for (int i = 0; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}if (arr[i] < min) {min = arr[i];}sum += arr[i];}return (sum - max - min) * 1.0 / (arr.length - 2);}
}
//使用工具类的静态方法
public class Test {public static void main(String[] args) {int[] arr = {10, 20, 30, 400};System.out.println(arr);//数组的地址System.out.println(ArraysUtils.toString(arr));//调用工具类,输出数组内容//[10,20,30,400]System.out.println(ArraysUtils.getAverage(arr));//调用工具类,输出25.0int[] arr1 = null;//nullSystem.out.println(ArraysUtils.toString(arr1));//调用工具类,输出数组内容int[] arr2 = {};//[]System.out.println(ArraysUtils.toString(arr2));//调用工具类,输出数组内容}
}
static访问注意实现:静态方法只能访问静态的成员,不可以直接访问实例成员,但可以创建对象访问实例方法可以访问静态的成员,也可以访问实例成员静态方法中是不可以出现this关键字的
public class Test {//静态成员变量public static int onlineNumber;//实例成员变量private String name;//1、静态方法的访问public static void gerMax() {//静态方法可以直接访问静态成员System.out.println("访问实例成员" + Test.onlineNumber);//访问静态成员变量//System.out.println(onlineNumber);inAddr();//访问静态成员方法//3、静态方法中不能出现this关键字//System.out.println(this.name);//报错//静态方法不能直接访问实例变量,可以创建对象进行访问Test t = new Test();//System.out.println(name);//报错,不能直接访问System.out.println(t.name);//可以访问//访问实例方法同理t.run();//可以访问}//静态成员方法public static void inAddr() {System.out.println("访问静态成员方法成功!");}//2、实例方法的访问public void run() {//直接访问静态成员变量System.out.println(onlineNumber);System.out.println(Test.onlineNumber);//直接访问实例成员变量System.out.println(name);sing();//访问实例方法Test.gerMax();//访问静态方法//gerMax();}public void sing() {System.out.println("实例成员方法被访问");}public static void main(String[] args) {}
}
代码块概述代码块是类的5大成分之一(成员变量、构造器、方法、代码块、内部类),定义在类中方法外在Java类下,使用{}括起来的代码被称为代码块
代码块分为1、静态代码块格式:static{}特点:需要通过static关键字修饰,随着类的加载而加载,并且自动触发、只执行一次使用场景:在类加载的时候做一些静态数据初始化的操作,以便后续使用3、构造代码块(了解,用的少)格式:{}特点:每次创建对象,调用构造器执行时,都会执行该代码块中的代码,并且在构造器执行前执行使用场景:初始化实例资源
public class Test {public static String schoolName;public static void main(String[] args) {System.out.println("-----main方法被执行-----");System.out.println(schoolName);}/*** 代码块* 特点:与类一起加载,自动触发一次,优先被执行* 作用:可以在程序加载时进行静态数据的初始化操作(准备内容)*/static {System.out.println("---------静态初始化被触发执行--------");schoolName = "清华大学";}
}

public class Test {/*** 属于对象的,与对象一起加载,自动触发执行*/{System.out.println("-----构造代码被触发执行一次------");}public Test() {System.out.println("--------构造器被触发执行--------");}public static void main(String[] args) {new Test();//创建对象new Test();//创建对象}
}

 静态代码块应用案例

斗地主游戏
需求:在启动游戏房间的时候,应提前准备好54张牌,后续才可以直接使用这些牌的数据
分析该房间只需要一副牌定义一个静态的ArrayList集合存储54张牌初始化好在启动游戏房间前,应该将54张牌初始化好当系统启动的同时需要准备好54张牌的数据,此时可以用静态代码块完成
import java.util.ArrayList;public class Test {//准备好放54张牌的容器public static ArrayList<String> cards = new ArrayList<>();//在游戏启动前将54张牌初始化好,使用静态代码块static {//加载54张牌//四种花色String[] colors = {"♥", "♣", "♠", "♦"};//点数String[] size = {"3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A", "2"};//先遍历点数再遍历花色for (int i = 0; i < size.length; i++) {for (int j = 0; j < colors.length; j++) {cards.add(size[i] + colors[j]);}}//添加大小王cards.add("大王");cards.add("小王");}public static void main(String[] args) {System.out.println("新牌:" + cards);}
}
什么是设计模式设计模式是一套被前人反复使用、多数人知晓、经过分类编目的代码设计经验的总结,后来者可以直接拿来解决问题设计模式是软件设计中的常见解决方案,好的设计模式可以进一步的提高代码的重用性
单例模式:可以保证系统中,应用该模式的这个类永远只有一个实例,即一个类永远只能创建一个对象
单例的场景和作用例如任务管理器对象我们只需要一个就可以解决问题了,这样可以节省内存空间
单例模式的实现:饿汉单例模式、懒汉单例模式
饿汉单例设计模式在用类获取对象的时候,对象已经提前创建好了
设计步骤:定义一个类,把构造器私有定义一个静态变量存储一个对象//1、定义一个单例类public class SingleInstance{//3、定义一个静态变量存储一个对象(属于类,与类一起加载一次)public static SingleInstance instance = new SingleInstance();//2、单例必须私有构造器private SingleInstance(){System.out.println("创建了一个对象");}}//调用单例饿汉模式SingleInstance s1 = SingleInstance.instance;
懒汉单例设计模式在真正需要该对象的时候,才去创建一个对象(延迟加载对象)
设计步骤定义一个类,把构造器私有定义一个静态变量存储一个对象提供返回单例对象的方法//1、定义一个单例类public class SingleInstance{//3、定义一个静态变量存储一个对象(属于类,与类一起加载一次)public static SingleInstance instance;//null//2、单例必须私有构造器private SingleInstance(){}//必须提供一个方法返回一个单例对象public static SingleInstance getInstance(){...return...;}}
public class Test {public static void main(String[] args) {SingleInstance s1 = SingleInstance.instance;SingleInstance s2 = SingleInstance.instance;SingleInstance s3 = SingleInstance.instance;//同一对象,地址是一样的System.out.println(s1);System.out.println(s2);System.out.println(s1==s3);//ture}
}
//1、定义一个单例类
public class SingleInstance {//3、定义一个静态变量存储一个对象(属于类,与类一起加载一次)public static SingleInstance instance;//null//2、单例必须私有构造器private SingleInstance() {}//必须提供一个方法返回一个单例对象public static SingleInstance getInstance() {if (instance == null) {//第一次获取对象instance = new SingleInstance();}return instance;}
}


http://chatgpt.dhexx.cn/article/SFkMTmIL.shtml

相关文章

C# -- static 关键字

一、static关键字 static 关键字&#xff0c;用于修饰类&#xff0c;字段&#xff0c;属性&#xff0c;方法&#xff0c;构造方法等。被 static 修饰的类称之为“静态类”&#xff1b; 被 static 修饰的成员称之为“静态成员”&#xff0c;被修饰过的成员分别称为&#xff1a;…

static关键字详解

1.概述&#xff1a; static&#xff1a;就是多个对象共享同一份数据 一个类的不同对象有些共享的数据&#xff0c;这样我们就可以使用static来修饰 一旦使用了static关键字&#xff0c;那么这样的内容不再属于对象&#xff0c;而是属于类的&#xff0c;所以凡是本类的对象&…

在 C/C++中 static 关键字详解

static 关键字详解 C/C 中的 static1. 静态局部变量2. 静态全局变量全局变量 与 extren 3. static 修饰函数 C的 static 成员静态成员变量const修饰的成员除外 静态成员函数 总结&#xff1a; static是 C/C中的关键字之一&#xff0c;是常见的函数与变量&#xff08;C中还包括类…

Windows添加路由的方法

假设本来的局域网网关是192.100.10.1&#xff0c;现在要访问网关是192.100.20.0的服务器&#xff0c;可以手动添加路由。 方法&#xff1a; 1.以管理员的身份打开cmd命令窗口 2.输入 route add 192.100.20.0 mask 255.255.255.0 192.100.10.1 -p&#xff08;最后加上-p就是…

如何在 Linux 上添加路由?

在 Linux 系统中&#xff0c;路由是网络通信的关键组件之一。通过添加路由&#xff0c;您可以指定数据包在网络中的传输路径&#xff0c;从而实现网络连接和数据转发。本文将详细介绍如何在 Linux 上添加路由&#xff0c;以便您可以根据需要配置网络路由并实现灵活的网络连接。…

Linux上添加路由,删除路由,修改路由配置(route add, route del, 路由表项基本知识)

路由基础知识&#xff1a; 是由一项或者多项路由表组成的&#xff0c;每个IP报文被发送前&#xff0c;系统都会查找主机路由表&#xff0c;决定将这个报文从 哪个网卡&#xff0c;发送到哪个下一跳。路由表项可以分成主机路由&#xff0c;网络路由和默认路由3种。每条路由表项…

【网络】route和 IP route的区别|route 和 IP route 添加路由

目录 route和 IP route的区别 route 和 IP route 显示路由 route 和 IP route 添加路由 route 添加路由 IP route 添加路由 添加的路由持久化 linux下添加路由的方法 使用 route 命令 使用ip route 命令 route和 IP route的区别 route是一个相当简单的工具&#xff0c;非常适合…

addRoute动态添加路由

项目进行到最后&#xff0c;突然通知说要使用动态路由&#xff0c;在网上找了一堆方法&#xff0c;发现不是要使用vuex就是要搭配缓存&#xff0c;这个时候完全不知如何下手&#xff0c;该怎么做简单一点呢&#xff1f; 先介绍一下项目需求&#xff0c;根据用户登录后返回的唯…

CentOS7添加路由

目录 一、route命令介绍 1、语法 2、命令使用举例 默认&#xff08;网关&#xff09;路由 主机路由 网络路由 二、ip 命令 三、永久添加路由条目&#xff08;重启不会失效&#xff09; 一、route命令介绍 命令用来显示并设置Linux内核中的网络路由表&#xff0c;设置的…

添加路由表

添加永久路由&#xff08;网络重启后仍然有效&#xff09; windows系统&#xff1a; 1.cmd打开控制台 2.输入&#xff1a;route add -p目的ip地址mask 子网掩码网关地址 ubuntu系统&#xff1a; 1.任意位置新建terminal输入&#xff1a; 2.sudo chmod 777 -R /etc/rc.local回车…

添加路由的2种方式--router

第一种cmd方法: 重新创建一个项目 添加路由&#xff1a; 打开文件夹 在路径栏里面输入cmd 打开cmd命令行 输入 vue create router-pro 选择下面选项 按下键选择路由并回车&#xff1a; 选择vue2版本 问你是否使用路由的历史模式&#xff1a; 输入n 问你eslint的语法规范选择…

内外网同时使用之添加路由

鉴于工作需要&#xff0c;开发的项目需要在内网中进行测试。但是出现bug时又需要在互联网中查询bug来源&#xff0c;在整个过程中&#xff0c;需要切换内外网&#xff0c;断了外网切内网&#xff0c;断了内网切外网&#xff0c;麻烦的不是一批。所以向项目经理请教了一下&#…

RANSAC算法原理与实现

参考原文&#xff1a; RANSAC算法学习笔记 重点内容&#xff1a; 算法流程&#xff1a; 1、在可以有&#xff08;也可以没有&#xff0c;主要看应用场景&#xff09;条件限制&#xff08;比如选的子集里的点不能过远等&#xff09;的情况下&#xff0c;随机选取子集&#xff…

深度解析RANSAC算法(精华修正版)

RANSAC算法看似简单&#xff0c;实际上还是有很多坑的&#xff0c;网上有一些关于RANSAC算法的介绍不准确&#xff0c;或者说不全面。 之前我写过一个rnsac算法简介的博客&#xff0c;那么这篇博客将带你再次填这个大坑&#xff01; 目录 1. RANSAC算法论述 2. RANSAC算法…

利用RANSAC算法筛选SIFT特征匹配

关于RANSAC算法的基本思想&#xff0c;可从网上搜索找到&#xff0c;这里只是RANSAC用于SIFT特征匹配筛选时的一些说明。 RANSAC算法在SIFT特征筛选中的主要流程是&#xff1a; (1) 从样本集中随机抽选一个RANSAC样本&#xff0c;即4个匹配点对 (2) 根据这4个匹配点对计算变…

Ransac算法学习python版

初学小白,注释的代码比较详细 import numpy as np import scipy as sp import scipy.linalg as sldef ransac(data, model, n, k, t, d, debug False, return_all False):"""参考:http://scipy.github.io/old-wiki/pages/Cookbook/RANSAC伪代码:http://en.wi…

RANSAC算法实现 + 直线拟合

一、RANSAC算法 1.参考资料 [1]题目来源与解析&#xff1a;商汤科技SLAM算法岗的RANSAC编程题 [2]牛客网题目&#xff1a;[编程题]线性回归 [3]牛客网解答参考&#xff1a;商汤科技某算法岗的编程题有点过分了啊 [4]RANSAC算法原理&#xff1a;RANSAC翻译、经典RANSAC以及…

精匹配——Opencv实现RANSAC算法进行误匹配对剔除,并和最小二乘法对比

精匹配——RANSAC算法思想及优缺点 目录 精匹配——RANSAC算法思想及优缺点前言一、RANSAC简介二、RANSAC基本思想1.步骤2.迭代次数的公式3.举例&#xff08;拟合直线&#xff0c;拟合最佳单应性矩阵&#xff09; 三、最小二乘法1、最小二乘法的主要思想2、最小二乘解3、仿射变…

ransca算法详细介绍

1、算法概述&#xff1a; RANSAC算法的基本假设是样本中包含正确数据(inliers&#xff0c;可以被模型描述的数据)&#xff0c;也包含异常数据(outliers&#xff0c;偏离正常范围很远、无法适应数学模型的数据)&#xff0c;即数据集中含有噪声。这些异常数据可能是由于错误的测…