static关键字

作者简介: zoro-1,目前大一,正在学习Java,数据结构等

作者主页: zoro-1的主页

欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

被static修饰意味什么

在Java中,被static修饰的成员,称之为静态成员,也可以称为类成员,其不属于某个具体的对

象,是所有对象所共享的。

static修饰成员变量

  1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中

  2. 既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问,本类中直接调用

  3. 类变量存储在方法区当中

  4. 生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)

static修饰成员方法

  1. 不属于某个具体的对象,是类方法

  2. 可以通过对象调用,也可以通过类名.静态方法名(...)方式调用,更推荐使用后者

  3. 不能在静态方法中访问任何非静态成员变量和非静态方法(没有this参数,除非在方法中实例化对象,才被调用)

代码块调用顺序

Java代码块的执行顺序如下:

  1. 静态代码块:当类被加载时,静态代码块会被执行,且只会被执行一次。

  2. 实例代码块:每次创建类的实例时,实例代码块都会被执行,并且在构造方法之前执行。

  3. 构造方法:在实例代码块执行之后,构造方法会被执行。

  4. 普通代码块:在方法中定义的普通代码块会在方法调用时被执行。

代码例子

java 复制代码
class Parent {
    static { // 父类静态代码块
        System.out.println("父类静态代码块");
    }

    {       // 父类初始化块
        System.out.println("父类初始化块");
    }

    public Parent() { // 父类构造方法
        System.out.println("父类构造方法");
    }
}

class Child extends Parent {
    static { // 子类静态代码块
        System.out.println("子类静态代码块");
    }

    {       // 子类初始化块
        System.out.println("子类初始化块");
    }

    public Child() { // 子类构造方法
        System.out.println("子类构造方法");
    }
}

public class Test {
    public static void main(String[] args) {
        Child child = new Child();
    }
}

输出结果为:

复制代码
父类静态代码块
子类静态代码块
父类初始化块
父类构造方法
子类初始化块
子类构造方法

从输出结果可以看出,首先执行父类的静态代码块(因为父类在子类之前加载),然后执行子类的静态代码块,接着执行父类的初始化块和构造方法,最后执行子类的初始化块和构造方法。

小思考

为什么普通成员方法可以直接访问非静态变量,而静态方法不能直接访问非静态变量?

  1. 静态方法和静态变量在类初始化时已经分配内存,已经存在,因此随时可以调用。
  2. 非静态方法和非静态变量在类初始化时不存在,只有类实例化成对象时才分配内存而存在

今天的分享到这里就结束了,感谢大家支持,创作不易,希望大家能给博主个三连,

相关推荐
小小龙学IT3 分钟前
Python SQLAlchemy 2.0 深度解析:从 Core 到 ORM 的数据访问双引擎
开发语言·数据库·python
2601_962885725 分钟前
如何用 Python 计算 ROC 变动率指标做动量分析?
开发语言·python·算法
DongQiShanRen26 分钟前
裁决台账双向互校(上):名册与实物的第一道对账
java·linux·运维·数据库·人工智能·自然语言处理·数据挖掘
潼心1412o32 分钟前
C++初阶(长期更新)第9讲:string(上)
开发语言·c++
朝朝辞暮i44 分钟前
C++ 第 39 章: 阶段性总复习——类、对象、构造、继承、this、指针与智能指针
开发语言·c++·算法·ros2
cpolar技术支持1 小时前
Spring Boot 接口本地正常,异地前端却报跨域?用 cpolar 跑通 CORS 预检与白名单
java·springboot·cpolar·前后端分离·cors
wuminyu1 小时前
Virtual Thread重投递至ForkJoinPool任务队列过程解析
java·linux·c语言·jvm·c++
小蒜学长1 小时前
在线保险服务与管理平台的设计与实现(代码+数据库+LW)
java·数据库·spring boot·后端·服务平台·在线保险
掉进电商坑三年没爬出来的东叔1 小时前
青龙面板进阶:一个面板聚合多平台签到,所有积分自动领
java·开发语言
iCxhust1 小时前
51单片机电力载波应用开发(七)广播通讯
c语言·开发语言·单片机·嵌入式硬件·51单片机