static关键字(java)

article/2025/9/12 15:30:27

一、static的用途

1.static修饰的变量和方法是属于类的;

2.static修饰的变量和对象,方法存储在方法区的静态常量池中;是共享的;

3.可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法

4.static修饰的代码块在main方法前执行,目的是修饰main方法

5.static关键字修饰的方法或者变量不需要依赖于对象来进行访问,只要类被加载了,就可以通过类名去进行访问

6.static方法是没有this的方法,在static方法内部不能调用非静态方法,反过来是可以的

static:方便在没有创建对象的情况下来进行调用方法和变量

二、static修饰符

重点:static属于类 

1.static修饰变量

static变量也称作静态变量,static成

静态变量和非静态变量的区别是:静态变量被所有的对象所共享,在内存中只有一个地址,它当且仅当在类初次加载时会被初始化。而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个地址空间,各个对象拥有的地址空间互不影响。

2.static修饰方法

static方法称作静态方法,静态方法不依赖于任何对象就可以进行访问,因此对于静态方法来说,是没有this的,因为它不依附于任何对象,既然都没有对象,就谈不上this了。并且由于这个特性,在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是必须依赖具体的对象才能够被调用。

静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的

static方法就是没有this的方法。在static方法内部不能调用非静态方法,反过来是可以的。而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用static方法。

3.static修饰代码块

在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。 

在main方法运行所以能优化程序

三、static的内存加载

static关键字存储在我们的方法区当中的静态常量池当中,static修饰的方法、变量和代码块都是可以被用来共享的

输出:李四 王五

 输出:王五

 输出:李四

 

 public class Person {private int age ;private String name;public static String from;public Person(int age, String name) {super();this.age = age;this.name = name;}@Overridepublic String toString() {return "Person [age=" + age + ", name=" + name + ", from=" + from + "]";}public static void main(String[] args) {Person person1 = new Person(20,"张三");Person person2 = new Person(21,"李四");Person.from = "中国";System.out.println(person1.toString());System.out.println(person2.toString());}}

Person [age=20, name=张三, from=中国]

Person [age=21, name=李四, from=中国]

四、static执行顺序

public class Test {static{System.out.println("test static");}public Test(){System.out.println("test constructor");}public static void main(String[] args) {new Test();}
}class Base{static{System.out.println("base static");}public Base(){System.out.println("base constructor");}
}

先来想一下这段代码具体的执行过程,在执行开始,先要寻找到main方法,因为main方法是程序的入口,但是在执行main方法之前,必须先加载Test类,而在加载Test类的时候发现Test类继承自Base类,因此会转去先加载Base类,在加载Base类的时候,发现有static块,便执行了static块。在Base类加载完成之后,便继续加载Test类,然后发现Test类中也有static块,便执行static块。在加载完所需的类之后,便开始执行main方法。在main方法中执行new Test()的时候会先调用父类的构造器,然后再调用自身的构造器。因此,便出现了上面的输出结果。

public class Test {Person person = new Person("Test");static{System.out.println("test static");}public Test() {System.out.println("test constructor");}public static void main(String[] args) {new MyClass();}
}class Person{static{System.out.println("person static");}public Person(String str) {System.out.println("person "+str);}
}class MyClass extends Test {Person person = new Person("MyClass");static{System.out.println("myclass static");}public MyClass() {System.out.println("myclass constructor");}
}
test static
myclass static
person static
person Test
test constructor
person MyClass
myclass constructor

 类似地,我们还是来想一下这段代码的具体执行过程。首先加载Test类,因此会执行Test类中的static块。接着执行new MyClass(),而MyClass类还没有被加载,因此需要加载MyClass类。在加载MyClass类的时候,发现MyClass类继承自Test类,但是由于Test类已经被加载了,所以只需要加载MyClass类,那么就会执行MyClass类的中的static块。在加载完之后,就通过构造器来生成对象。而在生成对象的时候,必须先初始化父类的成员变量,因此会执行Test中的Person person = new Person(),而Person类还没有被加载过,因此会先加载Person类并执行Person类中的static块,接着执行父类的构造器,完成了父类的初始化,然后就来初始化自身了,因此会接着执行MyClass中的Person person = new Person(),最后执行MyClass的构造器。

再来看一道经典例题:涉及到类的加载顺序问题

 结果分析:

1.main方法所在的类一定是优先加载进来的,main方法加载进来后,就开始从上往下给静态的域和静态的初始化方法进行执行(分为两个阶段,第一阶段给所有的静态域赋值为0或null,先全部引入进来,静态方法这时候不执行,第二阶段,开始从上往下执行静态初始化语句和静态初始化块)

这时候执行k=1,第二句new了一个新对象,这时从上到下执行一遍非静态的初始化语句和初始化块,找到了一个非静态初始化块,这时执行里面内容,调用print方法,输出第一句

2.接着执行非静态的初始化语句和初始化块,

到了这一句,同样,调用print方法,输出第二行

3.没有非静态的了,这时执行构造函数,导致输出第三行 

4.然后执行第二个new语句,同理,会输出4.5.6句

7.接着执行

 输出第七行

8.执行n=99语句,n就变成了99,然后执行static静态块的内容,输出第八行

9.然后在最底下main方法里有new一个新对象的语句,这时,从上到下执行一遍非静态的初始化语句和初始化块,依次找到非静态初始化块,和private int j =print ("j")语句,依次输出第9.10句,然后再打印构造函数,输出第11句。

 

本文参考:Java中的static关键字解析 - Matrix海子 - 博客园


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

相关文章

static关键字的用法

static关键字用法 目录 一.概述二.使用动机三.使用方法 static关键字修饰类static关键字修饰方法static关键字修饰变量static关键字修饰代码块 一. 概述 > static是一个静态修饰符关键字,表示静态的意思, ①方便在没有创建对象的情况下进行调用。可…

static 关键字用法总结

一、static 关键字的含义 static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么&#…

java static关键字的作用是什么_static关键字有什么作用

今天主要学习下Java语言中的static关键字。 static关键字的含义及使用场景 static是Java50个关键字之一。static关键字可以用来修饰代码块表示静态代码块,修饰成员变量表示全局静态成员变量,修饰方法表示静态方法。(注意:不能修饰普通类,除了内部类,这是为什么?)class A …

static关键字的作用

目录 C语言中static关键字的作用 1.static关键字修饰局部变量 2.static关键字修饰全局变量 3.static关键字修饰函数 在C中static关键的作用 1.静态成员变量 2.静态成员函数 C语言中static关键字的作用 1.static关键字修饰局部变量 概念: static修饰局部变量就…

静态关键词:static

static关键字的作用 static是静态的意思,可以修饰成员变量,表示给成员变量只在内存中存储一份,可以被共享访问、修改 成员变量可以分为2类1、静态成员变量(有static修饰,属于类,内存中加载一次&#xff…

C# -- static 关键字

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

static关键字详解

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

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

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

Windows添加路由的方法

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

如何在 Linux 上添加路由?

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

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

路由基础知识: 是由一项或者多项路由表组成的,每个IP报文被发送前,系统都会查找主机路由表,决定将这个报文从 哪个网卡,发送到哪个下一跳。路由表项可以分成主机路由,网络路由和默认路由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是一个相当简单的工具,非常适合…

addRoute动态添加路由

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

CentOS7添加路由

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

添加路由表

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

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

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

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

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

RANSAC算法原理与实现

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

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

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