本文實例分析了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();
pc();
}
static void a(StringBuffer a, StringBuffer b) {
a = a.append(b);
b = a;
}
}
依照局部變數的使用範圍來說結果應該是ab 但是實際上輸出的確實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"); 將會輸出 ab
再看下面兩段程序:
程序一:
複製程式碼如下: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程式設計有幫助。