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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© HM汪磊 高级黑马   /  2013-3-13 15:05  /  1512 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 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:14

评分

参与人数 1技术分 +1 收起 理由
猫腻 + 1 下次再不编辑好,不给分的啊。.

查看全部评分

6 个回复

倒序浏览
{:soso_e127:}final修饰成员于是对于同一个实例化对象来说,PI值只能赋值一次,但是你这是在对两个不同的实例化对象的PI进行操作。。。。
回复 使用道具 举报
创建了两个不同的对象,相当于初始化了两次!要是在同一个对象那当然就只能赋值一次!
回复 使用道具 举报
你这个不是在给变量赋值,而是   通过调用 final void printPI()方法传入参数。
final修饰变量的时候,值不能被更改。

评分

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

查看全部评分

回复 使用道具 举报
没有改变PI的值,因为 Test x=new Test(3.14);和 Test y=new Test(3.14159);   这是两个对象。重要的是final double PI;
而不是final double PI=0;或具体的数值
回复 使用道具 举报
哥们
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
回复 使用道具 举报
首先无论是新创建一个对象还是创建两个对象 我们都应该看下成员变量的赋值和构造方法的初始化的先后顺序 因为我们new一个对象 首先初始化数据 但你们也知道 一实例化对象 首先调用构造方法 那么这里相当于首先给PI赋值 所以你打印出的值是你调用是传的值 这给创建两个对象没关
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马