问题描述:
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 stub11 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 way16 */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 assigned49 public void setI(){50 i = 1.0;51 }*/52 53 public void setJ(){54 j = 1.0;55 }56 }
输出结果:
输出myClass1对象信息:i = 0.8121042271613893j = 0.7588637394635798k = 0.7289219433108298输出myClass2对象信息:i = 0.2939051021116923j = 0.7588637394635798k = 0.23782874599220116输出myClass1对象信息:i = 0.8121042271613893j = 1.0k = 0.7289219433108298输出myClass2对象信息:i = 0.2939051021116923j = 1.0k = 0.23782874599220116