static关键字的用法

  static的意思是“’静态的”,在java里面可用于修饰属性和方法。

  static关键字的应用应注意以下几种情形:  

    1.static作用于某个字段,一个static字段对每个类来说只有一份存储空间,而非static字段是每个对象有一份存储空间。

    2.static作用于方法的重要用法是不需要创建任何对象直接调用该static方法,这对于main()方法很重要。

    3.static不能应用于局部变量。

    4.Java中禁止使用全局方法,所以引入static方法通过类本身来直接调用。

  1. package cn.wangze.test;
  2.  
  3. class Demo{
  4. public static int i = 19;
  5. }
  6.  
  7. public class staticDemo {
  8. private static Demo demo1 = new Demo();
  9. private static Demo demo2 = new Demo();
  10. public static void main(String[] args){
  11. System.out.println(Demo.i); //
  12. System.out.println(demo1.i); //
  13. System.out.println(demo2.i); //
  14. demo1.i++;
  15. System.out.println(Demo.i); //
  16. System.out.println(demo1.i); //
  17. System.out.println(demo2.i); //
  18. Demo.i++;
  19. System.out.println(Demo.i); //
  20. System.out.println(demo1.i); //
  21. System.out.println(demo2.i); //
  22. }
  23. }

  上面程序的输出结果验证了上面两条,带有static关键字的数据在内存中占有一块固定内存地址,你可以用类名直接调用,也可以创建对象来调用,推荐ClassName.method()来调用。当我们改变它的值,任何地方的调用也会随之改变。

  Java系统自带的Math、UUID、Class等常用的工具类就是用的这种方式。

  1.  为什么要将方法和变量都写成静态的。
     因为,这些方法我只是想调用一下,不需要牵扯工具类中的任何属性和变量,所以,我就没有必要实例化了(new)。既然不需要实例化了,那么就用静态就行了。

  你也可以在实际项目中根据业务需求来声明自己的工具类,只需要加入static关键字,引入该类后使用类名.方法名()调用即可。

  需要注意的一点是,类的加载和初始化过程中,带有static的数据会最先加载并调用,其次是构造器的加载,最后才是普通成员变量和方法的加载。

final关键字的用法

  final意味着"不可改变的",一般应用于数据、方法和类。

final数据

    当数据是基本类型时,意味着这是一个永不改变的编译时常量,一个在运行时被初始化的值,你不希望它改变。

    当数据是引用类型时,用static和final修饰表示这是只占据一块不能改变的内存空间。

    有一条约定成俗的规定是使用stati和final修饰的变量即编译期常量应该用全部大写字母表示,例如:

  1. package cn.wangze.test;
  2.  
  3. import java.util.*;
  4.  
  5. class Value{
  6. int i;
  7. public Value(int i){
  8. this.i = i;
  9. }
  10. }
  11.  
  12. public class FinalData {
  13. private static Random rand = new Random(47);
  14. private String id;
  15. public FinalData(String id){
  16. this.id = id;
  17. }
  18. private final int value_one = 9;
  19. private static final int VALUE_TWO = 99;
  20. public static final int VALUE_THREE = 39;
  21. private final int i4 = rand.nextInt(20);
  22. static final int INT_5 = rand.nextInt(20);
  23. private Value v1 = new Value(11);
  24. private final Value v2 = new Value(22);
  25. static final Value V3 = new Value(33);
  26. private final int[] a = {1,2,3,4,5,6};
  27. @Override
  28. public String toString(){
  29. return id+", i4="+i4+",INT_5 = "+INT_5;
  30. }
  31. public static void main(String[] args){
  32. FinalData fd1 = new FinalData("fd1");
  33. //fd1.value_one++; 错误,final修饰的基本类型数据的值不能改变
  34. fd1.v2.i++;
  35. fd1.v1 = new Value(9); //可以操作,因为v1不是final数据
  36. //fd1.v2 = new Value(0); 错误,final修饰的引用类型数据的内存地址不能改变
  37. //fd1.v3 = new Value(5); 错误,final修饰的引用类型数据的内存地址不能改变
  38. //fd1.a = new int[3]; /错误,final修饰的引用类型数据的内存地址不能改变
  39. System.out.println(fd1); // fd1, i4=15,INT_5 = 18
  40. System.out.println("creating new FinalData");
  41. FinalData fd2 = new FinalData("fd2");
  42. System.out.println(fd1); //fd1, i4=15,INT_5 = 18
  43. System.out.println(fd2); //fd2, i4=13,INT_5 = 18
  44. }
  45. }

    上面例子验证了final修饰的基本数据类型和引用数据类型的区别。根据i4和INT_5的输出值可以得出结论,在编译期我们不能因为数据是final 的就可以知道它的值,只有在运行时才会确定它的值。同时这里也展示了静态和非静态的区别,带有static关键字的数据在装载时被初始化,非静态的数据是在创建对象时间初识化的。例如:

  1. package cn.wangze.test;
  2.  
  3. class useDemo{
  4. private int i;
  5. public useDemo(int ii){
  6. i = ii;
  7. }
  8. }
  9.  
  10. public class BlankFinal {
  11. private final int i = 9;
  12. private final int j;
  13. private final useDemo ud;
  14. public BlankFinal(){
  15. j = 1;
  16. ud = new useDemo(10);
  17. }
  18. public BlankFinal(int x){
  19. j = 2;
  20. ud = new useDemo(x);
  21. }
  22. public static void main(String[] args){
  23. new BlankFinal();
  24. new BlankFinal(55);
  25. }
  26. }

  上面例子我们在定义final变量是没有给其赋值,这并没有错,但是一定要在构造器中给其赋值,不然编译都不会通过。

  2、fianl参数

    当我们把方法传入的形参定义为fianl时候,代表我们并不想在方法内部改变此参数的引用。

  1. public void change( final useDemo u2){
  2. u2.i = 20;
  3. //u2 = new useDemo(20); 报错
  4. }

    事实是当我们不带有final关键字时,函数内部的引用改变也不会对外界的实参产生影响,所以我认为这里final的作用是编译期的阻拦,起到一个警示的作用。

  3、fianl方法

    一般我们使用final方法的目的就是防止子类对该类方法的覆盖或修改。

    类中的所有private方法都隐式的制定为final的。因为private方法只会在本类显示,即使是子类也不能操作该方法。有时候我们在子类中声明与父类private方法相同名称的方法,这样并不会报错,实际上我们并没有覆盖或者修改父类的private 方法,它只是一个和父类private方法具有相同名称的新方法。

  4、fianl类

    一般我们使用final类的目的就是说明我们不打算用任何类继承该类,即不希望该类有子类。

    带有final关键字的类,其内部所有方法和数据都是隐式带有final关键字的,因为没有类可以继承该类,代表着任何外界因素可以改变它的数据。

  总结:

    在我们设计程序的时候,会根据业务需求来决定是否对数据或方法或类带有static和final关键字,这很重要,从另一个角度来说,final和static关键字的合理应用确实可以提高程序的效率,减少内存的消耗,当我们了解了类的初始化和加载过程,可能会对final和static有一个更加直观的认识。

Java的static和final关键字的用法的更多相关文章

  1. 【Java_基础】java中static与final关键字的区别

    1.static关键字 经static关键字修饰的成员被该类的所有对象所共享,任意一对象对静态变量的修改其它对象都是可见的.通常通过类名来引用static成员.类加载的连接阶段将会为静态成员变量在jv ...

  2. java中static,super,final关键字辨析

    1:static关键字 利:1)对对象的共享数据提供单独的空间存储. 2)修饰的方法可以直接被类名调用 弊:1)生命周期长. 2)访问出现限制(只能访问静态) 它可以有静态方法,静态类,静态变量 2: ...

  3. java基本数据类型总结 类型转换 final关键字的用法

    java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...

  4. Objec类和final关键字的用法

    一.在继承中,子类继承父类,那父类继承谁呢,java中如果类没有指定继承谁,那么就默认继承Object类,object类是所有对象的直接或者间接的父类,根类,或者叫做基类,它里面定义的功能所有的对象都 ...

  5. static 和 final 关键字 对实例变量赋初始值的影响

    static 和 final 关键字 对实例变量赋初始值的影响 最近一直在看<深入理解Java虚拟机>,在看完了对象内存分配.Class文件格式之后,想深扒一下实例变量是如何被赋上初始值的 ...

  6. java中的final关键字的用法

    一. 什么是final关键字? final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变 ...

  7. Java中static、final用法小结

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

  8. Java中static、final用法

    一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...

  9. Java基本数据类型总结、类型转换、常量的声明规范,final关键字的用法

    1  Java 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过 ...

随机推荐

  1. java程序员常见面试题目

      答:每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象.实际上,产生了异常之后,JVM会抛出一个异常类的实例化对象,如果此时使用了try语句捕获的话,则可以进行异常的处理,否则 ...

  2. RedHat安装中文支持和字体

    操作系统: Red Hat Enterprise Linux 6.3 x86 安装中文语言支持: yum install "@chinese support" 安装完中文支持后,可 ...

  3. vijos1059题解

    题目: XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大 ...

  4. [SinGuLaRiTy] 组合数学题目复习

    [SinGuLaRiTy] Copyright (c) SinGuLaRiTy 2017.  All Rights Reserved. [CQBZOJ 2011] 计算系数 题目描述 给定一个多项式( ...

  5. Spring3 MVC DispatcherServlet 配置问题

    1. Spring MVC 是通过servlet来进行转发的,一般在web.xml中配置如下: <servlet> <servlet-name>dispatcher</s ...

  6. [HDU1512/ZOJ2334]Monkey King-左偏树-可合并堆

    Problem Monkey King Solution 本题是裸的左偏树,一个模板就可以过了.对于每个操作对节点先删除/2再合并. 注意本题在HDU上评测特别坑,是多组数据,而且经常出现MLE的情况 ...

  7. Luogu 3402 最长公共子序列(二分,最长递增子序列)

    Luogu 3402 最长公共子序列(二分,最长递增子序列) Description 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子可教,就给他布置了一个课后作业: ...

  8. 剖析touch事件在View中的传递

    话不多说,直奔主题,先来看一张图 版权申明:这是csdn上别人的图,我觉得有用,就拿过来了, 然后简单说明下: 总的来说,触摸事件是从最外层的ViewGroup,一级一级传递进来的 和这相关的每个Vi ...

  9. background:rgba() 兼容ie8 用法

    background: rgba(255,255,255,.1);//火狐,谷歌等 filter:progid:DXImageTransform.Microsoft.gradient(startCol ...

  10. 游戏里的动态阴影-ShadowMap实现原理

    ShadowMap是比较流行的实时阴影实现方案,原理比较简单,但真正实现起来还是会遇到很多问题的,我这里主要记录下实现方式 先看效果 凹凸地形上也有阴影 实现原理 ShadowMap技术是从灯光空间用 ...