A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© leon_hm 中级黑马   /  2014-3-28 18:54  /  1730 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

java中static 和final的区别是什么?
匿名内部类只能访问外部类的final修饰的变量?

6 个回复

倒序浏览
    static是静态修饰关键字,可以修饰变量和程序块以及类方法:当你定义一个static的变量的时候jvm会将其分配在内存堆上。所有程序对它的引用都会指向这一个地址而不会重新分配内存;修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化;当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。
    final可以修饰变量、方法及类,当你定义一个final变量时,jvm会将其分配到常量池中,程序不可改变其值;当你定义一个方法时,改方法子类中将不能被重写;当你修饰一个类时,该类不能被继承

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报 1 0
匿名内部类可以访问外部类的变量,不一定非要final修饰的
static和final都是java关键字,只要记住static修饰的事物加载顺序是类被加载的时候就加载了,static修饰的变量在内存中占据一个内存空间,不管有多少对象,共用同一个static修饰的变量
final:这个关键字是一个修饰符,可以修饰类,方法,变量。
2:被final修饰的类是一个最终类,不可以被继承。
3:被final修饰的方法是一个最终方法,不可以被覆盖。
4:被final修饰的变量是一个常量,只能赋值一次。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

回复 使用道具 举报
  1. class DemoTest
  2. {
  3.         static int a = 7;
  4.         final  int b = 7;
  5. }
  6. public class Demo {

  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 //用类名直接调用static修饰的变量并改变其值
  10.                 DemoTest.a = 5;
  11.                 //打印结果5
  12.                 System.out.println(DemoTest.a);
  13.                 //如果要调用b的话则需要创建DemoTest的引用对象
  14.                 DemoTest dt = new DemoTest();
  15.                 //这样是不行的,不可以改变final修饰的变量
  16.                 //dt.b = 5;
  17.                
  18.         }

  19. }
复制代码
回复 使用道具 举报
static是静态修饰关键字,可以修饰变量和程序块以及类方法:当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存;修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化;当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象。final可以修饰变量、方法及类,当你定义一个final变量时,jvm会将其分配到常量池中,程序不可改变其值;当你定义一个方法时,改方法在子类中将不能被重写;当你修饰一个类时,该类不能被继承。

评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 很给力!

查看全部评分

回复 使用道具 举报
static特点:        1,想要实现对象中的共性数据的对象共享。可以将这个数据进行静态修饰。        2,被静态修饰的成员,可以直接被类名所调用。也就是说,静态的成员多了一种调用方式。类名.静态方式。        3,静态随着类的加载而加载。而且优先于对象存在。弊端:        1,有些数据是对象特有的数据,是不可以被静态修饰的。因为那样的话,特有数据会变成对象的共享数据。这样对            事物的描述就出了问题。所以,在定义静态时,必须要明确,这个数据是否是被对象所共享的。        2,静态方法只能访问静态成员,不可以访问非静态成员。        因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。        3,静态方法中不能使用this,super关键字。         因为this代表对象,而静态在时,有可能没有对象,所以this无法使用。        4,主函数是静态的。



final特点:
        1:这个关键字是一个修饰符,可以修饰类,方法,变量。
        2:被final修饰的类是一个最终类,不可以被继承。
        3:被final修饰的方法是一个最终方法,不可以被覆盖。
        4:被final修饰的变量是一个常量,只能赋值一次。


而变量被final修饰后就变成"宏变量"了   其实就是跟常量差不多

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
枫露 中级黑马 2014-3-28 22:29:02
7#
static关键字
     static 关键字可以用来修饰类的变量,方法和内部类。static 是静态的意思,也是全局的意思它定义的东西,属于全局与类相关,不与具体实例相关。就是说它调用的时候,只是 ClassName.method(),而不是 new ClassName().method()。new ClassName()不就是一个对象了吗?static 的变量和方法不可以这样调用的。它不与具体的实例有关。
final关键字
final 关键字有三个东西可以修饰的。修饰类,方法,变量。  详细解释一下:

在类的声明中使用 final  
使用了 final 的类不能再派生子类,就是说不可以被继承了。有些 java 的面试题里面,问 String 可不可以被继承。答案是不可以,因为 java.lang.String是一个 final 类。这可以保证 String 对象方法的调用确实运行的是 String 类的方法,而不是经其子类重写后的 方法。

在方法声明中使用 final  
被定义为 final 的方法不能被重写了,如果定义类为 final 的话,是所有的方法都不能重写。而我们只需要类中的某几个方法,不可以被重写,就在方法前加 final 了。而且定义为 final 的方法执行效率要高的啊。

在变量声明中使用 final  
这样的变量就是常量了,在程序中这样的变量不可以被修改的。修改的话编译器会抱错的。而且执行效率也是比普通的变量要高。final 的变量如果没有赋予初值的话,其他方法就必需给他赋值,但只能赋值一次。

注意:子类不能重写父类的静态方法哦,也不能把父类不是静态的重写成静态的方法。想隐藏父类的静态方法的话,在子类中声明和父类相同的方法就行了。

评分

参与人数 1技术分 +1 收起 理由
zzkang0206 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马