黑马程序员技术交流社区

标题: final和static final [打印本页]

作者: 袁春龙    时间: 2011-7-19 11:00
标题: final和static final
请问我应该什么时候用static final,什么时候用final,什么时候用static也就是它们用途的区别?
[ 本帖最后由 袁春龙 于 2011-07-19  11:03 编辑 ]
作者: 匿名    时间: 2011-7-19 11:36
首先,static是静态的、全局的。被static修饰的任何东西,都是隶属于类的。简单的说就是可以通过类名来引用的。
先看看如下代码:[code=java]package org.cxy.test;

public class Demo {
        private static final int NUMBER;
        private final int number;
        static{
                NUMBER = 5;
        }
        {
                this.number = 6;
        }
        public static void main(String[] args){
                System.out.println("NUMBER = "+Demo.NUMBER);
                System.out.println("number = "+new Demo().number);
        }
}[/code]语句“private static final int NUMBER;”
|-  含义为:定义一个“类常量”,它的值不可以更改,同时可以通过[color=Red]类名[/color]来引用。
语句“private final int number;”
|-  含义为:定义一个“常量”,它的值不可以更改,同时可以通过[color=Red]对象名[/color]来引用。

但是,不论是“类常量”还是“实例常量”亦或是“局部(方法内的)常量”,在使用这个常量之前都必须为其初始化(这好像是废话)。
“类常量”初始化方法:
|-  定义的同时为其指定值。
|-  在static块中为其赋值。
“实例常量”初始化方法:
|-  定义的同时为其指定值。
|-  在实例块中为其赋值。
|-  在构造器中为其赋值。
“局部常量”初始化的方法:
|-  和局部变量一样,在使用之前,为其赋值即可。
|-  但是“类常量”和“实例常量”即使您的程序中没有使用到它,也必须为其初始化。

至此,答案很显然了,若您需要使用“静态”的方式定义常量,那么使用static final就是了。
作者: 匿名    时间: 2011-7-19 12:01
在java中利用关键字final声明常量,关键字final表示这个变量只能赋值一次,一旦赋值后,就不能再改变了。当一个变量希望被一个类中的多个方法使用,那么可以用ststic 修饰,定义为全局变量。而且在程序运行是只被加载一次。
作者: 匿名    时间: 2011-7-19 12:11
final可以用在类、方法、变量上。
     1、final用在类上,表明当前类它不能被继承,没有子类。
     2、final用在方法上,表明当前方法不能被override,不能被重写。
     3、final用在变量上,表明当前变量是一个终态的变量,是一个常量,这个变量的值一但被赋值后就不能被改变了。
     对于final(非static)类型的成员变量的初始化方式:
          1、声明变量时直接赋值
     2、在构造方法中完成赋值,如果一个类有多个构造方法,就要保证在每个构造方法中都要完成对该final类型变量的初始化工作。
     对于final static类型的成员变量的初始化方式:    必须在变量声明时直接赋值
     总之,对于final的成员变量,其值在初始化后是不可以再改变的:
     当其为原生类型时,这里的“不可变”指的是其值不可变;
     当其为引用类型时,这里的“不可变”指的是一经初始化就不能指向其它对象,引用不可变;即指向的存储地址不可修改,但指向的对象本身是可以修改的。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2