按照书里面的代码写的,for这里,带数据类型和不带数据类型,输出结果不一样是为什么
public class CopyOfTransferProperty {
static int i = 47; //定义静态成员变量
public void call() {
System.out.println("调用call()方法");
for(int i = 0;i < 3;i++) {
System.out.print(i + " ");
if(i == 2) {
System.out.println("\n");
}
}
}
public CopyOfTransferProperty() {
}
public static void main(String args[]) {
CopyOfTransferProperty t1 = new CopyOfTransferProperty();
CopyOfTransferProperty t2 = new CopyOfTransferProperty();
t2.i = 60;
System.out.println("第一个对象调用类成员变量i的结果是:" + t1.i++);
t1.call();
System.out.println("第二个对象调用类成员变量i的结果是:" + t2.i);
t2.call();
}
}
public class CopyOfTransferProperty {
static int j = 47; //定义静态成员变量
public void call() {
System.out.println("调用call()方法");
for(j = 0;j < 3;j++) {
System.out.print(j + " ");
if(j == 2) {
System.out.println("\n");
}
}
}
public CopyOfTransferProperty() {
}
public static void main(String args[]) {
CopyOfTransferProperty t1 = new CopyOfTransferProperty();
CopyOfTransferProperty t2 = new CopyOfTransferProperty();
t2.j = 60;
System.out.println("第一个对象调用类成员变量j的结果是:" + t1.j++);
t1.call();
System.out.println("第二个对象调用类成员变量j的结果是:" + t2.j);
t2.call();
}
}
第一段代码输出结果
第一个对象调用类成员变量i的结果是:60
调用call()方法
0 1 2
第二个对象调用类成员变量i的结果是:61
调用call()方法
0 1 2
第二段代码输出结果
第一个对象调用类成员变量j的结果是:60
调用call()方法
0 1 2
第二个对象调用类成员变量j的结果是:3
调用call()方法
0 1 2
问题:为什么会造成输出结果不同?
在第一段代码中 对象调用类成员变量i的结果是60和61
因为你在第一次打印时打印前t2.i=60,在输出t1.i++,这个时候会输出60 但是下一次输出时会得到61 i++是先输出,在赋值;++i才是先赋值,在输出
当你实例CopyOfTransferProperty类,调用其中的call函数时,for循环根据条件只会输出0 1 2
在第二段代码中,你也是先t2.j=60,输出t1.j++,所以第一次还是会输出60;当你第二次输出t2.j时,因为调用了t1.call()函数,for循环引用的是类中的j所以,导致执行完call函数之后,j=3
而call函数中的打印,因为j初始化时都是j=0;所以打印都是 0 1 2
在这两段代码中的知识点,是变量作用域,在for循环中,当你初始化的变量,当他在同一级没有找到定义,他就会一级一级的向上查找,直到找到为止,如果最后没有找到这个定义,他就会抛出错误,当前变量未定义
for是一个块
你在块里重新写int i,那么就定义了一个局部变量i,它与上面的i=47不是一个i
而如果你不写int,直接用i,就把全局变量给改了
因为第一个的for循环写了int,表示在for循环创建了 一个局部变量,它的作用范围只是for函数,所以for循环改变的并不是成员变量的值,而是for循环的局部变量
而第二个代码,for循环改变的就是类的成员变量了
int i;char c;float b等等这些都是自变量的声明,声明表示从此刻开始,只能在自变量声明的{}内使用,超过这个{}的都不算。除了全局变量。你可以去搜索全局变量和局部变量的关系,还有静态变量等等
就近原则