java中成员变量与局部变量区别分析
本文实例分析了java中成员变量与局部变量区别。分享给大家供大家参考。具体分析如下:
成员变量:在这个类里定义的私有变量,属于这个类。
创建以及使用成员变量
publicclassPerson{ Stringname; StringSex; intage; doubleHeight; publicstaticvoidmain(Stringarges[]) { Personp=newPerson(); p.name="小黄"; p.Sex="男"; p.age=20; p.Height=1.7; System.out.println("姓名:"+p.name+",性别"+p.Sex+",年龄:"+p.age+",年龄:"+p.Height); } }
成员变量初始化过程
一、类的初始化
对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量。
类的编译决定了类的初始化过程。
编译器生成的class文件主要对定义在源文件中的类进行了如下的更改:
1)先按照静态成员变量的定义顺序在类内部声明成员变量。
2)再按照原java类中对成员变量的初始化顺序进行初始化。
一个java类和编译后的class对应的转换如下:
源文件:
publicclassPerson{ publicstaticStringname="张三"; publicstaticintage; static{ age=20; System.out.println("初始化age"); } publicstaticStringaddress; static{ address="北京市"; age=34; } publicstaticvoidmain(String[]args){ System.out.println(name); System.out.println(age); System.out.println(address); } }
当java源代码转换成一个class文件后,其转换成类似下面的代码:
publicclassPerson{ publicstaticStringname; publicstaticintage; publicstaticStringaddress; static{ name="张三"; age=20; System.out.println("初始化age"); address="北京市"; age=34; } publicstaticvoidmain(String[]args){ System.out.println(name); System.out.println(age); System.out.println(address); } }
初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。
局部变量
局部变量:在方法体里创建,在方法体外访问不到这个变量。
局部变量的创建与使用(局部变量必须赋值,成员变量可以不赋值)
publicclassPerson{ publicstaticvoidmain(Stringarges[]) { Stringname="小黄"; StringSex="男"; intage=20; doubleHeight=1.70; System.out.println("姓名:"+name+",性别"+Sex+",年龄:"+age+",年龄:"+Height); } }
看例子
publicclassPassTest{ publicstaticvoidmain(Stringargs[]){ StringBuffera=newStringBuffer("a"); StringBufferb=newStringBuffer("b"); a(a,b); System.out.println(a); System.out.println(b); PassTestp=newPassTest(); p.c(); } staticvoida(StringBuffera,StringBufferb){ a=a.append(b); b=a; } }
按照局部变量的使用范围来说结果应该是ab但是实际上输出的确实abb请问为什么?
传递参数引用的问题吧.引用的话,传递的应该是相同引用的副本.
a方法里边b=a是改变副本b引用=a,但是对main里的b没有影响.
a=a.append(b);主要是a.append(b);这句改变了a引用指向的值,因为main里的a也是指向同一对象,所以输出为abb
如果a=a.append(b);改为a=newStringBuffer("ab");将输出ab
再看下面两段程序:
程序一:
publicclassVariable { inti; voidtest() { intj=8; if(j==i) System.out.println("相等"); else System.out.println("不相等"); } publicstaticvoidmain(String[]args) { Variablev=newVariable(); v.test(); } }
程序二:
publicclassVariable { voidtest() { inti; intj=8; if(j==i) System.out.println("相等"); else System.out.println("不相等"); } publicstaticvoidmain(String[]args) { Variablev=newVariable(); v.test(); } }
第一个程序很正常,编译时不会出错。第二个程序编译时会提示如下错误:
D:Programjavatest>javacVariable.java
Variable.java:9:可能尚未初始化变量i
if(j==i)
^
错误
之所以会出现这样的错误是因为:成员变量有默认值,(被final修饰且没有static的必须显式赋值),局部变量不会自动赋值
类体分为两部分。变量定义部分所定义的变量被称为类的成员变量,在方法体中定义的变量和方法的参数都被称为局部变量
局部变量和成员变量的区别
局部变量描述的是这个方法体内的属性,而成员变量描述的是这个对象里的属性。
成员变量可以被public、protected、default、private、static、final修饰符修饰,局部变量只能被final修饰符修饰。
成员变量在堆里进行创建,局部变量在栈里进行创建。
局部变量是系统默认值,局部变量没有系统默认值,必须手动赋值
希望本文所述对大家的java程序设计有所帮助。