当前位置: 首页 > 知识库问答 >
问题:

静态和final static分配

詹斌蔚
2023-03-14

我用的是同一种概念,我在第一节课上用过

但当我运行类Test2时,它给出了输出5。

我想知道初始化是什么时候发生的?我知道静态变量在编译时获得值。但是静态决赛呢?这个变量什么时候得到它的值?

public class Test1 {

    static int b=add();
    static int add()
    {
        return a;
    }
    static int a=5;

    public static void main(String[] args) {        
        System.out.println(b);
    }
}
//Gives output 0


public class Test2 {

    static int b=add();
    static int add()
    {
        return a;
    }
    final static int a=5;

    public static void main(String[] args) {    
        System.out.println(b);
    }
}

//gives output 5

共有3个答案

陆英毅
2023-03-14

只是为了补充其他答案:

在第一种情况下,如果a不是最终值,则在a之前分配b的值,这就是为什么得到0。分配顺序由语句序列决定。如果移动静态int a=5在b的赋值语句之前,您将得到5。

桓瀚
2023-03-14

原语和字符串类型的final static字段由java编译器专门处理:它们是编译时常数。它们的值只是内联到它使用的代码中。让我们看看生成的字节码。

Test1类:

static int add();
Code:
   0: getstatic     #17                 // Field a:I
   3: ireturn

所以它实际上加载了一个静态场。

Test2类:

static int add();
Code:
   0: iconst_5
   1: ireturn

在这里,它只推送预定义的常量值,甚至不引用常量字段。

冯嘉珍
2023-03-14

根据Java语言规范第12.4.2节,初始化类的过程如下:

  • 然后,初始化值为编译时常量表达式的接口的最终类变量和字段(§8.3.2.1,§9.3.1,§13.4.9,§15.28)

因此,最终变量将在静态变量之前初始化。您将获得输出。

 类似资料:
  • 在V9.0.0版本之前为下列对象分配内存采用动态的方式,在之后的版本才允许应用程序开发者自己静态的分配内存; 任务 软件定时器 队列 事件组 二值信号量 计数信号量 递归信号量 互斥量 当然,具体使用静态分配还是动态分配由开发者自己决定。 动态分配 动态分配的好处在于使用灵活简单、同时潜在的可以降低内存占用。 更少的函数参数 内存分配使用RTOS提供的API自动分配 应用程序开发者不需要自己去考虑

  • 本文向大家介绍layui实现动态和静态分页,包括了layui实现动态和静态分页的使用技巧和注意事项,需要的朋友参考一下 开发管理后台是每一个开发人员都要熟悉的一个环节,作为后端程序员,公司的所有机密数据都掌握在我们手上,所以这个时候,如果不是公司的核心成员,是不能接触到某些数据的,这个时候所有的工作都落到了我们的手上,从PS到Linux都需要我们亲历亲为,还好发现了layui这个前端框架,很大程度

  • 问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该

  • 我想澄清一下,在java中,静态字段是整个类使用的变量/字段,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它可以对对象1的静态字段具有不同的值?

  • 我们可以把一个方法赋值给类的函数本身,而不是赋给它的 "prototype"。这样的方法被称为 静态的(static)。 在一个类中,它们以 static 关键字开头,如下所示: class User { static staticMethod() { alert(this === User); } } User.staticMethod(); // true 这实际上跟直接将其

  • 问题内容: 这些对象调用之间有什么区别? 非静态: 静态的: 而且在内部为什么还要对函数使用static属性? 例: 问题答案: 静态函数,根据定义,不能也不依赖于该类的任何实例属性。也就是说,它们不需要类的实例来执行(因此,可以如您所显示的那样执行,而无需先创建实例)。从某种意义上讲,这意味着该函数不必(也永远不需要)依赖于类的成员或方法(公共或私有)。