黑马程序员技术交流社区

标题: final问题????? [打印本页]

作者: HM汪磊    时间: 2013-3-13 15:05
标题: final问题?????
本帖最后由 HM汪磊 于 2013-3-13 15:15 编辑

final修饰的变量只能赋值一次,那么下面的程序为什么可以改变PI的值呢????
  1. public class Test  
  2. {
  3.         final double PI;
  4.         Test(double x)
  5.         {
  6.            PI=x;
  7.         }
  8.         final void printPI()
  9.         {
  10.                 System.out.println("PI="+PI);
  11.         }
  12.         public static void main(String[] args)
  13.         {
  14.                 Test x=new Test(3.14);
  15.                 x.printPI();
  16.                 Test y=new Test(3.14159);
  17.                 y.printPI();
  18.         }
  19. }
复制代码

作者: 许鑫星    时间: 2013-3-13 15:08
{:soso_e127:}final修饰成员于是对于同一个实例化对象来说,PI值只能赋值一次,但是你这是在对两个不同的实例化对象的PI进行操作。。。。
作者: 黑马-郑玉元    时间: 2013-3-13 15:09
创建了两个不同的对象,相当于初始化了两次!要是在同一个对象那当然就只能赋值一次!
作者: 张善颖    时间: 2013-3-13 15:13
你这个不是在给变量赋值,而是   通过调用 final void printPI()方法传入参数。
final修饰变量的时候,值不能被更改。

作者: wanggang    时间: 2013-3-13 15:19
没有改变PI的值,因为 Test x=new Test(3.14);和 Test y=new Test(3.14159);   这是两个对象。重要的是final double PI;
而不是final double PI=0;或具体的数值
作者: 罗威    时间: 2013-3-13 22:50
哥们
final double PI;
    Test(double x)
     {
         PI=x;
     }

Test x=new Test(3.14);你这么写就表示你是在对象创建的时候在堆内存划分了一块区域然后,给PI赋值了,那么这个PI在这个对象里面的值终生就是3.14了
Test y=new Test(3.14159);你又new了个对象,那么这个对象又在内存开辟了一块新区域,这两个PI分别在两块区域里面,所以根本就不是同一个PI
作者: 赵亚威    时间: 2013-3-14 12:29
首先无论是新创建一个对象还是创建两个对象 我们都应该看下成员变量的赋值和构造方法的初始化的先后顺序 因为我们new一个对象 首先初始化数据 但你们也知道 一实例化对象 首先调用构造方法 那么这里相当于首先给PI赋值 所以你打印出的值是你调用是传的值 这给创建两个对象没关




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