疯狂java


您现在的位置: 疯狂软件 >> 新闻资讯 >> 正文

java中成员变量与局部变量区别


 

  

  下面我们一起来看看java中成员变量与局部变量区别,希望本文章能让各位对于java中的成员变量与局部变量的使用会有一个深入的了解哦。

  成员变量:在这个类里定义的私有变量,属于这个类。

  创建以及使用成员变量

  代码如下

  public class Person {

  String name;

  String Sex;

  int age;

  double Height;

  public static void main(String arges[])

  {

  Person p=new Person();

  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对应的转换如下:

  源文件:

  代码如下

  public class Person{

  public static String name="张三";

  public static int age;

  static{

  age=20;

  System.out.println("初始化age");

  }

  public static String address;

  static{

  address="北京市";

  age=34;

  }

  public static void main(String[] args) {

  System.out.println(name);

  System.out.println(age);

  System.out.println(address);

  }

  }

  当java源代码转换成一个class文件后,其转换成类似下面的代码:

  代码如下

  public class Person{

  public static String name;

  public static int age;

  public static String address;

  static{

  name="张三";

  age=20;

  System.out.println("初始化age");

  address="北京市";

  age=34;

  }

  public static void main(String[] args) {

  System.out.println(name);

  System.out.println(age);

  System.out.println(address);

  }

  }

  初始化顺序依据转换后对应的class类成员变量的初始化顺序依次执行,所以所有的静态成员变量都是先声明,后执行赋值的,而且赋值的顺序也是依照源代码对静态成员变量初始化的顺序进行的,注意:定义一个成员变量并直接初始化与在静态代码块中进行初始化是等价的,都是依据它们在源代码中定义的顺序进行的。

  局部变量

  局部变量:在方法体里创建,在方法体外访问不到这个变量。

  局部变量的创建与使用(局部变量必须赋值,成员变量可以不赋值)

  代码如下

  public class Person {

  public static void main(String arges[])

  {

  String name="小黄";

  String Sex="男";

  int age=20;

  double Height=1.70;

  System.out.println("姓名:"+name+",性别"+Sex+",年龄:"+age+",年龄:"+Height);

  }

  }

  看例子

  代码如下

  public class PassTest {

  public static void main(String args[]) {

  StringBuffer a = new StringBuffer("a");

  StringBuffer b = new StringBuffer("b");

  a(a, b);

  System.out.println(a);

  System.out.println(b);

  PassTest p = new PassTest();

  p.c();

  }

  static void a(StringBuffer a, StringBuffer b) {

  a = a.append(b);

  b = a;

  }

  }

  按照局部变量的使用范围来说 结果应该是 a b 但是 实际上输出的确实 ab b 请问为什么?

  传递参数引用的问题吧.引用的话,传递的应该是相同引用的副本.

  a方法里边b=a是改变副本b引用=a,但是对main里的b没有影响.

  a = a.append(b); 主要是a.append(b);这句改变了a引用指向的值,因为main里的a也是指向同一对象,所以输出为ab b

  如果a = a.append(b);改为 a = new StringBuffer("ab"); 将输出a b

  再看下面两段程序:

  程序一:

  代码如下

  public class Variable

  {

  int i;

  void test()

  {

  int j=8;

  if(j==i)

  System.out.println("相等");

  else

  System.out.println("不相等");

  }

  public static void main(String[] args)

  {

  Variable v=new Variable();

  v.test();

  }

  }

  程序二:

  代码如下

  public class Variable

  {

  void test()

  {

  int i;

  int j=8;

  if(j==i)

  System.out.println("相等");

  else

  System.out.println("不相等");

  }

  public static void main(String[] args)

  {

  Variable v=new Variable();

  v.test();

  }

  }

  第一个程序很正常,编译时不会出错。第二个程序编译时会提示如下错误:

  D:Programjavatest>javac Variable.java

  Variable.java:9: 可能尚未初始化变量 i

  if(j==i)

  ^

  1 错误

  之所以会出现这样的错误是因为:成员变量有默认值,(被final修饰且没有static的必须显式赋值),局部变量不会自动赋值

  类体分为两部分。变量定义部分所定义的变量被称为类的成员变量,在方法体中定义的变量和方法的参数都被称为局部变量

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

  局部变量描述的是这个方法体内的属性,而成员变量描述的是这个对象里的属性。

  成员变量可以被public、protected、default、private、static、final修饰符修饰,局部变量只能被final修饰符修饰。

  成员变量在堆里进行创建,局部变量在栈里进行创建。

  局部变量是系统默认值,局部变量没有系统默认值,必须手动赋值