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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. class Demo
  2. {
  3.         static int i=4;
  4.         Demo()
  5.         {
  6.                 int i=6;        //③
  7.                 int m=i;         //特意加了一项m 来检测后面的i=5是否覆盖了 i=6
  8.                 i=5;         //①
  9.                 System.out.println(m);//结果显示为6  说明i=5并没有覆盖掉i=6
  10.         }
  11.         public static void main(String args[])
  12.         {
  13.                 Demo a=new Demo();
  14.                 System.out.println(i);
  15.         }
  16. }
  17. //为什么最后i的结果是4 而不是5.  ①中的i并没重新创建啊 这么说应该是默认的 this.i 那么久直接指向了静态i 这样的
  18. //静态i=4就应该被①覆盖掉 最后主函数的输出应该是  5 啊!!!可是还是4  ①这个位置的 i 不伦不类的搞得我真心不懂
  19. //麻烦各位看看  到底①位置的 i 是指向的哪里(不可能是单独存在的新 i 吧,连int都没有 如果是个新 i 没有Int 编译肯定会报错)
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄炳期 + 1

查看全部评分

8 个回复

倒序浏览
  1. Demo()
  2.         {
  3.                 int i=6;        //③
  4.                 int m=i;         //特意加了一项m 来检测后面的i=5是否覆盖了 i=6
  5.                 i=5;         //①
  6.                 System.out.println(m);//结果显示为6  说明i=5并没有覆盖掉i=6
  7.         }
复制代码
先说你代码中注释的问题, 你加了一项m=i;将i赋给了m然后打印出m的值,后面再给i赋值,跟m有关系吗,实际上i=5已经覆盖了i=6,你把打印m换成打印i就看出来了,
然后再说main方法打印的结果为4,main方法调用的是成员位置上的静态变量i,跟你构造函数中的i没有一点关系,构造方法中的i在你创建完对象就消失了,

评分

参与人数 1技术分 +1 收起 理由
FFF + 1 赞一个!

查看全部评分

回复 使用道具 举报
zuiaichiyu 发表于 2013-11-13 21:26
先说你代码中注释的问题, 你加了一项m=i;将i赋给了m然后打印出m的值,后面再给i赋值,跟m有关系吗,实际上 ...

我主要想知道的是  i=5的时候 这个i 是成员变量还是局部静态的 i  结果的显示英国是 I=5的i指代的是局部变量
因为如果是这种情况
int i=6改成  i=6 然后其他的不变 最后 e的结果就是5  
这个情况我倒是想得通 因为都是指向同一个静态i  i =6 和 i=5因为没有加new说明就是指代的 this.i=6和this.i=5
从这点来看我就想不通题干的代码里 同样 i=5的时候 没有指定 new  为什么不是指代的this.i
回复 使用道具 举报
何超 发表于 2013-11-13 21:50
我主要想知道的是  i=5的时候 这个i 是成员变量还是局部静态的 i  结果的显示英国是 I=5的i指代的是局部 ...

你在构造函数中定义i的时候  int i=6,这时候i是局部变量  如果直接写成 i=6 那么i改的是成员变量的值,
使用new创建对象的时候,构造代码块进入栈内存,int i= 6,这时候i是局部变量,存在栈内存中,随着构造方法的结束而结束,而静态成员变量存在于方法区中,随着类的加载而加载,但是如果不加int  ,i指向的是成员变量,new创建对象的时候 就改变了方法区中这个变量的值
回复 使用道具 举报
Demo()
        {
                int i=6;        //③
                int m=i;         //特意加了一项m 来检测后面的i=5是否覆盖了 i=6
                i=5;         //①
                System.out.println(m);//结果显示为6  说明i=5并没有覆盖掉i=6
        }
因为你在构造方法里重新声明了一个int类型的i变量。i=5指向的是构造函数中的i。 你如果把int i=6;去掉你再打印试试

评分

参与人数 1黑马币 +3 收起 理由
FFF + 3 你技术分太多了。加你点金币。以表鼓励!.

查看全部评分

回复 使用道具 举报
其实你的问题,主要是两个概念没有弄清楚。
1.关于局部变量和成员变量。
你在构造方法里面又从新创建了一个"局部变量i",这个“局部变量i”跟“成员变量i”不冲突,如果方法里面有了相同的变量,那么就不会去成员里面找变量了,也就是说,你无论在构造方法里面怎么操作i,都不会改变"成员变量i"
2.基本数据类型和引用数据类型。
①引用数据类型的变量存放的是这个对象的地址,举个例子
                ArrayList<String> a=new ArrayList();
                ArrayList<String> b=a;
                b.add("abc");
                System.out.println(a.get(0));
                System.out.println(b.get(0));
两个的输出都会是abc
因为a,b两个变量存放的都是地址,而且a,b指向的是同一地址,所以尽管改动了a,但是b也会改动
②而基本数据类型存放的就是个数值,不是地址,
                int c=6;
                int d=c;
                d=5;
                System.out.println(c);//输出5
                System.out.println(d);//输出6
当d=c时,其实是把c的值6给了d,d跟c以后再无瓜葛,无论d做怎样的改变,c永远都是6。

评分

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

查看全部评分

回复 使用道具 举报
何超 中级黑马 2013-11-14 00:10:57
7#
spiderman 发表于 2013-11-13 22:26
其实你的问题,主要是两个概念没有弄清楚。
1.关于局部变量和成员变量。
你在构造方法里面又从新创建了一个 ...

:LC是6还是5···你的程序标注的是5  结论说的是6····
回复 使用道具 举报
何超 发表于 2013-11-14 00:10
C是6还是5···你的程序标注的是5  结论说的是6····

一着急写反了,c是6,d是5。反正我都给你写好了,一复制,自己一调试就看出来了啊,没必要问我啊
回复 使用道具 举报
何超 中级黑马 2013-11-14 10:56:32
9#
spiderman 发表于 2013-11-14 09:25
一着急写反了,c是6,d是5。反正我都给你写好了,一复制,自己一调试就看出来了啊,没必要问我啊 ...

= = 我调试出来了···当时脑子里都在想那个问题去了··结果就顺手给回复了·······
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马