static与final变量

变量

一、illegal forward refrence

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

punlic final class Constants{

  public static int VAR2 = VAR1 + 1;

  public static int VAR1 = 1;

}

编译时出错(第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块。

时间: 2024-08-03 03:59:52

static与final变量的相关文章

php中$this、static、final、const、self的用法

  本篇文章主要分项了一下关于php类中的$this,static,final,const,self这几个关键字使用方法. $this $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式.常见用法如: $this->属性 $this->方法 举例如下:  代码如下   <?php class MyClass{  private $name;  public  function __cons

java 小结1:static ,final及泛型

static,final. (1)final: final:属于"终态",意思就是不可以改变.可以修饰非抽象类,非抽象类的方法等.反正就是不能够再改变赋值了. 注意:1)fina类不能被继承,所以它没有子类. 2)final不能用于修饰构造方法. 3)final方法可以继承,但是不能够被覆盖 4)final一旦赋值,便不能更改 5)final容器,比如list,容器不能够改变,但是容器里面的内容是可以变化的. (2)static: static:表示"静态",&qu

java中final 变量作为方法的参数?怎么理解?见下面代码

问题描述 java中final 变量作为方法的参数?怎么理解?见下面代码 class NiMingLei { public static void main(String[] args) { Outer out= new Outer(); out.function(7); out.function(8); } } class Outer { static int y=4; void function(final int a) { class Inter { void method() { Sys

java 中的 final 变量

http://wenjiesu.iteye.com/blog/799332 [java中为什么会有final变量]:     final这个关键字的含义是"这是无法改变的"或者"终态的":     那么为什么要阻止改变呢?     java语言的发明者可能由于两个目的而阻止改变:     1).效率问题:         jdk中的某些类的某些方法,是不允许被用户覆盖的,设计者可能认为,所用方法已经是最好的方法,         用户私自覆盖,或是由于疏忽而覆盖,就

深入理解final变量的初始化_java

final变量的初始化位置 一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中.而且在Java1.1以前,只能是在定义时给值.三是在初如化代码块中{} 或者 static{} 复制代码 代码如下: public class InitOrder {    {        System.out.println("before---field");        //System.out.println("d1="+d1);        d1

php类中的$this,static,final,const,self这几个关键字使用方法_php实例

本篇文章主要分项了一下关于php类中的$this,static,final,const,self这几个关键字使用方法. $this $this表示当前实例,在类的内部方法访问未声明为const及static的属性时,使用$this->value='phpernote';的形式.常见用法如: $this->属性 $this->方法 举例如下: <?php class MyClass{ private $name; public function __construct($name){

Java中final变量使用总结_java

final关键字可用于变量声明,一旦该变量被设定,就不可以再改变该变量的值. 通常final定义的变量为常量.如: 复制代码 代码如下: final double PI = 3.14;  当在程序中使用PI这个常量时,它的值就是3.14,如在程序中再次对定义为final的常量赋值,编译器将不能接受: final关键字定义的变量必须在声明时对其进行赋值操作.final除了可以修饰基本数据类型的常量,还可以修饰对象引用.由于数组也可以被用作一个对象引用,所以final可以修饰数组.一旦一个对象引用被

static修饰成员变量的唯一性

问题描述 static修饰成员变量的唯一性 关于static修饰的静态变量的唯一性 ,为什么不同对象多次访问TA输出的是一次,如题所示 解决方案 sstatic表示"全局"或者"静态"的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何对象.也就是说,它不依赖类特定的实例,被类的所有实例共享.只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法

Why it is good practice to declare loggers private, static, and final?

// Jakarta Commons Loggingprivate static final Log log = LogFactory.getLog(MyClass.class);The above code also shows another good practice, which is to pass the Class object to the getLog() method, instead of a string. Why the java.util.logging.Logger