2 zyf4005 zyf4005 于 2016.04.16 19:55 提问

java 此程序为啥有着这种结果呢?求大神们解释下。谢谢

public class AccessProperty
{
static int i = 47; // 定义静态成员变量

public void call() 
    { // 定义成员方法
    System.out.println("调用call()方法");
    for (i = 0; i < 3; i++)
        {
        System.out.print(i + " ");
        if (i == 2)
            {
            System.out.println("\n");
            }
        }
     }

public AccessProperty()

    { // 定义构造方法
   }

public static void main(String[] args) { // 定义主方法
    AccessProperty t1 = new AccessProperty(); // 创建一个对象
    AccessProperty t2 = new AccessProperty(); // 创建另一个对象
    t2.i = 60; // 将类成员变量赋值为60
    // 使用第一个对象调用类成员变量
    System.out.println("第一个实例对象调用变量i的结果:" + t1.i++);
    t1.call(); // 使用第一个对象调用类成员方法
    // 使用第二个对象调用类成员变量
    System.out.println("第二个实例对象调用变量i的结果:" + t2.i);
    t2.call(); // 使用第二个对象调用类成员方法
}

}

问题:
1.其中t1.i++ 是否等价于 t1.i +1;
2. 为啥结果中t2.i=3?
第一个实例对象调用变量i的结果:60
调用call()方法
0 1 2

第二个实例对象调用变量i的结果:3
调用call()方法
0 1 2

2个回答

caozhy
caozhy   Ds   Rxr 2016.04.16 20:09
已采纳

其中t1.i++ 是否等价于 t1.i +1;
对于当前行,是这样的,但是不同于 t1.i +1,这会使得t1.i自己也增加一。相当于 t1.i = t1.i +1

static int i = 47;
因此i是在t1 t2共享的,你调用了call或者t2.i t1.i++等都会导致它被更改。

caozhy
caozhy 回复zyf4005: 问题解决了,麻烦点下我回答右边的采纳,谢谢
一年多之前 回复
zyf4005
zyf4005 好的,明白了,谢谢啊
一年多之前 回复
caozhy
caozhy 回复zyf4005: 是的。但是要注意,此时两个变量i都叫i但是是不同的,为了避免混淆,作为静态变量的i最好用一个别的变量名代替。
一年多之前 回复
zyf4005
zyf4005 是不是因为 for (i = 0; i < 3; i++)中的i 没有声明成这样for(int i=0;i<3;i++),所以i和static int i是一样的,否则就不一样了吧。对吗?
一年多之前 回复
caozhy
caozhy 回复zyf4005: 因为你的for循环用的i也是这个static int i
一年多之前 回复
zyf4005
zyf4005 第二个问题还是不明白。我感觉调用call和 i的值变化没有关系,请指点。
一年多之前 回复
qq_34108945
qq_34108945   2016.04.16 21:15

只是想纠正一下,如果观点不同的话也请忽略。。。
1.其中t1.i++ 是否等价于 t1.i +1; //在此题中t1.i=i;因为是先调用,后自增,不然结果就是61了;
2. 为啥结果中t2.i=3?//原因是调用了call()方法,for循环中将i初始化为0,然后递增到3跳出循环,便就是t2.i=3了
第一个实例对象调用变量i的结果:60
调用call()方法
0 1 2
第二个实例对象调用变量i的结果:3
调用call()方法
0 1 2

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!