黑马程序员技术交流社区

标题: 关于final和static的使用问题 [打印本页]

作者: 朱德帅    时间: 2013-4-12 22:21
标题: 关于final和static的使用问题
本帖最后由 朱德帅 于 2013-4-13 09:12 编辑

在编写程序时,很多时候要要到final和static去修饰变量或者是对象。我想问一下:什么时候需要用final修饰,什么时候要用static?我只是看到Eclipse的错误提示时才知道,我想明白这两个修饰符的作用,谢谢!
作者: 。。。。。。    时间: 2013-4-12 22:26
1.final变量:
      当你在类中定义变量时,在其前面加上final关键字,那便是说,这个变量一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对于对象变量来说其引用不可再变。其初始化可以在两个地方,一是其定义处,也就是说在final变量定义时直接给其赋值,二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时给了值,又在构造函数中给另外的值。
     当函数参数为final类型时,你可以读取使用该参数,但是无法改变该参数的值。
     另外方法中的内部类在用到方法中的参变量时,此参变也必须声明为final才可使用
2.final方法
     如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
使用final方法的原因有二:
    第一、把方法锁定,防止任何继承类修改它的意义和实现。
    第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。
3.final类
     final类不能被继承,因此final类的成员方法没有机会被覆盖,默认都是final的。在设计类时候,如果这个类不需要有子类,类的实现细节不允许改变,并且确信这个类不会载被扩展,那么就设计为final类。
二、static
      被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。
      static变量前可以有private修饰,表示这个变量可以在类的静态代码块中,或者类的其他静态成员方法中使用(当然也可以在非静态成员方法中使用--废话),但是不能在其他类中通过类名来直接引用,这一点很重要。实际上你需要搞明白,private是访问权限限定,static表示不要实例化就可以使用
     用static修饰的代码块表示静态代码块,当Java虚拟机(JVM)加载类时,就会执行该代码块
1.static变量
      按照是否静态的对类成员变量进行分类可分两种:一种是被static修饰的变量,叫静态变量或类变量;另一种是没有被static修饰的变量,叫实例变量。两者的区别是:
    对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,可用类名直接访问(方便),当然也可以通过对象来访问(但是这是不推荐的)。对于实例变量,没创建一个实例,就会为实例变量分配一次内存,实例变量可以在内存中有多个拷贝,互不影响(灵活)。
2.static方法
      静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
3.static代码块
      static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内,JVM加载类时会执行这些静态的代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们,每个代码块只会被执行一次。
4、static和final一块用表示什么
static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
对于方法,表示不可覆盖,并且可以通过类名直接访问。

作者: wlt    时间: 2013-4-12 22:30
final  :“这是无法改变的”或者“终态的”含义.
static:是静态修饰关键字
final用来修饰变量的时候表示该变量是一个常量,不能再程序修改变量的值,用来修饰方法的时候,表示该方法不能被重写;用来修饰类的时候,表示该方法不能被继承。
static表示静态的,是该类的所有对象共享的资源,可以用来修饰变量和方法,也可以修饰一个代码块。

作者: 通行天下    时间: 2013-4-12 22:49
final修饰的变量,只可以赋值一次,以后都被当做常量来使用;用final修饰的对象是不可以被实例化的;用final修饰的方法是不能被重写的。static是静态的意思,用static修饰的方法和属性是可以用类名直接访问的,并且静态方法在内存中的执行时优先于非静态的。
作者: 孤独的鸟人    时间: 2013-4-12 22:51
static是静态修饰关键字,可以修饰变量和程序块以及类方法:当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存;修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化;当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。
用法:1.static修饰成员函数:该成员函数不能使用this对象
     static不能修饰构造函数
     static不能修饰函数参数
     static不能修饰局部成员变量
     2.static修饰成员字段
     当类被虚拟机加载时,首先按照字段声明的先后顺序对static成员字段进行初始化
     3.static修饰语句块
     当类被虚拟机加载时,按照声明顺序先后初始化static成员字段和static语句块
     static所修饰的方法和字段是只属于类,所有对象共享。
     在static所修饰的函数和语句块中不能使用非static成员字段。
     在Java不能直接定义全局变量,是通过static来实现的
     在Java中没有const,不能直接定义常量,通过static final来实现
final可以修饰变量、方法及类,当你定义一个final变量时,jvm会将其分配到常量池中,程序不可改变其值;当你定义一个方法时,改方法在子类中将不能被重写;当你修饰一个类时,该类不能被继承。
用法1.final修饰类:表示该类不可继承
     final不能修饰interface接口
     2.final修饰方法:表示该方法不能被子类覆盖(即子类不能重写父类的final方法,可以继承)
        final不能修饰构造函数
     3.final修饰字段属性:表示属性值第一次初始化后不能被修改
     final属性可以直接初始化或在构造函数中初始化
     如果属性是直接初始化,则其值不能被其它函数(包括构造函数)修改
     4.final修饰函数参数
     参数值不能被函数修改
     5.final修饰函数中的局部变量
     局部变量被第一次初始化后不能被修改
作者: ld5128702    时间: 2013-4-12 23:07
static可以修饰代码块和变量,而final可以修饰变量和类。
static 表示静态的,从始至终只获得一块内存空间。而且这块空间的资源还具有“全局性”,就是说所有的成员都可以无条件引用,另外,static修饰的不用程序调用,只要该类被执行,static修饰的也被执行。如最常见的,Public static void main(){};又如 static int a;那么所有的成员都可以引用a.
final 表示最终的,它修饰的类不能有子类。它修饰的变量是不可变的常数,所以final的变量要立刻赋值。

作者: HM李超    时间: 2013-4-13 00:41
final的作用和用法:
1,可以修饰类,函数,变量。
2,被final修饰的类不可以被继承。为了避免被继承,被子类复写功能。因为继承打破了面向对象的封装性,为了更好的封装,使用final来解决。
3,被final修饰的方法不可以被复写。
4,被final修饰的变量是一个常量只能赋值一次。既可以修饰成员变量,又可以修饰局部变量。当在描述事物时,一些数据的值是固定的,那么这时为了增强阅读性,都给这些值起一个名字,方便于阅读。而这个值不需要改变,所以加上final修饰。作为常量:常量的书写规范所有的字母都大写,
如果由多个单词组成,单词间通过_连接。
public static final共同标记常量时,这个常量就成了全局的常量,可以被类名调用。
5,内部类定义在类中的局部位置上时,只能访问该局部被final修饰的局部变量。
6,final修饰基本类型和引用类型变量的区别
当使用final修饰基本类型变量时,不能对基本类型变量重新赋值,因此基本类型变量不能被改变。
但对于引用类型的变量而言,它保存的仅仅是一个引用,final只保证这个引用所引用的地址不会改变,
即一直引用同一个对象,但这个对象完全可以发生改变。
详细请看我的CSDN博客:http://blog.csdn.net/lee_tianya/article/details/8715219
static的作用和用法:
1,什么时候定义静态变量(类变量)?
当对象中出现共享数据时,该数据被静态所修饰,对象中的特有数据要定义成非静态存在于堆内存中。
2,什么时候定义静态函数?
    用法:是一个修饰符,用于修饰成员(成员变量和成员方法)当成员变量被静态修饰后,除了可以被“对象.成员变量”调用外,还多了一种修饰方法:类名.成员变量
2static的特点:
    1.随着类的加载而加载;也就是说,静态随着类的消失而消失,说明它的生命周期最长
    2.优先于对象存在;明确一点:静态先存在,对象后存在
    3.被所有对象共享;
    4.可以直接被类名所调用;
3静态变量和类变量的区别:
    1,存放的位置:
    类变量随着类的加载而存在于方法区中;
    实例变量随着对象的建立存在于堆内存中
    2,生命周期:
    类变量的生命周期最长,随着类的消失而消失
    实例变量的生命周期随着对象的消失而消失
4静态使用注意事项:
    1,静态方法只能访问静态成员
    非静态既可以访问静态也可以访问非静态
    2,静态方法中不可以使用this,super关键字, 因为静态优先于对象存在,所以金泰方法中不可以出现this
    3,主函数是静态
5,静态的利与弊:
    利处:对对象的共享数据进行单独空间的存储,节省空间,没有必要为每个对象都存储一份。
     可以被类名直接调用。
    弊端:生命周期过长。
     访问出现局限性。(静态虽好,只能访问静态)
      当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态。
详细请看我的CSDN博客总结http://blog.csdn.net/lee_tianya/article/details/8715215

作者: 易杰    时间: 2013-4-13 00:47
顶一顶!!!!
作者: 黄玉昆    时间: 2013-4-13 08:20
这种总结性的知识,建议楼主可以在平常的时候就把遇到的问题都记在本子上,分类整理,自己总结了,记忆会更深刻的,谢谢
作者: 黄玉昆    时间: 2013-4-13 08:21
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2