黑马程序员技术交流社区

标题: static和final [打印本页]

作者: 蓝枫    时间: 2014-3-16 00:14
标题: static和final
static关键字和final关键字有什么区别?越详细越好!
作者: Bukeng    时间: 2014-3-16 00:19
final修饰的类不能被继承,final变量只能赋值一次。而static定义的变量可以多次赋值
作者: SyouRai_Tsk    时间: 2014-3-16 01:15
java中static方法自动的就是final的吗?是不对的,他们两个是不同的定义,你可以再网上找一些资料对比下,下面简单说下static与final的作用:
static作用
是静态修饰符,什么叫静态修饰符呢?大家都知道,在程序中任何变量或者代码都是在编译时由系统自动分配内存来存储的,而所谓静态就是指在编译后所分配的内存会一直存在,直到程序退出内存才会释放这个空间,也就是只要程序在运行,那么这块内存就会一直存在

final作用
final关键字是最终的、最后的意思,在程序中可以用来修饰类、成员变量和方法的声明,由该关键字修饰的内容都是不可变的。
作者: 李猛    时间: 2014-3-16 07:53
静态修饰符:被静态修饰的变量,会随着累的加载而加载,并且不能被覆盖,被静态修饰的方法是不能被覆盖,静态方法只能访问静态成员不能访问非静态的,非静态的可以访问静态的,fianl:意思就是最终方法,被final修饰的雷不允许被覆盖,被final修饰的方法不允许复写,被final修饰的变量值不能改变,可以修饰局部的变量也可修饰全局变量但是赋值后值不能改变,其存在就如同常量
作者: 王浩龙    时间: 2014-3-16 08:39
静态:static。
用法:是一个修饰符,用于修饰成员(成员变量,成员函数).
当成员被静态修饰后,就多了一个调用方式,除了可以被对象调用外,
还可以直接被类名调用。类名.静态成员。
static使用的时候
当对象中出现共享数据时,该数据被静态所修饰。
当功能内部没有访问到非静态数据(对象的特有数据),那么该功能可以定义成静态的。
static特点:
1,随着类的加载而加载静态会随着类的消失而消失。说明它的生命周期最长。
2,优先于的对象存在
3,被所有对象所共享
4,可以直接被类名所调用。
实例变量和类变量的区别:
1,存放位置。
静态变量即类变量随着类的加载而存在于方法区中。
实例变量随着对象的建立而存在于堆内存中。
2,生命周期:
类变量生命周期最长,随着类的消失而消失。
实例变量生命周期随着对象的消失而消失。
静态使用注意事项:
1,静态方法只能访问静态成员。非静态方法既可以访问静态也可以访问非静态。
2,静态方法中不可以定义this,super关键字。因为静态优先于对象存在。所以静态方法中不可以出现this。


       


静态有利有弊
利处:对对象的共享数据进行单独空间的存储,节省空间。没有必要每一个对象中都存储一份。可以直接被类名调用。
弊端:生命周期过长。 访问出现局限性。

final : 最终。作为一个修饰符,
1,可以修饰类,函数,变量。
2,被final修饰的类不可以被继承。
3,被final修饰的方法不可以被复写。
4,被final修饰的变量是一个常量只能赋值一次,既可以修饰成员变量,有可以修饰局部变量。作为常量:常量的书写规范所有字母都大写,如果由多个单词组成。单词间通过_连接。
5,内部类定义在类中的局部位置上是,只能访问该局部被final修饰的局部变量。
作者: qqwwdr    时间: 2014-3-16 08:43
本帖最后由 qqwwdr 于 2014-3-16 08:54 编辑
李猛 发表于 2014-3-16 07:53
静态修饰符:被静态修饰的变量,会随着累的加载而加载,并且不能被覆盖,被静态修饰的方法是不能被覆盖,静 ...

被静态修饰的方法是不能被覆盖
      刚复习到继承这里,

    在方法覆盖时,注意两点:
1:子类覆盖父类时,必须要保证,子类方法的权限必须大于等于父类方法权限可以实现继承。否则,编译失败。
2:覆盖时,要么都静态,要么都不静态。 (静态只能覆盖静态,或者被静态覆盖).

所以,, 静态方法不存在可不可以被覆盖的问题.
因为静态方法是属于类级别的, 覆盖是指子类对象覆盖父类对象的方法.覆盖是对象级别的.

  1. public class StaticTest {
  2.         public static void main(String[] args)
  3.         {
  4.                 System.out.println("Hello World!");

  5.                 Static1.init();
  6.                 Static2.init();
  7.         }
  8. }
  9. class Static1{
  10.         public static void init(){
  11.                 System.out.println("Static1");
  12.         }
  13. }
  14. class Static2 extends Static1{
  15.         @Override
  16.         public static void init(){
  17.                 System.out.println("Static2");       
  18.         }
  19. }
复制代码

测试了下,  使用 @Override 时,  会报错.


作者: 文江江    时间: 2014-3-16 08:49
static
1.在类中,用static修饰的属性,称为静态属性。为这个类的所有对象所共有,存放在静态存储区,所有该类的对象都可以访问且访问的都是同一变量。
2.在类中,用static 修饰的方法为静态方法,在静态方法中不可以访问非静态的属性和方法,但在非静态方法中可以访问静态方法和属性;且static方法多态失效,不能使用this。
3.由于静态属性和方法是属于该类的所有对象的,所以可以用类名.静态属性/方法名---来访问。
4.static 还可以修饰代码块,在类加载的时候被执行1次,仅且一次。
final
final标记的类不能被继承,方法不能被子类重写,局部变量为常量
作者: 2528870651    时间: 2014-3-16 14:23
嗯  参考一下




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