static关键字详解~

2023/9/30 18:30:26

目录

一、static概述

二、static修饰成员变量 

三、static修饰成员方法 

四、static修饰代码块


一、static概述

static是Java中的关键字,可以修饰变量、方法、代码块。被static修饰的变量、方法、代码块称为静态成员,存放于内存的方法区,并且伴随类的加载而加载,不单独属于类的某个对象。

二、static修饰成员变量 

被static修饰的成员变量称为静态成员变量,是类的一个属性,其生命周期伴随类的一生。

例如:Student类的clase为静态成员变量 

public class Student {
    private String name;
    private int age;
    public static String clase;//学生所属的班级

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public static String getClase() {
        return clase;
    }

    public static void setClase(String clase) {
        Student.clase = clase;
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
 @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

 在Main类对Student类做一些测试:

class Main{
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student.clase);
        System.out.println(Student.clase);

    }
}

运行结果:

 

 null为String变量的默认值,通过上述例子我们可以看出:类和对象都能访问静态成员变量。

在含有静态成员变量的类的构造方法中,通常不含有静态成员变量。

对静态成员变量初始化下方式:

  • 默认赋值:整型变量默认赋值为0,浮点型默认赋值为0.0,char型默认赋值为'\u0000',boolean型变量默认赋值为false,引用变量默认赋值为null。
  • 直接赋值:在定义静态成员变量时直接赋值,例如:public static String clase="计算机202"。
  • 利用提供的get()方法进行赋值。
  • 通过代码块赋值。

三、static修饰成员方法 

被static修饰的成员方法成为静态成员方法。

静态成员方法既可以通过类,也可以通过对象,但更推荐前者。

静态成员方法中不能调用非静态的成员方法和属性,但是普通成员方法是可以调用静态成员方法的。对于静态成员变量的get和set方法推荐使用静态成员方法,否则想要获取静态成员变量时,必须先实例化一个对象,这样使静态成员变量失去了意义。

 

class Main{
    public static void main(String[] args) {
        Student student = new Student("李明",12);
       student.printClase();

    }
}

运行结果:

 四、static修饰代码块

代码块:被{}修饰的一段代码,通常可以分为普通代码块,构造代码块,静态代码块,同步代码块(用于多线程,此处不作解释)。 

普通代码块:定义在方法内部的代码块。

例如在Student类中增加一个test方法:

public void test(){
        System.out.println("下面是普通代码块");
        {
            System.out.println("这是普通代码块");
        }
    }
class Main{
    public static void main(String[] args) {
        Student student = new Student("李明",12);
       student.test();

    }
}

运行结果:

 

所以普通代码块在方法内部按顺序执行,通常是用于限定一个变量的作用范围 。

构造代码块: 定义在类中的代码块,不加任何修饰符。

实例代码块只有在创建对象时才会执行。

 例如在Student类中定义一个构造代码块如下:

{
        this.name="张三";
        this.age=10;
        System.out.println("这是构造代码块");
    }
class Main{
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(student);
    }
}

运行结果:

 

在实例化对象时,并没有初始化,但是会自动调用构造代码块,对对象的相关成员变量赋值。

当时如果将成员变量定义在构造代码块之后,并直接为赋值时,会覆盖构造代码块的赋值。 

例如:

{
        this.name="张三";
        this.age=10;
        System.out.println("这是构造代码块");
    }
    private int age=25;

运行结果为:

class Main{
    public static void main(String[] args) {
        Student student = new Student("刘强",15);
        System.out.println(student);
    }
}

运行结果:

 

 当实例化对象时进行了初始化,还是会自动调用构造代码块,但构造有参方法对成员赋值会覆盖构造代码块的赋值。

 静态代码块:使用static定义的代码块称为静态代码块。一般用于初始化静态成员变量。

例如在Student类中定义一个静态代码块:

static{
        clase="计算机203";
        System.out.println("这是静态代码块");
    }
class Main{
    public static void main(String[] args) {
        Student student = new Student();
        System.out.println(Student.getClase());
    }
}

运行结果:

 

 静态代码块要先于构造代码块执行。

class Main{
    public static void main(String[] args) {
        Student student1 = new Student();
        System.out.println("===================");
        Student student2 = new Student();
        System.out.println("===================");
        Student student3 = new Student();
    }
}

运行结果:

 

不管生成几个对象,静态代码块只会执行一次。 


http://www.jnnr.cn/a/120212.html

相关文章

JavaScript 68 JavaScript Browser BOM 68.7 JavaScript Timing 事件

JavaScript 文章目录JavaScript68 JavaScript Browser BOM68.7 JavaScript Timing 事件68.7.1 Timing 事件68.7.2 setTimeout() 方法68.7.3 如何停止执行?68.7.4 setInterval() 方法68.7.5 如何停止执行?68.7.6 更多实例68 JavaScript Browser BOM 68.7…

LeetCode刷题---142. 环形链表 II(双指针-快慢指针)

文章目录一、编程题:142. 环形链表 II(双指针-快慢指针)1.题目描述2.示例1:3.示例2:4.示例3:5.提示:6.提示:二、解题思路1.思路2.复杂度分析:3.算法图解三、代码实现总结…

基于PHP+MySQL的企业员工培训管理系统

时代的发展要求员工拥有越来越高的素质和技能。只有不断地学习,不断地努力,不断地提升自己的个人能力,他能够跟上时代的步伐,才能够在企业中创作更多的业绩才能够在企业中拥有不败之地。另一方面,企业也在积极地培育各方面的人才。不定期地对员工进行培训,以提高企业的整体竞争…

Cell:代谢组学肠道微生物群介导生酮饮食的抗癫痫作用

近年来,国内外研究肠道菌群代谢的学者越来越多,而且肠菌研究相关的文章也经常出现在高级别的期刊杂志上,因此肠道菌群代谢目前就像是上海七月的天气,热度一直居高不下,而且还有望继续攀升!那么借着这个热度…

学会这5个方法,全网任意免费复制,告别付费复制

我们在网上搜索资料的时候,经常需要把有用的内容复制下来。但是,并不是所有的网站内容都可以复制、粘贴,有时候复制内容会弹出开通VIP,立即解锁文本内容。要么就是提示要付费,才能够复制内容。在这种情况下&#xff0c…

[附源码]计算机毕业设计JAVAjsp心理测评系统

[附源码]计算机毕业设计JAVAjsp心理测评系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis…

ROS2与turtlebot4仿真入门教程-turtlebot4异步建图

目录: ROS2与turtlebot4仿真入门教程-目录ROS2与turtlebot4仿真入门教程-安装ROS2ROS2与turtlebot4仿真入门教程-安装turtlebot4ROS2与turtlebot4仿真入门教程-turtlebot4遥控ROS2与turtlebot4仿真入门教程-测试雷达和相机ROS2与turtlebot4仿真入门教程-turtlebot4…

如何使用WinDbg查找蓝屏原因

如何使用WinDbg查找蓝屏原因 - zhaotianff - 博客园 从深圳回到长沙后,电脑关机时偶尔会出现irql not less or equal导致的蓝屏,一度怀疑是新装 了机械硬盘导致的,因为以前在深圳没有出现过这种问题。 后面查找了一下资料,发现可…

太空人Wifi天气电子时钟(ESP8266+oled 8针0.96寸)

一、实现效果 WeChat_20221109203218二、开发说明 几个月前就实现了效果,一直没有整理发布博客。开发工具:visual studio code 平台:platformio。visual studio code 安装以及platformio插件 配置可百度,就是使用platformio插件项…

专家特写 | 乾龙:一切都是从拆电脑开始的

熟知驱动人生的朋友都知道,驱动哥经常混迹于驱动人生客户端、公众号、以及各种代码中间,难道是超级打工人会分身术? 其实驱动哥不是一个人,而是一个组织——驱动研究所,驱动哥就是其中9位成员对外的统一身份。 在经过…

线程同步的四种实现方式

目录 内核态 互斥变量 事件对象 资源信号量 用户态 关键代码 内核态 互斥变量 互斥对象包含一个使用数量,一个线程ID和一个计数器。其中线程ID用于标识系统中的哪个线程当前拥有互斥对象,计数器用于指明该线程拥有互斥对象的次数。 创建互斥对…

408 | 【2017年】计算机统考真题 自用回顾知识点整理

数据结构 T3:稀疏矩阵 非零元素个数远小于零元素个数只存储非零元素 顺序存储:三元组 链式存储:十字链表法 T7: 图的基本概念 16条边。1条边有2个顶点。所以整个图的所有顶点度之和为16*2 = 32。 那么算一下当前的度数之和:4*3+3*4=24的度,32-24=-8的度需要加进去,想要使…

概率 | 【提神醒脑】自用笔记串联

本文总结参考于 kira 2023概率提神醒脑技巧班。 笔记均为自用整理。加油!ヾ(◍∇◍)ノ゙ 一研为定! 一、随机事件与概率 1、随机事件与概率公式串讲2、有限可加性3、全概率公式-------------------------------------------------------------------------------------------…

自建QQ/微信防红接口

文章来源:https://www.qian.blue/archives/qq-weixin_fanghong.html 一般来说,博客是第一时间更新的,CSDN是随缘更新。 引言 五月渔郎相忆否?小楫轻舟,梦入芙蓉浦。 ——勿埋我心 这中间就有一段小故事。 QQ打开大部分…

C++ opencv 图像色彩空间转换--色域捕获

1.API和相关知识 1.inRange 在opencv中,我们提取指定色彩范围的区域,采用inRange实现,这样的一块区域,学名叫做ROI(region of interest),感兴趣区域。 关于inRange的提取原理 图像中&#xff0…

喹啉羧酸类 DHODH 抑制剂用于治疗急性髓系白血病

细胞内的嘧啶核苷酸主要来自于从头合成途径和补救合成途径。对于正常分化的细胞和静止的细胞,补救合成途径是嘧啶核苷酸的主要来源。对于恶性增殖的细胞来说,补救合成途径生成嘧啶核苷酸的量无法维持细胞生存,细胞只能依赖于从头合成途径。因…

Linux进程与操作系统详解

文章目录一:冯诺依曼体系二:操作系统三:进程和PCB四:进程相关的指令五:getpid和getppid系统调用六:fork系统调用七:进程状态八:Linux下进程状态大全8.1:R(running)8.2&am…

学习python第7天

Python绘制图形库turtle 1.介绍: turtle库根据一组函数指令的控制,在平面坐标系中移动,从 而它爬行的路径上绘制图形。 2.原理:turtle(海龟)由程序控制在画布上游走,走过的轨迹形成绘 制的图形&#xff0c…

Mybatis学习之动态Sql

目录 1. 什么是动态Sql 2. 动态Sql需要学习什么 3. 动态Sql之《if》 4. 动态Sql之《where》 5. 动态Sql之《foreach》 6. 动态Sql之《sql》 7. PageHelper分页插件的使用 1. 什么是动态Sql 答案:动态Sql指的是,Sql语句是变化的,不是固…

【JVM深层系列】「云原生时代的Java虚拟机」针对于GraalVM的技术知识脉络的重塑和探究

GraalVM 背景 新、旧编程语言的兴起躁动,说明必然有其需求动力所在,譬如互联网之于JavaScript、人工智能之于Python,微服务风潮之于Golang等等。大家都清楚不太可能有哪门语言能在每一个领域都尽占优势,Java已是距离这个目标最接…
最新文章