static的详解与代码的执行顺序

本文详细介绍了Java中的static修饰符,包括它可以修饰的方法和全局变量,以及其作用。static方法不能被子类覆盖,静态变量由所有对象共享。在内存中,static变量存储在方法区的静态域。类加载时,静态域先于main方法执行,静态代码块只执行一次。文章还通过示例解析了代码执行顺序,展示了静态域、main方法、构造代码块和构造方法的执行逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

static修饰符是笔试考察重点,奈何我没认真学,栽了很多跟头后,做个笔记记下了。
在学习之前得知道它在内存中是怎么实现的
前置知识:什么是压栈,压栈就是入栈和出栈的统称,将方法的局部变量等数据放入栈中,称为入栈出栈则是数据被清出栈。
在这里插入图片描述

static可修饰谁?

  1. 修饰方法
  2. 修饰全局变量
    :只能修饰全局变量,不管方法是否被static修饰,都不能修饰方法中的局部变量在这里插入图片描述

static的作用

  1. 修饰方法
    调用:方法类级别的,可以通过通过”类名“.方法名调用,也可以通过对象调用,普通的变量都是只能通过对象调用。
    特点:static方法不能被子类覆写,在子类中定义了和父类完全相同的static方法,不会报错,不会覆写。可以隐藏父类的static方法的写法,是通过Son类名调用静态方法或者Son类型的对象调用,Son.staticmethod()或new Son().staticmethod()都是调用的子类的static方法,如果是Father.staticmethod()或者Father f = new Son(); f.staticmethod()调用的都是父类的static方法。

  2. 修饰全局变量
    调用:变量同方法的调用一样。
    特点:所有的对象,都共享一个static修饰的变量

当变量是静态变量的时候,内存是怎样的?
chinese类中,定义三个变量,idCard变量、name变量,一个静态变量country。
在这里插入图片描述
所有的中国人,都只有一个国籍“中国”。每个中国人对象都共享这个属性。
被static修饰的结构储存在哪里呢?
staitc修饰结构,储存在方法区中,被称为静态域。
代码的执行顺序
当执行main方法时,会先加载静态域,静态域加载完后再执行main方法。

static可以用类名调用,也可以使用对象调用,这里有个注意点。
可以空引用访问静态结构而不会报空指针异常。
因为对象调用程序实际也是看成类名调用
在这里插入图片描述
这里没有没有声明为static是报错。
在这里插入图片描述

静态代码块

1. static静态代码块在什么时候执行呢?
类加载时执行,并且只执行一次.
2. 静态代码块有这样的特征/特点.
注意:静态代码块在类加载时执行,并且在main方法被执行前执行完成.
(不管main方法后面都有一个静态代码块,都会载main方法前执行)
静态态代码块一般是按照自上而下的顺序执行.
3. 静态代码块有啥作用,有什么用?

  • 静态代码决不是那么常用.(不是每一个类当中都要写的东西.)
  • 静态代码块这种语法机制实际上是SUN公司给我们java程厅员的一个特殊的时刻,这个时机叫做:类加载时机.
    具体的业务:记录日志

代码的执行顺序

静态代码块在类加载时执行,执行一次。
实列代码块在创建对象时执行,可执行多次。
静态成员变量或静态代码块>main方法>非静态成员变量或非静态代码块>构造方法
:都是静态结构时,遵循自上而下原则。

代码执行顺序的经典题

public class Test
{
    public static Test t1 = new Test();
    {
         System.out.println("blockA");
    }
    static
    {
        System.out.println("blockB");
    }
    public static void main(String[] args)
    {
        Test t2 = new Test();
    }
 }

分析结果:
静态域:用staitc声明,jvm加载类时执行,仅执行一次
构造代码块:类中直接用{}定义,每一次创建对象时执行。
执行顺序优先级:静态域,main(),构造代码块,构造方法。

  1. 静态域 :首先执行,第一个静态域是一个静态变量 public static Test t1 = new Test(); 创建了Test 对象,会执行构造块代码,所以输出blockA。然后执行第二个静态域(即静态代码块)输出blockB。
  2. main():Test t2 = new Test()执行,创建Test类对象,只会执行构造代码块(创建对象时执行),输出blockA。
  3. 构造代码块只会在创建对象时执行,没创建任何对象了,所以没输出
  4. 构造函数:使用默认构造函数,没任何输出
    所以结果为ABA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值