static关键字的用法

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

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

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

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

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

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

package cn.wangze.test;

class Demo{
public static int i = 19;
} public class staticDemo {
private static Demo demo1 = new Demo();
private static Demo demo2 = new Demo();
public static void main(String[] args){
System.out.println(Demo.i); //
System.out.println(demo1.i); //
System.out.println(demo2.i); //
demo1.i++;
System.out.println(Demo.i); //
System.out.println(demo1.i); //
System.out.println(demo2.i); //
Demo.i++;
System.out.println(Demo.i); //
System.out.println(demo1.i); //
System.out.println(demo2.i); //
}
}

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

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

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

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

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

final关键字的用法

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

final数据

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

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

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

package cn.wangze.test;

import java.util.*;

class Value{
int i;
public Value(int i){
this.i = i;
}
} public class FinalData {
private static Random rand = new Random(47);
private String id;
public FinalData(String id){
this.id = id;
}
private final int value_one = 9;
private static final int VALUE_TWO = 99;
public static final int VALUE_THREE = 39;
private final int i4 = rand.nextInt(20);
static final int INT_5 = rand.nextInt(20);
private Value v1 = new Value(11);
private final Value v2 = new Value(22);
static final Value V3 = new Value(33);
private final int[] a = {1,2,3,4,5,6};
@Override
public String toString(){
return id+", i4="+i4+",INT_5 = "+INT_5;
}
public static void main(String[] args){
FinalData fd1 = new FinalData("fd1");
//fd1.value_one++; 错误,final修饰的基本类型数据的值不能改变
fd1.v2.i++;
fd1.v1 = new Value(9); //可以操作,因为v1不是final数据
//fd1.v2 = new Value(0); 错误,final修饰的引用类型数据的内存地址不能改变
//fd1.v3 = new Value(5); 错误,final修饰的引用类型数据的内存地址不能改变
//fd1.a = new int[3]; /错误,final修饰的引用类型数据的内存地址不能改变
System.out.println(fd1); // fd1, i4=15,INT_5 = 18
System.out.println("creating new FinalData");
FinalData fd2 = new FinalData("fd2");
System.out.println(fd1); //fd1, i4=15,INT_5 = 18
System.out.println(fd2); //fd2, i4=13,INT_5 = 18
}
}

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

package cn.wangze.test;

class useDemo{
private int i;
public useDemo(int ii){
i = ii;
}
} public class BlankFinal {
private final int i = 9;
private final int j;
private final useDemo ud;
public BlankFinal(){
j = 1;
ud = new useDemo(10);
}
public BlankFinal(int x){
j = 2;
ud = new useDemo(x);
}
public static void main(String[] args){
new BlankFinal();
new BlankFinal(55);
}
}

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

  2、fianl参数

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

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

    事实是当我们不带有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. webpack的Hot Module Replacement运行机制

    使用webpack打包,难免会使用Hot Module Replacement功能,该功能能够实现修改.添加或删除前端页面中的模块代码,而且是在页面不刷新的前提下.它究竟是怎么运作的呢?本文主要从调试 ...

  2. Java通过Axis2发布WebService

    参考文档: http://blog.csdn.net/ghsau/article/details/12714965 http://www.iteye.com/topic/1135747 http:// ...

  3. jQuery教程详解(一)

    PS--了解JQuery Query是一个快速.简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库( 或JavaScript框架).jQuery设计的宗旨 ...

  4. FTP DOS 命令行

    1. 在cmd--> 输入ftp 2. 进入ftp输入提示命令行,此时输入open ftp服务器地址,比如我的是本机就: open 127.0.0.1 3. 根据提示输入用户名和密码, 提示登录 ...

  5. [TYVJ1728/BZOJ3224]普通平衡树-替罪羊树

    Problem 普通平衡树 Solution 本题是裸的二叉平衡树.有很多种方法可以实现.这里打的是替罪羊树模板. 此题极其恶心. 前驱后继模块需要利用到rank模块来换一种思路求. 很多细节的地方容 ...

  6. POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA)

    POJ 1330 Nearest Common Ancestors / UVALive 2525 Nearest Common Ancestors (最近公共祖先LCA) Description A ...

  7. 使用Linux环境变量

    bash shell用一个叫做环境变量的特性来存储有关shell会话和工作环境的信息. 全局环境变量 这对shell 会话和所有生成的子shell都是可见的.局部变量只对创建他们的shell可见. 系 ...

  8. kotlin-30分钟快速入门

    1.定义变量 在kotlin中,通过var 或者 val 来定义,区别就是 val定义的变量只能读不能修改,var则可以修改. val a:Int = 1 //等价于java: final int i ...

  9. RxSwift 系列(九) -- 那些难以理解的概念

    前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就 ...

  10. Java使用拦截器的两种方式

    拦截器是个好东西,之前用到过,现在记录一下,供以后参考使用! 其一,使用org.aspectj.lang.annotation.Aspect 先上代码: package com.test.interc ...