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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杜天伟 中级黑马   /  2013-7-13 21:30  /  1966 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨兴庭 于 2013-7-14 11:01 编辑

被final修饰的变量不会再改变,相当于一个常量.那么,为什么不直接定义一个常量得了。不就不用final修饰了吗?

评分

参与人数 1黑马币 +3 收起 理由
杨兴庭 + 3

查看全部评分

16 个回复

倒序浏览
被final修饰就是让一个变量不能被修改,就等于是定义一个常量。不然的话怎么定义一个常量呢?
回复 使用道具 举报
用final修饰的成员变量表示常量,只能被赋值一次,赋值后值无法改变!
final修饰的变量有三种:静态变量、实例变量和局部变量,分别表示三种类型的常量。
从下面的例子中可以看出,一旦给final变量初值后,值就不能再改变了。
另外,final变量定义的时候,可以先声明,而不给初值,这种变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。

评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
杜天伟 来自手机 中级黑马 2013-7-13 22:06:03
板凳
王靖远 发表于 2013-7-13 21:38  被final修饰就是让一个变量不能被修改,就等于是定义一个常量。不然的话怎么定义一个常量呢? ...

这个……毕老师还真没讲常量怎么定义
回复 使用道具 举报
杜天伟 发表于 2013-7-13 22:06
这个……毕老师还真没讲常量怎么定义

枚举类似乎可以定义一些常量。普通类里应该就是用final来搞了
回复 使用道具 举报
不用final修饰怎么定义常量?被final修饰的变量才是一个常量
回复 使用道具 举报
风乐 中级黑马 2013-7-13 22:18:15
7#
1.final修饰类:表示该类不可继承,final不能修饰interface接口

2.final修饰方法:表示该方法不能被子类覆盖(即子类不能重写父类的final方法,可以继承),final不能修饰构造函数

3.final修饰字段属性:表示属性值第一次初始化后不能被修改,final属性可以直接初始化或在构造函数中初始化,如果属性是直接初始化,则其值不能被其它函数(包括构造函数)修改

4.final修饰函数参数,参数值不能被函数修改

5.final修饰函数中的局部变量,局部变量被第一次初始化后不能被修改



final修饰的并不是一定要是固定常量,可以是一个表达式,如下代码
  1. import java.util.Random;

  2. public class FinalTest {
  3.         // 47作为随机种子,为的就是产生随机数。
  4.         private static Random rand = new Random(47);
  5.         private final int a = rand.nextInt(20);

  6.         public static void main(String[] args) {

  7.                 FinalTest sf = new FinalTest();
  8.                 System.out.println("sf : " + "a=" + sf.a);
  9.                 System.out.println("------------------------------");
  10.                 FinalTest sf1 = new FinalTest();
  11.                 System.out.println("sf1 : " + "a=" + sf1.a);
  12.         }
  13. }
复制代码
sf : a=18
------------------------------
sf1 : a=15





评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
李江 中级黑马 2013-7-13 22:22:17
8#
首先先弄明白什么是常量:
常量是一种标识符,它的值在运行期间恒定不变。并且常量在程序中只能被引用,而不能被重新赋值。
常量的定义:
在JAVA中,在变量声明中加入final关键字代表常量,加入static关键字代表类变量。一般情况下,我们把static与final结合起来声明一个常量.

我是这样理解的。毕老师经常讲的是public static final double PI = 3.14;


评分

参与人数 1技术分 +1 收起 理由
杨兴庭 + 1

查看全部评分

回复 使用道具 举报
具体来说 是引用变量不会变 但 引用变量所指向的内容还是可以改变的
  1. final  StringBuffer  sb=new  StringBuffer();
  2. sb.append("hello world"):
复制代码
这是我想到的 不知可以帮到你不
回复 使用道具 举报
杜天伟 来自手机 中级黑马 2013-7-13 22:58:27
10#
280270738 发表于 2013-7-13 22:12  不用final修饰怎么定义常量?被final修饰的变量才是一个常量

原来这就是常量
回复 使用道具 举报
杜天伟 来自手机 中级黑马 2013-7-13 23:00:34
11#
风乐 发表于 2013-7-13 22:18  1.final修饰类:表示该类不可继承,final不能修饰interface接口   2.final修饰方法:表示该方法不能被子类覆盖 ...

为什么不能修饰构造函数呢?
回复 使用道具 举报
杜天伟 来自手机 中级黑马 2013-7-13 23:01:23
12#
姚志远 发表于 2013-7-13 22:35  具体来说 是引用变量不会变 但 引用变量所指向的内容还是可以改变的这是我想到的 不知可以帮到你不 ...

这个真的能改变吗?你试过吗?
回复 使用道具 举报
杜天伟 发表于 2013-7-13 23:00
为什么不能修饰构造函数呢?

我的理解是final修饰函数是表示该方法不可被复写,构造函数是不会存在复写不复写的问题,也就是说final修饰是无意义的。
如构造函数也不能写返回值修饰一样,就当做是语法规定吧。楼主要是找到好答案也给我说一下哈
回复 使用道具 举报
final修饰的变量,在系统中为宏变量,在编译的时候就已经分配好内存和值,是系统常量,在其他使用的地方都是直接替换的。反编译代码可以看到所有的final变量都变成了常数。所以不论你什么时候初始化类,都是直接替换相减.这样可以吗?
回复 使用道具 举报
杜天伟 发表于 2013-7-13 23:01
这个真的能改变吗?你试过吗?

引用变量是不可以改变  但是引用变量所指向的内容是可以改变的。
回复 使用道具 举报
....如果你要用的常量比较繁琐,会加大编码量。而且修改编码不方便的。其实还有一个好处,就是形象化。比如编码的时候你要用设计一个开启、关闭、等待三个选项的东西。分别用1 、 2、 3代表,你用final  kaiqi=1;这样就很形象。读起来比较方便
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马