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

 更新时间:2015年01月04日 14:18:18   投稿:shichen2014  
这篇文章主要介绍了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)
                      ^

错误

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

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

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

局部变量描述的是这个方法体内的属性,而成员变量描述的是这个对象里的属性。
成员变量可以被public、protected、default、private、static、final修饰符修饰,局部变量只能被final修饰符修饰。

成员变量在堆里进行创建,局部变量在栈里进行创建。
局部变量是系统默认值,局部变量没有系统默认值,必须手动赋值

希望本文所述对大家的java程序设计有所帮助。

相关文章

  • java实现简单的爬虫之今日头条

    java实现简单的爬虫之今日头条

    最近在学习搜索方面的东西,需要了解网络爬虫方面的知识,虽然有很多开源的强大的爬虫,但本着学习的态度,想到之前在做资讯站的时候需要用到爬虫来获取一些文章,今天刚好有空就研究了一下.在网上看到了一个demo,使用的是Jsoup,我拿过来修改了一下,有需要的朋友可以参考
    2016-11-11
  • springboot-assembly自定义打包全过程

    springboot-assembly自定义打包全过程

    这篇文章主要介绍了springboot-assembly自定义打包全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • JDBC Template基本使用方法详解

    JDBC Template基本使用方法详解

    这篇文章主要介绍了JDBC Template基本使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Java中ArrayList实现原理及基本方法

    Java中ArrayList实现原理及基本方法

    这篇文章主要介绍了Java中ArrayList实现原理及基本方法,ArrayList是开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,擅长随机访问元素,插入和删除较慢,需要的朋友可以参考下
    2023-08-08
  • Tomcat Cannot assign requested address: JVM_Bind 非端口占用冲突

    Tomcat Cannot assign requested address: JVM_Bind 非端口占用冲突

    这篇文章主要介绍了 Tomcat Cannot assign requested address: JVM_Bind 非端口占用冲突的相关资料,需要的朋友可以参考下
    2017-01-01
  • 解决springboot项目上传文件出现临时文件目录为空的问题

    解决springboot项目上传文件出现临时文件目录为空的问题

    这篇文章主要介绍了解决springboot项目上传文件出现临时文件目录为空的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • Spring Boot各类变量的使用小结

    Spring Boot各类变量的使用小结

    这篇文章主要介绍了Spring Boot各类变量的使用小结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-01-01
  • SpringBoot自定义starter实例代码

    SpringBoot自定义starter实例代码

    这篇文章主要给大家介绍了关于SpringBoot自定义starter的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者使用SpringBoot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • 教你用IDEA配置JUnit并进行单元测试

    教你用IDEA配置JUnit并进行单元测试

    今天教各位小伙伴怎么用IDEA配置JUnit并进行单元测试,文中有非常详细的图文介绍及代码示例,对正在学习IDEA的小伙伴有很好的帮助,需要的朋友可以参考下
    2021-05-05
  • SpringCloud微服务之Config知识总结

    SpringCloud微服务之Config知识总结

    今天带大家学习SpringCloud微服务中的Config的相关知识,文中有非常详细的介绍,对正在学习SpringCloud微服务的小伙伴们有很好地帮助,需要的朋友可以参考下
    2021-05-05

最新评论