`
阅读更多

一、illegal forward refrence

前天写一个类时遇到一个很眼生的编译错误(问题简化后):

1punlic final class Constants{
2  public static int VAR2 = VAR1 + 1;
3  public static int VAR1 = 1;
4}

编译时出错(第2行):

illegal forward refrence

仔细一想,是因为VAR2引用的VAR1在VAR2之后定义,看来在Java中定义static变量时应遵循“声明先于使用”的原则。

 

二、static块

还是上一个类,VAR1和VAR2定义成final,值存在一个properties文件中,在使用前必须将值load进来:

System.getProperties().load(new FileInputStream("constants.properties"));

于是将上面的代码放在static块中:

punlic final class Constants{
  
static{
    System.getProperties().load(
new FileInputStream("constants.properties"));
  }


  
public static final int VAR2 = System.getProperties().getProperty("var2");

  
public static final int VAR1 = System.getProperties().getProperty("var1");
}


但在运行时VAR1和VAR2没有被赋值,debug后发现static块根本没有执行。于是顿悟:final变量在编译时便被编译器计算、赋值,因此在运行时没有必要执行static块。

分享到:
评论

相关推荐

    static与final的异同

    在Java编程语言中,`static`和`final`都是关键字,它们用于定义不同的特性,但同时也有一些相似之处。下面我们将详细探讨这两个关键字的区别和用法。 首先,`static`关键字是用来声明类级别的变量或方法,这意味着...

    java final变量详解

    final 变量的变与不变是一个重要的问题。有人说 final 变量在赋值后就不可变,但这个不变到底指的是什么呢?这个不变指的是引用,是地址,而所引用的对象的内容仍然是可变的。就是说,这个 final 变量的引用是不能...

    final和static用法详解JAVA

    Java 中的 final 和 static 关键字详解 final 关键字是 Java 中的一种访问...final 和 static 关键字是 Java 中两个重要的访问修饰符,它们可以帮助开发者更好地设计和实现类、方法和变量,提高程序的效率和可维护性。

    static、this、super、final的JAVA用法

    静态变量与静态方法类似,使用 static 关键字来修饰,例如 static int c = 0;。 class Value{ static int c = 0; static void inc(){ c++; } } class Count{ public static void prt(String s){ System.out....

    java中final与static的用法

    在Java编程语言中,`final`与`static`是两个非常关键且常用的关键字,它们各自具有独特的功能和用途,可以极大地增强代码的稳定性和可维护性。下面将详细解析这两个关键字的用法及其在Java中的重要性。 ### 一、`...

    static、final、abstract和interface使用总结

    - **final变量**:一旦赋值后,final变量的值就不能改变。它可以是基本类型或引用类型,但引用类型变量指向的对象的属性仍可修改。 - **final方法**:一旦声明为final,方法就不能被子类重写。这确保了方法的行为...

    static and final.

    当 `static` 和 `final` 一起使用时,表示创建了一个全局常量,这类变量在定义时必须赋予初始值,并且在整个程序运行过程中其值不能改变。这种做法常见于定义配置参数等不会改变的值,例如: ```java public class ...

    Java关键字final、static使用总结

    在 Java 编程语言中,final 和 static 是两个非常重要的关键字,它们可以用来修饰类、方法、变量等,了解它们的使用方法和限制非常重要。本文将详细总结 final 和 static 的使用方法和限制。 一、final 关键字 ...

    Static和Final修饰类属性变量及初始化

    1.static修饰一个属性字段,那么这个属性字段将成为类本身的资源,public修饰为共有的,可以在类的外部通过test.a来访问此属性;在类内部任何地方可以使用.如果被修饰为private私有,那么只能在类内部使用.

    final关键字和static_用法

    // 编译错误, final变量的值一旦给定就无法改变 // t.D = 71; // 编译错误, final变量的值一旦给定就无法改变 System.out.println(t.A); System.out.println(t.B); System.out.println(t.C); // 不推荐用对象...

    JavaSE024static与final使用陷阱续..pdf

    总结一下,`final`关键字用于创建不可修改的变量,确保数据的不变性,而`static`关键字用于创建类级别的变量和方法,这些变量和方法与类的实例无关,而是与类本身关联。理解并恰当使用这两个关键字是编写健壮、可...

    java中final和static的区别

    Java 中 final 和 static 的区别 final 关键字在 Java 中有多种用法,包括修饰变量、方法、类等。...final 关键字用于表示不可变的变量、方法、类等,而 static 关键字用于表示静态的成员变量、方法、代码块等。

    java中final关键字和static关键字详细用法

    `final`变量可以是类级别的(静态`static`)或实例级别的。静态`final`变量通常作为类级别的常量使用,例如常量PI、E等,它们在所有类实例间共享同一值。实例级别的`final`变量则属于每个对象实例,它们的值在对象...

    详解static 和 final 和 static final区别

    1. 修饰变量:如果 Static 修饰的是变量,则 JVM 会将其分配在内存堆上,该变量就与对象无关,所有对该变量的引用都指向同一个地址。因此,我们使用该变量的时候,直接指明类的静态变量,当然修饰符必须是 public。 ...

    Java编程中static和final关键字的陷阱.pdf

    Java编程中static和final关键字的陷阱.pdf Java编程中static和final关键字的陷阱是Java开发中两个重要的关键字,但是它们的使用也存在一些陷阱,需要开发者注意掌握。 static关键字可以用于修饰属性、方法和类。...

    Java中static、this、super、final用法简谈

    Java中的`static`、`this`、`super`和`final`是四个非常重要的关键字,它们在编程中扮演着至关重要的角色。这篇文章将简要介绍这些关键字的基本用法及其应用场景。 1. **static** `static`关键字用于声明类级别的...

    javafinal和static总结.docx

    final 变量是值一旦给定就无法改变的变量,final 变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。 例如: `private final String S = "final 实例变量 S";` final 变量定义的时候,可以先...

    java中final和static的总结

    在设计类和接口时,明智地使用`final`和`static`可以帮助实现更好的设计模式,例如单例模式(`static`与私有构造函数结合)和不可变对象(`final`类和属性)。在日常编程中,应根据需求合理选择和应用这两个关键字。

    final变量.

    8. **`final`变量的变与不变**: `final`变量的不变性指的是其引用的地址不可变,但所引用的对象内容(如果对象是可变的,如`ArrayList`等)是可以改变的。这意味着你可以改变对象的状态,但不能改变`final`变量...

    static spuer final

    下面将详细解释`static`关键字的使用以及与之相关的`super`和`final`关键字。 1. **静态方法(static methods)**: - 静态方法是与类相关联而不是与类的实例关联的方法。在示例中,`public static void main...

Global site tag (gtag.js) - Google Analytics