一些基本概念的区分

1.局部变量和成员变量的区别

区别一:定义的位置不同

定义在类中的变量是成员变量

定义在方法中或者{}语句里面的变量是局部变量

区别二:在内存中的位置不同

成员变量存储在堆内存的对象中

局部变量存储在栈内存的方法中

区别三:声明周期不同

成员变量随着对象的出现而出现在堆中,随着对象的消失而从堆中消失

局部变量随着方法的运行而出现在栈中,随着方法的弹栈而消失

区别四:初始化不同

成员变量因为在堆内存中,所有默认的初始化值

局部变量没有默认的初始化值,必须手动的给其赋值才可以使用。

2.基本类型和引用类型

基本类型作为参数传递时,其实就是将基本类型变量x空间中的值复制了一份传递给调用的方法show(),当在show()方法中x接受到了复制的值,再在show()方法中对x变量进行操作,这时只会影响到show中的x。当show方法执行完成,弹栈后,程序又回到main方法执行,main方法中的x值还是原来的值。

class Demo

{

         public static void main(String[] args)

         {

                   int x = 4;

                   show(x);

                   System.out.println("x="+x);

         }

         public static void show(int x)

         {

                   x = 5;

                  

         }

}

当引用变量作为参数传递时,这时其实是将引用变量空间中的内存地址(引用)复制了一份传递给了show方法的d引用变量。这时会有两个引用同时指向堆中的同一个对象。当执行show方法中的d.x=6时,会根据d所持有的引用找到堆中的对象,并将其x属性的值改为6.show方法弹栈。由于是两个引用指向同一个对象,不管是哪一个引用改变了引用的所指向的对象的中的值,其他引用再次使用都是改变后的值。

class Demo

{

         int x ;

         public static void main(String[] args)

         {

 

                   Demo d = new Demo();

                   d.x = 5;

                   show(d);

                  System.out.println("x="+d.x);

         }

         public static void show(Demo d)

         {

                   d.x = 6;

         }

}

猜你喜欢

转载自blog.csdn.net/qq_37918817/article/details/81638798