class B
{
int i;
int j = 10;
boolean falg;
public B()
{
System.out.println("以前的值是" + i +""+ j +"" +falg);
int i = 88;
int j = 99;
boolean falg = true;
}
public void show()
{
System.out.println("i =" + i);
System.out.println("j =" + j);
System.out.println("falg =" + falg);
}
}
public class test
{
public static void main(String[] arge)
{
B bb = new B();
bb.show();
}
}
如上所示:我定义了一个类为B,定义了int i ,int j = 10, boolean falg,输出值正确,而我在构造函数中再次将int i ,int j , boolean falg,三个函数定义了一次,而且分别赋其他值,输出却是原来全局变量值,为什么没有报错?作者: 炎星辰 时间: 2014-4-27 20:21
Person p = new Person();
创建一个对象都在内存中做了什么事情?
1:先将硬盘上指定位置的Person.class文件加载进内存。
2:执行main方法时,在栈内存中开辟了main方法的空间(压栈-进栈),然后在main方法的栈区分配了一个变量p。
3:在堆内存中开辟一个实体空间,分配了一个内存首地址值。new
4:在该实体空间中进行属性的空间分配,并进行了默认初始化。
5:对空间中的属性进行显示初始化。
6:进行实体的构造代码块初始化。
7:调用该实体对应的构造函数,进行构造函数初始化。()
8:将首地址赋值给p ,p变量就引用了该实体。(指向了该对象)作者: 爱翚 时间: 2014-4-27 20:31
class B {
int i;
int j = 10;
boolean falg;
public B() {
//以下输出语句中的i和j都是类的成员变量
System.out.println("以前的值是" + i + "" + j + "" + falg);
/*
* 以下定义语句中的i和j都是Test()函数的局部变量
* 这两个i和j和成员变量的i和j不发生冲突,所以编译和执行都是可以通过的。
*/
int i = 88;
int j = 99;
boolean falg = true;
}
public class Test {
public static void main(String[] arge) {
//初始化Test类的对象bb,虽然调用了Test()构造函数,但成员变量中的i和j的并没有发生变化
B bb = new B();
//show()方法中打印的是成员变量中的i和j,所以输出结果仍为0,10,false
bb.show();
}
}作者: 执笔梦 时间: 2014-4-27 21:04 本帖最后由 执笔梦 于 2014-4-27 21:08 编辑
int i;
int j = 10; //在这定义一个变量i=10.
boolean falg;
public B()
{
System.out.println("以前的值是" + i +""+ j +"" +falg);
/* int i = 88; //你在这相当于又重新定义一个局部变量i=88.也是就说你这个i和上面那个i是没有关系的,j原理一样。
int j = 99; */
可见,构造函数是给对象初始化的,所以“以前的值”显示的是构造函数内定义的局部变量的值;调用方法时显示的是类变量的值,因为构造函数中的ij是重新定义的,和类变量的ij没有关系。 作者: 小马初长成 时间: 2014-4-27 22:38
class B
{
int i;//在这里定义的变量属于全局变量
int j = 10;
boolean falg;
public B()
{
System.out.println("以前的值是" + i +""+ j +"" +falg);
int i = 88;//在这里定义的变量是局部变量,而且在你程序中没有使用到这些局部变量
int j = 99;//(因为局部变量不读),所以不会与全局变量产生冲突
boolean falg = true;//如果没有语法上的错误是不会报错了
//所以上的定义的只限于本类中使用
}
public void show()
{
System.out.println("i =" + i);
System.out.println("j =" + j);
System.out.println("falg =" + falg);
}
}
public class Test
{
public static void main(String[] arge)
{
B bb = new B();
bb.show();
}
}