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程序设计有所帮助。

时间: 2024-12-23 17:28:57

java中成员变量与局部变量区别分析_java的相关文章

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

成员变量与局部变量的区别 1.在类中的位置不同 成员变量:在类中方法外面 局部变量:在方法或者代码块中,或者方法的声明上(即在参数列表中) 2.在内存中的位置不同,可以看看 Java程序内存的简单分析 见 接下来我们再通过一段程序来直观感受下程序运行时JVM的内存情况, package demo; public class Student {     private String name;     private int age;     public void study() {      

java中ArrayList 、LinkList的区别分析_java

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构.      2.对于随机访问get和set,ArrayList优于LinkedList,因为ArrayList可以随机定位,而LinkedList要移动指针一步一步的移动到节点处.(参考数组与链表来思考)     3.对于新增和删除操作add和remove,LinedList比较占优势,只需要对指针进行修改即可,而ArrayList要移动数据来填补被删除的对象的空间. ArrayList和LinkedL

Java中Runnable和Thread的区别分析_Java编程

Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run()方法就可以实现多线程操作了,但是一个类只能继承一个父类,这是此方法的局限, 下面看例子: 复制代码 代码如下: package org.thread.demo; class MyThread extends Thread{ private String name; public MyThread(String name) { super(); this.name = name; } publ

java中Hashtable和HashMap的区别分析_java

1.Hashtable是Dictionary的子类, 复制代码 代码如下:  public class Hashtable<K,V>     extends Dictionary<K,V>     implements Map<K,V>, Cloneable, java.io.Serializable HashMap: 复制代码 代码如下: public class HashMap<K,V>    extends AbstractMap<K,V>

java中instanceof和getClass()的区别分析_java

class A { }  class B extends A { }  Object o1 = new A();  Object o2 = new B();  o1 instanceof A => true  o1 instanceof B => false  o2 instanceof A => true // <================ HERE  o2 instanceof B => true  o1.getClass().equals(A.class) =&g

Java中字符串拼接的一些细节分析_java

工作日忙于项目的逻辑实现,周六有点时间,从书柜里拿出厚厚的英文版Thinking In Java,读到了字符串对象的拼接.参考着这本书做个翻译,加上自己思考的东西,写上这篇文章记录一下. 不可变的String对象 在Java中,String对象是不可变的(Immutable).在代码中,可以创建多个某一个String对象的别名.但是这些别名都是的引用是相同的. 比如s1和s2都是"droidyue.com"对象的别名,别名保存着到真实对象的引用.所以s1 = s2 复制代码 代码如下:

Java中List与数组相互转换实例分析_java

本文实例分析了Java中List与数组相互转换的方法.分享给大家供大家参考.具体如下: 今天写代码遇到一个奇怪的问题,具体代码不贴出了,写一个简化的版本.如下: ArrayList<String> list=new ArrayList<String>(); String strings[]=(String [])list.toArray(); 这样写代码个人觉得应该没什么问题,编译也没有问题.可是具体运行的时候报异常,如下:Exception in thread "mai

JAVA中StringBuffer与String的区别解析_java

看到这个讲解的不错,所以转一下 在java中有3个类来负责字符的操作. 1.Character 是进行单个字符操作的, 2.String 对一串字符进行操作,不可变类. 3.StringBuffer 也是对一串字符进行操作,是可变类. String:    是对象不是原始类型.    为不可变对象,一旦被创建,就不能修改它的值.    对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去.String 是final类,即不能被继承. StringBuffer:   

基于Java多线程notify与notifyall的区别分析_java

当一个线程进入wait之后,就必须等其他线程notify/notifyall,使用notifyall,可以唤醒所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一个.注意,任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码,notifyall只是让处于wait的线程重新拥有锁的争夺权,但是只会有一个获得锁并执行. 那么notify和notifyall在效果上又什么实质区别呢?主要的效果区别是notify用得不好容易导致死锁,