JAVA总结之关键字static和final

问题描述:

  Java中有两个修饰符关键字static和final,用来修饰成员变量和方法。其中static表示静态的意思,被这个关键字修饰的方法和变量,则表示在Java虚拟机加载类的时候就加载了这个变量和方法,并且它与对象无关,它直属于类;其中final表示最终的意思,被这个关键字修饰的方法,则表示这个方法不能被重写,被这个关键字修饰的变量,则表示这个变量不能被改变。static和final的区别,当你懂得它们的含义,就知道它们的区别了,其实它们是两个不同的概念,哪有区别之分。为了更清晰的解释它们的含义,下面附上测试代码:

 1 package com.test;
 2 
 3 public class Test {
 4 
 5     /**
 6      * @param args
 7      * static和final关键字测试样例
 8      */
 9     public static void main(String[] args) {
10         // TODO Auto-generated method stub
11         MyClass myClass1 = new MyClass();
12         MyClass myClass2 = new MyClass();
13         /*
14          * 由于j被static关键字修饰,则表示变量j直属于类,不属于对象,所以这里变提示警告
15          * 警告:The static field MyClass.j should be accessed in a static way
16          */
17         System.out.println("输出myClass1对象信息:");
18         System.out.println("i = " + myClass1.i);
19         System.out.println("j = " + myClass1.j);
20         System.out.println("k = " + myClass1.k);
21         System.out.println("输出myClass2对象信息:");
22         System.out.println("i = " + myClass2.i);
23         System.out.println("j = " + myClass2.j);
24         System.out.println("k = " + myClass2.k);
25         myClass1.setJ();
26         /*
27          * 当我们改变myClass1对象的变量j的时候,myClass2对象的变量j也被改变
28          * 这更加体现了被static修饰的变量是直属于类的
29          */
30         System.out.println("输出myClass1对象信息:");
31         System.out.println("i = " + myClass1.i);
32         System.out.println("j = " + myClass1.j);
33         System.out.println("k = " + myClass1.k);
34         System.out.println("输出myClass2对象信息:");
35         System.out.println("i = " + myClass2.i);
36         System.out.println("j = " + myClass2.j);
37         System.out.println("k = " + myClass2.k);
38     }
39     
40 }
41 
42 class MyClass{    
43      public final double i = Math.random();
44      public static double j = Math.random();
45      public double k = Math.random();
46      
47      /*这里会报错,并提示去掉i变量的final修饰
48      The final field MyClass.i cannot be assigned
49      public void setI(){
50          i = 1.0;
51      }*/
52      
53      public void setJ(){
54          j = 1.0;
55      }
56 }

输出结果:

输出myClass1对象信息:
i = 0.8121042271613893
j = 0.7588637394635798
k = 0.7289219433108298
输出myClass2对象信息:
i = 0.2939051021116923
j = 0.7588637394635798
k = 0.23782874599220116
输出myClass1对象信息:
i = 0.8121042271613893
j = 1.0
k = 0.7289219433108298
输出myClass2对象信息:
i = 0.2939051021116923
j = 1.0
k = 0.23782874599220116
原文地址:https://www.cnblogs.com/atp-sir/p/6380756.html