final 修饰的变量 对存储方式有何影响?望高手回答!

importjava.util.Date;/***一下两种声明方式对常量的存储方式有何影响?**/publicclassTest{//直接声明常量,并为其赋值public... import java.util.Date;
/**
* 一下两种声明方式对 常量 的存储方式有何影响?
*
*/
public class Test {

//直接声明常量,并为其赋值
public static final int a=5 ;

public static final Date b = new Date() ;

//声明常量,在静态初始化块中为其赋值
public static final int a1;

public static final Date b1;

static{

a1=5 ;

b1=new Date();

}

/**
* 下面两种常量的声明方式,对常量的存储位置有何影响?
*/

//直接声明常量,并为其赋值
public final int c=5 ;

public static final Date d= new Date() ;

//声明常量,在静态初始化块中为其赋值
public final int c1;

public final Date d1;

{

c1=5 ;

d1=new Date();

}

}
展开
 我来答
amuro521
推荐于2017-11-25 · TA获得超过215个赞
知道答主
回答量:38
采纳率:100%
帮助的人:30.7万
展开全部
首先有一点你要明白,final关键字对于变量的存储区域是没有任何影响的。jvm规范中,类的静态变量存储在方法区,实例变量存储在堆区。也就是说static关键字才对变量的存储区域造成影响。
final关键字来修饰变量表明了该变量一旦赋值就无法更改。同时编译器必须保证该变量在使用前被初始化赋值。
例如你的static final int c1这个变量,是一个静态变量,静态变量的初始化可以在静态块中进行。而非static变量,可以初始化块中和构造方法中进行。
如果你在这几个地方没有对final变量进行赋值,编译器便会报错。
更多追问追答
追问

//直接声明常量,并为其赋值

    public static final  int a=5 ;

   

      //直接声明常量,并为其赋值

        public  final  int c=5 ;

       

 根据 百度百科 “常量池” 的介绍,通过上面的两种方式 声明常量,该常量会放入常量池中,

 

 那么 public final int c 还会放入堆内存吗?

 

 public static final int a  还会和普通 静态变量一样 放入方法区吗?

追答
public final int c=5 ;这段代码里,c和5不要弄混淆了,c是这个类的一个实例变量,类会在实例化的时候将这个变量存储在堆区,无论是否有final关键字,它都是在堆区。但是5,是一个字面量,它会存放在常量池,无论你是否加上final关键字,5都会在常量池。这段代码你可以理解为,从常量池中取出5,赋给a。
就好比假设在一个方法中
public void test(){
String s1 = "abc";
String s2 = "abc";
}
很明显,上面的s1==s2是成立的,因为他们都指向了常量池中的abc。但是s1和s2是分配在常量池里的吗?当然不是,他们是分配在方法栈的局部变量表中的两个不同变量,只是指向了一个地址而已。
百度网友9c743b7
2012-08-02 · TA获得超过925个赞
知道小有建树答主
回答量:360
采纳率:100%
帮助的人:313万
展开全部
区别就在于是不是static的变量
前一种是类变量,不需要实例就可以访问的
第二种静态初始化块的是在类第一次访问时运行,且只在第一次访问时运行,应该说没什么区别
后一种是成员变量,需要建立实例,在每次实例的时候运行
还有你注释写错了,最后面的是普通的初始化块不是静态的
静态初始化块在构造方法运行前运行
普通的初始化块在super()方法调用后运行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式