Java类的static成员以及代码块(详细版)

news2024/11/30 14:37:04

文章目录

  • 一、什么是static成员
  • 二、static修饰的成员有何意义
  • 三、static修饰成员变量
  • 四、static修饰成员方法
    • 4.1、静态成员变量不可以在方法内创建
    • 4.2、静态成员方法内部不可以访问非静态成员变量
    • 4.3、总结
  • 五、static成员变量的初始化
    • 5.1、就地初始化
    • 5.2、静态代码块初始化
  • 六、代码块
    • 6.1、普通代码块
    • 6.2、构造代码块
    • 6.3、静态代码块
    • 6.4、总结

一、什么是static成员

    在Java的类中一般定义有成员属性,以及成员方法两种,但实际上两种可以算为一类,但还可以定义另外一种,就是被static修饰的变量和方法,被static修饰的变量称之为静态变量,也可以叫类变量;被static修饰的方法被称之为静态方法,也可以叫类方法。

    被static修饰的成员,最大的特性就是其不属于对象,不依靠对象,这也就意味着被static修饰的成员在没有实例化对象的情况下就可以使用,被static修饰的成员其属于类,是所有对象所共享的,可以直接使用类名访问并调用。随着类的加载而创建并执行有关于static的成员变量,成员方法,静态代码块,静态成员变量可以理解为类的属性,静态成员方法可以理解为类的行为

二、static修饰的成员有何意义

    当我们在定义一个学生类的时候,我们想要找到并抽象出学生类的成员变量以及成员方法,从而定义的类能够描述出学生这么一个对象,经而实例化才可以真正的在程序世界里面形成一个学生实体。

public class Sdutent {
    private String name;
    private int age;
    private String classRoom;

    public Sdutent(String name, int age, String classRoom) {
        this.name = name;
        this.age = age;
        this.classRoom = classRoom;
    }

    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 String getClassRoom() {
        return classRoom;
    }

    public void setClassRoom(String classRoom) {
        this.classRoom = classRoom;
    }
}
    public static void main(String[] args) {
        Sdutent sdutent1 = new Sdutent("小明",10,"405");
        Sdutent sdutent2 = new Sdutent("小红",13,"405");
        Sdutent sdutent3 = new Sdutent("小李",9,"405");
    }

    代码中sdutent1,sdutent2,sdutent3,三个对象,每个对象都有自己的姓名,年龄,班级,但是当三个同学都属于同一个班级是的时候,每个学生对象中都含有一个相同的成员变量,那么在堆中就需要为每个对象的班级开辟空间,但是在三个对象空间中都有一个相同的内容,当学生对象的数量很多的时候,对于内存的利用率大大降低,不同的对象中都有一个的空间存储的内容都是相同的,那不就相当于用不同的空间存储相同的内容,内存的利用率从而下降。

    那么我们如何节省内存空间的使用呢?此时static的作用就显示出来了,我们可以把成员变量classRoom定义为静态变量,此时我们只需要将该变量直接定义为某个班级,当我们在实例化对象的时候就不需要再通过对象给班级赋予初始值,直接给其他的信息赋予初始值即可。

在这里插入图片描述

    此时对象的堆栈图:

在这里插入图片描述

    此时我们就通过将classRoom变量定义为静态变量从而节省了堆空间的消耗,提高了内存利用率。

三、static修饰成员变量

    static修饰的成员变量称之为静态成员变量,又称类变量,静态成员变量最大的特性就是:不属于任意一个对象,是所有对象共享的。

1、不属于任意对象的成语,是类的属性,是所有对象共享的,不存储在某个对象的空间内
2、既可以通过对象访问也可以通过类名访问,但一般建议通过类名访问
3、类变量存储在方法区当中,不存储在堆中
4、静态成员变量的生命周期伴随类的一生,当类被加载时,静态成员变量也被创建,类被销毁时,静态成员变量也被销毁

在这里插入图片描述

    对于静态成员变量来说,它本质上是属于类的,不属于对象,通过类名进行访问,但是通过对象进行访问也是可以的,但是并不合理,因为静态成员变量它是属于类的,而对象是通过类实例化创建的,从某个层次来说,静态成员变量和对象应该是同等级的,类是两者的上一等级,同等级之间应该是无法互相调用访问的,应该是通过上一等级调用访问下一等级,所以说通过对象进行调用访问是不合理的

四、static修饰成员方法

    既然成员变量可以被修饰为静态成员变量,那么成员方法也可以被修饰为静态成员方法。

    public static String getclssRoom1() {//静态成员方法
        return classRoom;
    }

    被static修饰的成员方法被称之为静态成员方法,是类的方法,不是某个对象所特有的,静态成员一般通过类名进行访问
    但是需要注意的有几点:

4.1、静态成员变量不可以在方法内创建

    在方法内创建的变量叫做局部变量,被static修饰的变量叫做静态成员变量。

第一:两者都生命周期不同,静态成员变量的生命周期和类的生命周期相同,局部变量的生命周期和方法的生命周期相同,当方法结束运行时在方法内定义的局部变量也会被JVM回收。

第二:两者的创建时间不同,静态成员变量随着类的加载而创建,局部变量随着方法的调用而开始创建,并且静态成员变量一般情况下在一个工程中只会创建一次,因为在一个工程中对象一般不会销毁,这也就意味着静态成员变量只会创建一次,而基本变量不同,一个方法在一个工程中有可能会只调用,也可能会调用多次,无论该方法调用多少次,只要该方法调用,基本变量就会创建,所以局部变量和静态成员变量两者的区别就在于:局部变量可以创建多次,但静态变量只会创建一次。

第三:两者都加载顺序不同,静态成员变量随着类的加载而创建,而局部变量需要通过对象的调用才可以创建,这也就意味着在没有实例化的情况下只要加载类,静态变量就会创建,即便在实例化对象的情况下,如果对象不调用方法,那么局部变量就不会创建。如果令对象等于null时:

        Sdutent sdutent = null;//对象等于null
        sdutent.getclssRoom2();//调用普通成员方法
        sdutent.getclssRoom1();//调用静态成员方法

    该代码表示引用sdutent不指向任何对象,此时通过该引用调用成员方法时,系统会报错,但是可以调用静态成员方法,因为静态成员不依赖于对象,并且静态成员随着类的加载而创建,不管引用是否正常指向对象,都不会影响到静态成员。即便对象没有实例化完成,只要类被加载了,都是可以同过类创建的引用去调用静态方法,所以类引用是否正常指向实例化对象,都不影响类引用调用静态方法

    所以在Java里面静态成员变量只能在类内创建,不能在方法内创建,在方法内创建的是局部变量,包括在静态方法内创建的也是局部变量,这也就意味着:静态成员变量只能在类内方法外创建。

4.2、静态成员方法内部不可以访问非静态成员变量

    非静态成员变量需要通过对象的引用才能够调用,在调用成员方法的时候,编译器会自动将对象的引用传递给方法,this进行接收,this相当于对象的引用,在方法内部会有隐藏的this进行实际访问成员变量

    但是静态成员是不依靠对象的,这也就意味着:在调用静态成员方法的时候,因为是直接通过类名调用的,编译器不会将对象引用传递给方法,那就没有办法通过引用访问成员变量。所以在静态成员方法中是没有办法访问非静态成员的,但是在非静态成员方法中是可以访问静态成员的。

在这里插入图片描述
在这里插入图片描述

    静态成员方法内不能访问非静态成员
    非静态成员方法内可以访问静态成员

4.3、总结

    总结:
1、静态成员方法不属于某个对象,是类方法
2、可以通过对象调用,也可以通过类名调用,但是更推荐通过类名调用
3、不能在静态方法中访问任何非静态成员变量
4、静态方法中不能调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时无法传递this参数

五、static成员变量的初始化

    静态成员变量一般不会通过构造方法进行初始化,构造方法中初始化的是与对象相关的实例属性
静态成员变量的初始化分为两种:就地初始化 和 静态代码块初始化

5.1、就地初始化

    就地初始化是指在定义该变量的时候直接赋予初始值

    private String name;
    private int age;
    public static String classRoom = "405班";

5.2、静态代码块初始化

六、代码块

    使用{ }包围起来的叫做代码块,根据代码块定义的位置以及关键字可分为以下几种:
1、普通代码块
2、构造代码块
3、静态代码块
4、同步代码块

6.1、普通代码块

    普通代码块:没有任何关键字修饰,直接使用{ }的代码块

public class MAin {
    public static void main(String[] args) {
        {
            int i = 0;
            String str = "不哈哈哈";
            System.out.println("xixi");
        }
    }

    和普通的方法一样,在{ }定义的变量属于局部变量,出了{ }内部的变量同样会被销毁。

6.2、构造代码块

    构造代码块:定义在类中的代码块,同样是没有任何关键字修饰,只有{ }包围的代码,构造代码块也被称之为实例代码块。
    与普通代码块不同的是,构造代码块是定义在类中的,并且一般用于初始化成员变量,普通代码块不一定是在类中定义的,只能说普通代码块里面包含有构造代码块。

在这里插入图片描述

    构造代码块实际上既可以初始化成员变量也可以初始化静态成员变量,但一般用于初始化成员变量,静态成员变量一般用静态代码块初始化。

    需要注意的是:构造代码块先执行,然后才会执行构造方法,构造代码块实际上可以理解为一种默认的初始化, 因为当我们使用了构造代码块的时候,构造代码块里面的成员变量就已经固定了,除非我们更改代码,否则在调用默认无参构造方法的情况下,每次实例化对象,对象的数据都是构造代码块的数据,此时我们想要定义不同数据的代码块时,就可以通过构造方法,在重载构造方法的情况下调用含参的构造方法,从而达到实例化不同数据的对象的目的。

在这里插入图片描述

    这也就意味着:构造方法的数据会将构造代码块的数据覆盖掉,但是Java默认提供的无参构造方法不会将构造代码块的数据覆盖。

6.3、静态代码块

    使用static修饰的{ },称之为静态代码块,一般用于初始化静态成员变量。

    private String name;
    private int age;
    public static String classRoom;

    static {
        classRoom = "405班";
    }

    静态代码块在整个工程中,只会调用一次,无论实例化多少个对象,静态代码块只会在第一次实例化对象的时候调用。

在这里插入图片描述

        如图,实例化4个对象,静态代码块只调用了一次
并且仔细观察可以发现,静态代码块优先执行与构造代码块

    因为有关于static的东西,比如静态成员变量,静态成员方法,静态代码块,都是随着类的加载而创建或者实行的,在类被加载的时候,静态成员变量被定义了,随后就是静态方法也被加载了,但是不会直接给静态方法开辟空间,只有当静态方法被调用的时候JVM才会为其开辟空间,随后就是执行静态代码块。和静态成员变量一样,不论是否实例化了对象还是仅通过类创建引用但没有指向对象,只要使用了类,类就会被加载,被加载的过程中有关于静态的都会被执行。

6.4、总结

1、静态代码块不管生成多少个对象,其都只会实行一次
    2、静态成员变量是类的属性,因此是在JVM加载类时开辟空间并初始化的
    3、如果一个类中包含有多个静态代码块或者构造代码块,在编译代码的时候,编译器会按照定义的顺序依次执行。
因为类中定义的静态代码块相当于同一等级到代码,没有执行的先后顺序,编译器就会按照定义的顺序依次执行,构造代码块也是如此。
    4、实例代码块只有在实例化对象时才会执行。 当通过类创建类类型的引用时,如果没有通过new关键字实例化对象,那么构造代码块一样不会执行
    5、先执行静态代码块,然后执行构造代码块,最后执行构造方法。

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

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

相关文章

Linux | Rsync 命令:16 个实际示例(下)

引言 Rsync(远程同步)是Linux/Unix系统中用于远程和本地复制及同步文件和目录的常用工具。 利用rsync命令,您可以轻松地在不同目录、硬盘和网络之间进行数据的远程和本地复制与同步,进行数据备份,以及在两台Linux系统间…

吃牛羊肉的季节来了,快来看看怎么陈列与销售!

一、肉品陈列基本原则 (一)新鲜卫生 1、保证商品在正确的温度、正确的方式下陈列 (1)正确的温度:冷藏柜-2℃-2℃;冷冻柜库-20℃-18℃ (2)正确的方式: 商品不遮挡冷气出风口&…

如何用 obdiag 排查 OceanBase数据库的卡合并问题——《OceanBase诊断系列》14

1. 背景 卡合并在OceanBase中是一个复杂的问题,其产生可能源于多种因素。目前,对于卡合并的明确界定尚不存在统一标准,一方面,我们界定超过36小时未完成合并为合并超时,此时RS会记录ERROR日志;另一方面&am…

图文详解ChatGPT-o1完成论文写作的全流程

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 本月中旬OpenAI发布了OpenAI o1系列新的AI模型。 据OpenAI介绍,这些模型旨在花更多时间思考后再做出反应,就像人一样。通过训练,它们学会改进思维过…

外包干了7天,技术明显退步。。。。。

先说一下自己的情况,本科生,22年通过校招进入南京某软件公司,干了接近2年的功能测试,今年年初,感觉自己不能够在这样下去了,长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了2年的功能测试&…

映射问题的解决办法(mybaitis)

最初我用的是注解来操控数据库&#xff08;注释掉的部分&#xff09; Mapper public interface ThreadMapper {// Select("SELECT * FROM thread LIMIT #{page}, #{size}")List<Thread> getListByPage(Param("page") int page, Param("size&qu…

ssm005基于SSM框架的购物商城系统的开发与实现(论文+源码)_kaic

设计题目&#xff1a;购物商城系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对…

[0152].第3节:IDEA中工程与模块

我的后端学习大纲 IDEA大纲 1、Project和Module的概念&#xff1a; 2、Module操作&#xff1a; 2.1.创建Module: 2.2.删除Module&#xff1a; 2.3.导入Module&#xff1a; 1.导入外来模块的代码&#xff1a; 查看Project Structure&#xff0c;选择import module&#xff1a…

部署DNS主从服务器

一。DNS主从服务器作用&#xff1a; DNS作为重要的互联网基础设施服务&#xff0c;保证DNS域名解析服务的正常运转至关重要&#xff0c;只有这样才能提供稳定、快速日不间断的域名查询服务 DNS 域名解析服务中&#xff0c;从服务器可以从主服务器上获取指定的区域数据文件&…

nfs实验2

#服务器共享目录/xiaoming供客户端上传和下载文件&#xff0c;并且客户端上传的文件所属用户为xiaoming用户&#xff0c;所属组为小明组 服务端&#xff1a; 启动nfs服务器服务&#xff1a; 创建一个新的用户组xiaoming&#xff1a; 搜索/etc/group 文件中所有包含字符串 &qu…

python爬虫实战案例——抓取B站视频,不同清晰度抓取,实现音视频合并,超详细!(内含完整代码)

文章目录 1、任务目标2、网页分析3、代码编写 1、任务目标 目标网站&#xff1a;B站视频&#xff08;https://www.bilibili.com/video/BV1se41117WP/?vd_sourcee8e376ccbc5aa4cfd88e6a7917adfd1a&#xff09;&#xff0c;用于本文测验 要求&#xff1a;抓取该网址下的视频&…

[四轴飞行器] 方向控制原理

四轴飞行器的基本工作原理 四轴飞行器基本原理是通过飞控控制四个电机旋转带动桨叶产生升力,分别控制每一个电机和桨叶产生不同升力从而控制飞行器的姿态和位置 四轴在空中可实现八种运动,分别是垂直上升,垂直下降,向前运动,向后运动,向左运动,向右运动,顺时针改变航向,逆时针…

量化交易打怪升级全攻略

上钟&#xff01; 继续分享量化干货~ 这次要唠的是Stat Arb的新作《Quant Roadmap》(中译名《量化交易路线图》)&#xff0c;为了方便&#xff0c;下文就称呼作者为“老S”&#xff0c;根据公开资料显示&#xff0c;他可是正儿八经的的量化研究员出身&#xff0c;在漂亮国头部对…

视觉化医学数据:使用气泡图揭示患者健康指标的关系

在医学领域&#xff0c;数据的可视化至关重要。它不仅帮助研究人员和医生理解复杂的关系&#xff0c;还能为临床决策提供有力支持。在众多可视化工具中&#xff0c;气泡图因其直观性和多维性而广受欢迎。本文将通过一个具体例子&#xff0c;展示如何使用气泡图来分析患者的体重…

钡铼技术R40工业无线路由支持边缘计算断网补传

随着工业互联网和智能制造的迅速发展&#xff0c;工业设备之间的互联互通变得愈加重要。在这个背景下&#xff0c;钡铼技术推出的R40工业无线路由器&#xff0c;凭借其先进的边缘计算能力和断网补传功能&#xff0c;为工业应用提供了强大的支持。 一、边缘计算的意义 边缘计算…

js实现简单计算机/验证密码是否合法

1.怎么实现一个计算机可以进行简单的加减乘除呢? 就像下面这样可以计算112... 在js中可以直接获取id的输入文本框对应的值 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" c…

基于SSM+微信小程序考试的管理系统(考试1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序考试的管理系统实现了管理员及用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;考试资料管理&#xff0c;用户交流管理&#xff0c;试卷管理&#xff…

一行代码,实现请假审批流程(Java版)

首先画一个流程图 测试流程图 activiti 项目基础配置 activiti 工作流引擎数据库设计 工作流引擎API 介绍 什么是BPMN流程图 工作流引擎同类对比 继续学习方向 总结 工作流审批功能是办公OA系统核心能力&#xff0c;如果让你设计一个工作流审批系统&#xff0c;你会吗…

C#入坑JAVA MyBatis入门 CURD 批量 联表分页查询

本文&#xff0c;分享 MyBatis 各种常用操作&#xff0c;不限于链表查询、分页查询等等。 1. 分页查询 在 下文的 的「3.4 selectPage」小节&#xff0c;我们使用 MyBatis Plus 实现了分页查询。除了这种方式&#xff0c;我们也可以使用 XML 实现分页查询。 这里&#xff0c…

c语言中自定义类型:结构体的声明和自引用

结构体回顾 结构是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量 例如&#xff1a; #include<stdio.h> struct Book {char book_name[20];char author[20];float price;char id[9]; }b4,b5,b6;//结构体变量 int main()…