黑马程序员技术交流社区

标题: 为什么是2 [打印本页]

作者: rel4x    时间: 2014-9-29 16:44
标题: 为什么是2
[p=169, null, left]public class test{

[p=169, null, left]   static int i;

[p=169, null, left]   public int test(){

[p=169, null, left]    i++;

[p=169, null, left]     return i;

[p=169, null, left]  }

[p=169, null, left]public static void main(String args[]){

[p=169, null, left] Test test=new Test();

[p=169, null, left]  test.test();

[p=169, null, left]   System.out.println(test.test());

[p=169, null, left]  }

[p=169, null, left]}



作者: 张业婷    时间: 2014-9-29 16:55
因为 i 是静态的属于共享数据,是随着类的加载而加载谁都可以访问它,当你用对象调用方法是调用了两次,值当然是2了!
作者: clevergump    时间: 2014-9-29 17:06
倒数第三行 test.test();使得 i==1, 倒数第二行中的 test.test()使得 i ==2,由于test.test()的返回值就是 i ,所以就输出2了
作者: rel4x    时间: 2014-9-29 20:15
张业婷 发表于 2014-9-29 16:55
因为 i 是静态的属于共享数据,是随着类的加载而加载谁都可以访问它,当你用对象调用方法是调用了两次,值 ...

他不是没有初始值么
作者: rel4x    时间: 2014-9-29 20:16
clevergump 发表于 2014-9-29 17:06
倒数第三行 test.test();使得 i==1, 倒数第二行中的 test.test()使得 i ==2,由于test.test()的返回值就是 i ...

不是很明白。。。
作者: 哈达洋    时间: 2014-9-29 21:22
你的i是成员变量,系统为默认为它初始化,int类型默认初始化为0,引用类型默认为null,boolean为false。

作者: 李天富    时间: 2014-9-29 21:43

  1. public class test
  2. {
  3.    static int i;
  4.    public int test()
  5.            {
  6.                          i++;
  7.                         return i;
  8.                 }
  9.         public static void main(String args[])
  10.         {
  11.                 test test=new test();
  12.                 test.test();
  13.                 System.out.println(test.test());
  14.         }
  15. }
复制代码


我想这才是你的代码吧。成员变量都有默认初始化值,int型默认初始化值是0.代码中有两个test.test()语句(打印语句里那个test.test()也算哦),就是调用了两次test()方法,那自然i的值就是2了。

作者: 2406035442    时间: 2014-9-29 21:47
路过,飘过,走过
作者: 希筱诺    时间: 2014-9-29 22:45
i是共享的
作者: 嘿~~    时间: 2014-9-29 23:37
  1. test.test();//调用一次test()方法,i加一次
  2. System.out.println(test.test());//再一次调用test()方法,i再加一次
  3. 所以打印结果是2
复制代码

作者: 张业婷    时间: 2014-9-30 09:21
静态变量int 型的初始值为0.有初始值哦!谁说没有了?
作者: rel4x    时间: 2014-9-30 10:56
哈达洋 发表于 2014-9-29 21:22
你的i是成员变量,系统为默认为它初始化,int类型默认初始化为0,引用类型默认为null,boolean为false。
...

原来是这样,谢谢 知道了:)
作者: rel4x    时间: 2014-9-30 10:57
张业婷 发表于 2014-9-30 09:21
静态变量int 型的初始值为0.有初始值哦!谁说没有了?

嘿嘿,学的还不是好咯
作者: 张业婷    时间: 2014-9-30 12:18
rel4x 发表于 2014-9-30 10:57
嘿嘿,学的还不是好咯

你调用了两次方法进行了两次i++,而i是静态的,就相当给i加了两次1

作者: 张业婷    时间: 2014-9-30 12:25
张业婷 发表于 2014-9-30 12:18
你调用了两次方法进行了两次i++,而i是静态的,就相当给i加了两次1

test.test();
System.out.println(test.test());
这里出现了两次test.test();就是调用了两次;
public class test
{
   static int i;
   public int test()
           {
                         i++;
                        return i;
                }
        public static void main(String args[])
        {
                test test=new test();
                test.test();
                System.out.println(i);
        }
}
在样在运行一下,一定是1。静态变量存放在静态方法区中不会随着方法的结束而消失!它的生命周期
和类一样长,类什么时候消失它就什么时候消失,所以你上面的代码是间接的给i进行了二次叠加
作者: 张业婷    时间: 2014-9-30 12:30
张业婷 发表于 2014-9-30 12:25
test.test();
System.out.println(test.test());
这里出现了两次test.test();就是调用了两次;

补充一下
System.out.println(test.i);
因为是的类中的要通过实例名或者类名调用一下才可以!
作者: rel4x    时间: 2014-9-30 13:11
张业婷 发表于 2014-9-30 12:30
补充一下
System.out.println(test.i);
因为是的类中的要通过实例名或者类名调用一下才可以! ...

嗯嗯 知道了,多谢了




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