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 基本数据类型 变量就是申请内存来存储值.也就是说,当创建变量的时候,需要在内存中申请空间. 内存管理系统根据变量的类型为变量分配存储空间,分配的空间只能用来储存该类型数据. 因此,通过 ...
随机推荐
- nth-child 和nth-type的区别
一.深呼吸,直接内容:nth-child和:nth-of-type都是CSS3中的伪类选择器,其作用近似却又不完全一样,对于不熟悉的人对其可能不是很区分,本文就将介绍两者的不同,以便于大家正确灵活使用 ...
- hack在微信等webview中无法修改document.title的情况
var $body = $('body'); document.title = '确认车牌'; // hack在微信等webview中无法修改document.title的情况 var $iframe ...
- (转载)Apache与Tomcat 区别联系
原文链接:http://www.admin10000.com/document/974.html Apache 和 Tomcat 都是web网络服务器,两者既有联系又有区别,在进行HTML.PHP.J ...
- 在线制作css动画——cssanimate
熟悉CSS的人都知道,CSS可以实现很多漂亮的动画,特别是它的在线功能,能够帮助人们解决很多制作动画的效果.今天特别推荐一个在线CSS插件功能--cssanimate,这个最大的特色就是以图形界面方式 ...
- Asp.net MVC-3-执行过程
本篇主要讲述MVC处理请求时创建Controller和执行Action的完整过程. 创建Controller 先查看MvcHandler中处理请求的方法BeginProcessRequest: pro ...
- 【SqlServer系列】表连接
1 概述 1.1 已发布[SqlServer系列]文章 [SqlServer系列]MYSQL安装教程 [SqlServer系列]数据库三大范式 [SqlServer系列]表单查询 1.2 本篇 ...
- oracle默认用户名及密码
oracle默认用户名及密码(网摘) (1)user: internal password :oracle (2)user: s ...
- java Semaphore的介绍和使用
一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...
- 说说BroadcastReceiver和ContentProvider
上一篇说了Activity,Fragment和Service,今天来说说四大组件中的另外两个吧. BroadcastReceiver: 广播在实际开发中非常有用,是各个组件间通讯的利器.广播接收器分为 ...
- CentOS-7.2安装Ambari-2.4.2
一,Ambari 是什么? Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目,并且是顶级项目.目前最新的发布版本是 2.4.2. ...