Java中final与 static final 修饰的常量的区别

喵喵开车,新手上路,多多关照。有任何错误请在评论区指出。

...........................................我是万恶的分界线( ? ?ω?? )?.........................................

final:用来修饰类,变量,方法:

final修饰的类不能有子类,也不能被继承。

final修饰的变量是一个常量,不能重新赋值。

final修饰的方法不能重写

现在就说明final修饰的常量① 与 static final 修饰的常量② 的区别。

例如:

① final long CURRENT_TIME=system.currentMillis();

② static final long CURRENT_TIME=system.currentMillis();

不使用static修饰:

如果建立常量时直接赋一个固定值,那么这个常量的值是固定不变的,即多个对象中的值也是相同的。如果建立常量时是采用函数或对象,那么每次建立对象时给其常量的初始化值就有可能不同。所以,只使用final的Java常量定义并不是恒定的。

使用static修饰:

在创建对象之前就会为这个变量在内存中创建一个存储空间,以后创建对象如果需要用到这个静态变量,那么就会共享这一个变量的存储空间。

不太明白的话,下面是代码示例(转载自http://advance0683.iteye.com/blog/1107732)

 1 import java.util.Random;
 2
 3 //这个例子想说明一下static final 与 final的区别
 4 public class StaticAndFinalTest {
 5
 6     private static Random rand = new Random(47); //47作为随机种子,为的就是产生随机数。
 7
 8     private final int a = rand.nextInt(20);
 9
10     private static final int B = rand.nextInt(20);
11
12     public static void main(String[] args) {
13         StaticAndFinalTest sf = new StaticAndFinalTest();
14         System.out.println("sf : " + "a=" + sf.a);
15         System.out.println("sf : " + "B=" + sf.B);
16         System.out.println("------------------------------");
17         StaticAndFinalTest sf1 = new StaticAndFinalTest();
18         System.out.println("sf1 : " + "a=" + sf1.a);
19         System.out.println("sf1 : " + "B=" + sf1.B);
20     }
21
22 }

下面是代码结果:

sf : a=15

sf : B=18

--------

sf1 : a=13

sf1 : B=18

可以看到,在sf和sf1对象中,a的值不是唯一的,但B的值是不会通过创建sf1对象而改变。

这与上文所述是一致的。

( ? ?ω?? )?

原文地址:https://www.cnblogs.com/dingruihfut/p/9096226.html

时间: 2024-11-09 05:03:04

Java中final与 static final 修饰的常量的区别的相关文章

在JAVA中利用public static final的组合方式对常量进行标识

在JAVA中利用public static final的组合方式对常量进行标识(固定格式). 对于在构造方法中利用final进行赋值的时候,此时在构造之前系统设置的默认值相对于构造方法失效. 常量(这里的常量指的是实例常量:即成员变量)赋值: ①在初始化的时候通过显式声明赋值.Final int x=3: ②在构造的时候赋值. 局部变量可以随时赋值. 1 package TomText; 2 //利用if语句,判断某一年是否是闰年. 3 public class TomText_28 { 4 p

java中static、final、static final的区别

final可以修饰:属性,方法,类,局部变量(方法中的变量) final修饰的属性的初始化可以在编译期,也可以在运行期,初始化后不能被改变. final修饰的属性跟具体对象有关,在运行期初始化的final属性,不同对象可以有不同的值. final修饰的属性表明是一个常数(创建后不能被修改). final修饰的方法表示该方法在子类中不能被重写,final修饰的类表示该类不能被继承. 对于基本类型数据,final会将值变为一个常数(创建后不能被修改):但是对于对象句柄(亦可称作引用或者指针),fin

java中的关键字static(静态变量)和final定义常量

1 package point; 2 3 class Point { 4 5 int x = 0; 6 int y = 0; 7 static int z = 100; // 定义静态变量z,类变量 8 static final double PI = 3.1415926;// final定义常量,它的值在运行时不能被改变 9 10 Point(int a, int b) { 11 //PI=3.1415926; 12 /* 13 * 当使用静态常量的时候,不能在构造函数中初始化, 因为静态时,

hadoop 关于java中的public static 变量是不能被改变的?

我在写hadoop的时候,在mapper里定义了一个public static int rownums = 0.但我在main里对这个变量进行了赋值. 结果在循环的过程中,根本没有任何输出,因为我是用这个变量来控制循环的,所以我猜想可能是不能改变这个值,于是我直接在初始定义的时候直接赋上正确的值,所以这样最后程序就正确运行了. 但是我又新建了一个工程写了一个小程序,试了一下,明明是能够改变,正确输出的. 不能理解了. hadoop 关于java中的public static 变量是不能被改变的?

Java中this和static关键字及代码块

this: 可以使用this表示类中的属性------this.name=name 可以使用this强调调用的是本类的方法 可以使用this调用本类的构造方法------this();调用本类中无参构造方法 可以使用this表示当前对象(调用方法的对象)----最重要的用途 static: 声明属性---------属性则为全局变量 声明方法---------Person.setName("Tom");使用类名称调用static方法 普通代码块:直接在方法或是语句中定义的代码块 pub

Java中为什么有abstract interface 修饰类?

如果有人问你为什么有abstract interface 修饰类,答案一定是他看到的这种方式一定是反编译出来的结果.实际中abstract interface和interface修饰的类没有区别. 下面就上面的问题,介绍下抽象接口的概念. 在程序设计过程中,读者很可能遇到这样一种困境:设计了一个接口,但实现这个接口的子类并不需要实现接口中的全部方法,也就是说,接口中的方法过多,对于某些子类是多余的,我们不得不浪费的写上一个空的实现. 今天小菜提到的“抽象接口”,就是用来解决这个问题的. 为了不误

java中的URLEncoder和URLDecoder类的联系与区别

今天碰到了这个问题,就查找了些资料总结下:java中的URLEncoder和URLDecoder类的联系与区别. 首先说这两者的联系与区别: URLEncoder是编码,URLDecoder是解码.两者的转换过程刚好是相反的.URLEncoder该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法:URLDecoder该类包含了将 String 从 application/x-www-form-urlencoded MI

<Java中的继承和组合之间的联系和区别>

1 //Java中的继承和组合之间的联系和区别 2 //本例是继承 3 4 class Animal 5 { 6 private void beat() 7 { 8 System.out.println("心胀跳动..."); 9 } 10 public void breath() 11 { 12 beat(); 13 System.out.println("吸一口气,吐一口气,呼吸中..."); 14 } 15 } 16 //继承Animal,直接复用父类的bre

Java中static,final和static final的区别

package com.victor.test; import java.util.Random; public class StaticAndFinalTest { private static Random rand = new Random(47); private static int staticA = rand.nextInt(100); private final int finalB = rand.nextInt(100); private static final int st