Java的static和final关键字的用法
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关键字的用法的更多相关文章
- 【Java_基础】java中static与final关键字的区别
1.static关键字 经static关键字修饰的成员被该类的所有对象所共享,任意一对象对静态变量的修改其它对象都是可见的.通常通过类名来引用static成员.类加载的连接阶段将会为静态成员变量在jv ...
- java中static,super,final关键字辨析
1:static关键字 利:1)对对象的共享数据提供单独的空间存储. 2)修饰的方法可以直接被类名调用 弊:1)生命周期长. 2)访问出现限制(只能访问静态) 它可以有静态方法,静态类,静态变量 2: ...
- java基本数据类型总结 类型转换 final关键字的用法
java基本数据类型总结 Java数据类型总结 数据类型在计算机语言里面,是对内存位置的一个抽象表达方式,可以理解为针对内存的一种抽象的表达方式.接触每种语言的时候,都会存在数据类型的认识,有复杂的. ...
- Objec类和final关键字的用法
一.在继承中,子类继承父类,那父类继承谁呢,java中如果类没有指定继承谁,那么就默认继承Object类,object类是所有对象的直接或者间接的父类,根类,或者叫做基类,它里面定义的功能所有的对象都 ...
- static 和 final 关键字 对实例变量赋初始值的影响
static 和 final 关键字 对实例变量赋初始值的影响 最近一直在看<深入理解Java虚拟机>,在看完了对象内存分配.Class文件格式之后,想深扒一下实例变量是如何被赋上初始值的 ...
- java中的final关键字的用法
一. 什么是final关键字? final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变 ...
- Java中static、final用法小结
一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...
- Java中static、final用法
一.final 1.final变量: 当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引 ...
- Java基本数据类型总结、类型转换、常量的声明规范,final关键字的用法
1 Java 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过 ...
随机推荐
- java程序员常见面试题目
答:每当程序出现异常之后,如果程序没有进行相应的处理,则程序会出现中断现象.实际上,产生了异常之后,JVM会抛出一个异常类的实例化对象,如果此时使用了try语句捕获的话,则可以进行异常的处理,否则 ...
- RedHat安装中文支持和字体
操作系统: Red Hat Enterprise Linux 6.3 x86 安装中文语言支持: yum install "@chinese support" 安装完中文支持后,可 ...
- vijos1059题解
题目: XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡.城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木.小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大 ...
- [SinGuLaRiTy] 组合数学题目复习
[SinGuLaRiTy] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [CQBZOJ 2011] 计算系数 题目描述 给定一个多项式( ...
- Spring3 MVC DispatcherServlet 配置问题
1. Spring MVC 是通过servlet来进行转发的,一般在web.xml中配置如下: <servlet> <servlet-name>dispatcher</s ...
- [HDU1512/ZOJ2334]Monkey King-左偏树-可合并堆
Problem Monkey King Solution 本题是裸的左偏树,一个模板就可以过了.对于每个操作对节点先删除/2再合并. 注意本题在HDU上评测特别坑,是多组数据,而且经常出现MLE的情况 ...
- Luogu 3402 最长公共子序列(二分,最长递增子序列)
Luogu 3402 最长公共子序列(二分,最长递增子序列) Description 经过长时间的摸索和练习,DJL终于学会了怎么求LCS.Johann感觉DJL孺子可教,就给他布置了一个课后作业: ...
- 剖析touch事件在View中的传递
话不多说,直奔主题,先来看一张图 版权申明:这是csdn上别人的图,我觉得有用,就拿过来了, 然后简单说明下: 总的来说,触摸事件是从最外层的ViewGroup,一级一级传递进来的 和这相关的每个Vi ...
- background:rgba() 兼容ie8 用法
background: rgba(255,255,255,.1);//火狐,谷歌等 filter:progid:DXImageTransform.Microsoft.gradient(startCol ...
- 游戏里的动态阴影-ShadowMap实现原理
ShadowMap是比较流行的实时阴影实现方案,原理比较简单,但真正实现起来还是会遇到很多问题的,我这里主要记录下实现方式 先看效果 凹凸地形上也有阴影 实现原理 ShadowMap技术是从灯光空间用 ...