什么是static?什么是final?

由static修饰的变量、常量、和方法被称为是静态变量、常量和 方法。

静态数据和静态方法的作用通常是为了提供共享数据或方法,如数学计算公式等,以static声明并且实现,这样当需要使用时,直接使用类名调用这些静态成员即可。例如,两个类在同一个内存区域共享一个数据,在球类使用PI这个常量,另外的圆类也需要使用这个常量,这时没有必要在两个类中同时创建PI常量,这样系统会将这两个不在同一个类中定义的常量分配到不同的内存空间中,这是声明静态成员就好,静态成员归类所有,区别于个别对象,可以在本类和其他类使用"类名.静态名"调用静态成员。尽管使用这种方式调用静态成员比较方便,但静态成员同样遵循着public、private、protected的约束

 1 public class Stat {
 2     static double PI=3.1415926;
 3     static int id;
 4     public static void method1(){
 5         System.out.println("hello,method1.");
 6     }
 7     public void method2(){
 8         System.out.println(PI);
 9         System.out.println(id);
10         method1();
11     }
12 }

主类

 1 public class Main {
 2 
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         Stat st=new Stat();
 9         st.method2();
10     }
11 
12 }

结果

3.1415926
0
hello,method1.

  static是自动初始化滴,为0.

在java语言中对static有一些规定:

1.在静态方法中不可以使用this关键字;

2.在静态方法中不可以直接调用非静态方法;

3.规定不得能将方法体内的局部变量声明为static;

4.可以用static定义一个静态区域,可以先执行类的初始化动作……具体问题具体分析,说这几句只是表面……

final关键字可以用于变量声明,一旦变量被设定,就不可以再改变变量的值,通常,由final定义的变量为常量。

final关键字定义的变量声明时必须立即赋值,除了可以修饰基本数据类型的常量,还可以修饰对象引用。由于数组可以被看成一个对象来引用,所以final可以修饰数组。

一旦一个对象引用被修饰为final后,它只能恒定的指向一个对象,无法将其改变指向另一个对象。

一个既是static又是final的字段只占据一段不能改变的存储空间。

1 import java.util.Random;
2 public class Fina {
3     public static Random rand=new Random();
4     public final int a1=rand.nextInt(10);
5     public static final int a2=rand.nextInt(10);
6     
7 }

主类

 1 public class Main {
 2 
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         // TODO Auto-generated method stub
 8         Fina fi=new Fina();
 9         System.out.println(fi.a1);
10         System.out.println(fi.a2);
11         Fina fii=new Fina();
12         System.out.println(fii.a1);
13         System.out.println(fii.a2);
14     }
15 
16 }

结果

4
5
2
5

  定义为final的常量是恒定不变的,将随机数赋予定义为final的常量,可以做到每次运行程序时改变a1的值,但是a2不同于a1,由于它被声明为static final形式,所以在内存中为a2开辟了一个恒定不变的区域,当再次实例化一个对象时,仍然指向a2这块内存区域,所以a2保持不变。a2只是装载时初始化,而不是每次创建对象时都被初始化,而a1会在重新实例化对象时被更改。

贵有恒何必三更眠五更起,最无益只怕一日曝十日寒。
原文地址:https://www.cnblogs.com/carazk/p/5859233.html