在Java語言中,全部的變量在使用前必須聲明。聲明變量的基本格式以下:html
格式說明:type爲Java數據類型。identifier是變量名。可使用逗號隔開來聲明多個同類型變量。如下列出了一些變量的聲明實例。注意有些包含了初始化過程:java
int a, b, c; // 聲明三個int型整數:a、 b、c
int d = 3, e = 4, f = 5; // 聲明三個整數並賦予初值
byte z = 22; // 聲明並初始化 z
String s = "runoob"; // 聲明並初始化字符串 s
double pi = 3.14159; // 聲明瞭雙精度浮點型變量 pi
dom
char x = 'x'; // 聲明變量 x 的值是字符 'x'。
ide
Java語言支持的變量類型有:函數
我們來看個實例:spa
public class Variable{
static int allClicks=0; // 類變量
String str="hello world"; // 實例變量
public void method(){
int i =0; // 局部變量
}
}
.net
咱們先來看下局部變量:code
在如下實例中age是一個局部變量。定義在pupAge()方法中,它的做用域就限制在這個方法中:htm
package com.runoob.test;
public class Test{
public void pupAge(){
int age = 0;
age = age + 7;
System.out.println("小狗的年齡是: " + age);
}
public static void main(String args[]){
Test test = new Test();
test.pupAge();
}
}
對象
以上實例編譯運行結果以下:
小狗的年齡是: 7
在下面的例子中 age 變量沒有初始化,因此在編譯時會出錯:
package com.runoob.test;
public class Test{
public void pupAge(){
int age;
age = age + 7;
System.out.println("小狗的年齡是 : " + age);
}
public static void main(String args[]){
Test test = new Test();
test.pupAge();
}
}
運行結果以下:
Test.java:4:variable number might not have been initialized age = age + 7; ^ 1 error
再來看下實例變量:
上述實例運行結果以下:
$ javac Employee.java $ java Employee 名字 : luyaran 薪水 : 1000.0
再來看下類變量,也就是靜態變量:
運行結果以下:
開發人員平均工資:10000.0
在這裏要注意下,若是其餘類想要訪問該變量,能夠這樣訪問:
Employee.DEPARTMENT。
咱們再來看下靜態變量和實例變量之間的區別:
在程序運行時,它們的區別是:
總之呢,實例變量必須建立對象後才能夠經過這個對象來使用,靜態變量則能夠直接使用類名來引用。例如,對於下面的程序,不管建立多少個實例對象,永遠都只分配了一個 staticInt 變量,而且每建立一個實例對象,這個 staticInt 就會加 1;可是,每建立一個實例對象,就會分配一個 random,便可能分配多個 random ,而且每一個 random 的值都只自加了1次。
public class StaticTest { private static int staticInt = 2; private int random = 2; public StaticTest() { staticInt++; random++; System.out.println("staticInt = "+staticInt+" random = "+random); } public static void main(String[] args) { StaticTest test = new StaticTest(); StaticTest test2 = new StaticTest(); } }
運行結果爲:
staticInt = 3 random = 3 staticInt = 4 random = 3
靜態變量是用來聲明規則的,一旦固定都是用用來引用的,相似社會中的法律,規定好後你只能拿來講。可是也能夠改的,經過從新的聲明法律就行。
java 實例變量在整個類內部是可訪問的,而無論實例變量聲明在類的哪一個位置。好比在下面代碼中,儘管實例變量聲明在類的尾部,在以前方法中仍可訪問
import java.io.*; public class Employee{ public Employee (String empName){ name = empName; } public void setSalary(double empSal){ salary = empSal; } public void printEmp(){ System.out.println("name:" + name); System.out.println("salary:" + salary); } public static void main(String args[]){ Employee empOne = new Employee("RUNOOB"); empOne.setSalary(1000); empOne.printEmp(); System.out.println(empOne.salary); } public String name; private double salary; }
再來看下類變量賦值方法:
public class StaticTest { private static int staticInt = 2; private int random = 2; public StaticTest() { staticInt++; random++; } public static void main(String[] args) { System.out.println("類變量與對象變量的值變化"); StaticTest test = new StaticTest(); System.out.println(" 實例1:staticInt:" + test.staticInt + "----random:" + test.random); StaticTest test2 = new StaticTest(); System.out.println(" 實例2:staticInt:" + test.staticInt + "----random:" + test.random); System.out.println("靜態變量賦值"); System.out.println(" 靜態語句塊起做用:" + A.staticA); A a = new A(); System.out.println(" 構造器起做用:" + a.staticA); a.toChange(); System.out.println(" 靜態方法1起做用:" + A.staticA); a.toChange2(); System.out.println(" 靜態方法2起做用:" + A.staticA); System.out.println("常量賦值"); System.out.println(" 靜態語句賦值:" + B.staticB); } } class A { public static String staticA ="A" ; //靜態語句塊修改值 static{ staticA ="A1"; } //構造器修改值 public A (){ staticA ="A2"; } //靜態方法起做用 public static void toChange(){ staticA ="A3"; } public static void toChange2(){ staticA ="A4"; } } class B { public static final String staticB ; // 聲明與賦值分離 static{ staticB ="B"; } }
而後看下類變量與實例變量之間的區別:類變量可在類中直接使用,實例變量需實例化後才能使用。
public class StaticTest { private static int staticInt = 2; private int random = 2; public static void main(String[] args) { System.out.println(staticInt); StaticTest test = new StaticTest(); System.out.println(test.random); } }
再來看下成員變量,靜態變量,局部變量之間的區別:
|
成員變量 |
局部變量 |
靜態變量 |
定義位置 |
在類中,方法外 |
方法中,或者方法的形式參數 |
在類中,方法外 |
初始化值 |
有默認初始化值 |
無,先定義,賦值後才能使用 |
有默認初始化值 |
調用方式 |
對象調用 |
--- |
對象調用,類名調用 |
存儲位置 |
堆中 |
棧中 |
方法區 |
生命週期 |
與對象共存亡 |
與方法共存亡 |
與類共存亡 |
別名 |
實例變量 |
--- |
類變量 |
類的靜態數據成員值被全部對象共享,任何對象均可以訪問類的靜態數據成員。可是他們使用的是同一個數據,操做的是同一塊內存,不管哪一個對象修改了它,對其餘對象來講,他已經變了。
class A{ static int i; void change(int i1){i=i1;} } public class Test{ public static void main(String args[]){ A.i=10; A a=new A(); A b=new A(); System.out.println(A.i+","+a.i+","+b.i);//10,10,10 a.change(40); System.out.println(A.i+","+a.i+","+b.i);//40,40,40 b.i+=10; System.out.println(A.i+","+a.i+","+b.i);//50,50,50 } }
來解釋下:private static final double PI = 3.14;子類不可用(與類繼承關係) + 非靜態方法不可用(與方法的關係)+ 常量(與變量的關係) + 類型(與其餘類型的關係)。
每次建立一個新對象就會分配一個實例變量,而始終只會分配一個靜態變量。看下面實例感覺下:
public class Test { public static int staticVar=0;//靜態變量,加static關鍵字 public int instanceVar=0;//實例變量 public void VariantTest(){ staticVar++; instanceVar++; System.out.println("staticVar"+staticVar+",instanceVar="+instanceVar); } public static void main(String[] args) { for(int k=0;k<6;k++){ Test p=new Test(); p.VariantTest(); } } }
輸出結果爲:
staticVar1,instanceVar=1 staticVar2,instanceVar=1 staticVar3,instanceVar=1 staticVar4,instanceVar=1 staticVar5,instanceVar=1 staticVar6,instanceVar=1
咱們不能夠從一個static方法內部發出對非static方法的調用。由於非static方法是要與對象關聯在一塊兒的,必須建立一個對象後,才能夠在該對象上進行方法調用,而static方法調用時不須要建立對象,能夠直接調用。也就是說,當一個static方法被調用時,可能尚未建立任何實例對象,若是從一個static方法中發出對非static方法的調用,那個非static方法是關聯到哪一個對象上的呢?這個邏輯沒法成立,因此,一個static方法內部發出對非static方法的調用。來看下面的實例感覺下:
public class Xix { // 靜態成員 public static String string="static成員"; // 普通成員 public String string2="非static成員"; // 靜態方法 public static void method(){ string="sss"; //string2="sss";編譯報錯,由於靜態方法裏面只能調用靜態方法或靜態成員 //method2(); System.out.println("這是static方法,static方法與對象無關"); } // 普通方法 public void method2(){ string ="string1"; string2="string2"; method(); //非靜態方法裏面能夠發出對static方法的調用 System.out.println("這是非static方法,此方法必須和指定的對象關聯起來才起做用"); } public static void main(String[] args) { Xix x=new Xix(); x.method2();// 引用調用普通方法 x.method();// 引用調用靜態方法 } }
運行結果爲:
這是static方法,static方法與對象無關 這是非static方法,此方法必須和指定的對象關聯起來才起做用 這是static方法,static方法與對象無關
package hello; //首先要知道變量應該是賦值之後才能使用的,可是有些沒必要人爲賦值就有默認初始值,可是有些要人爲定義初始值 //因此有些直接使用的並非沒有賦值,而是系統自定義了初始值,因此不會報錯 public class Variable { public String instance = "實例變量"; public static String variable = "靜態變量"; //靜態變量的定義方式 public static String CONST = "靜態常量"; //靜態常量的定義方式 public static void main(String[] args) { String local = "局部變量"; //相似這個就是局部變量,不可用訪問修飾符修飾,沒有默認初始值 System.out.println(local); //局部變量就是在方法或語句塊中的變量 Global global = new Global(); //相似這個就是實例變量,也稱全局變量 System.out.println(global.instance); //實例變量就必須先把類new一個出來才能使用,由於他是在類中,方法外的 System.out.println(variable); //來瞅瞅靜態變量,也叫類變量,靜態變量的訪問方式1(在本身類的時候) System.out.println(Global.variable); //靜態變量的訪問方法2(不在本身類的時候) } } class Global{ public String instance = "實例變量"; //實例變量在一個類的裏面,語句塊的外面 public static String variable = "靜態變量"; Global(){ //在類的內部使用本身的實例變量:要麼老老實實new一個出來,就像上面那個 //第二種方法就是在函數裏面使用實例變量,注意,若是方法是靜態方法參照方法1 System.out.println(instance); System.out.println(variable); } public void Instance() { System.out.println(instance); //靜態變量訪問方法1(在本身類的時候),靜態常量和靜態變量訪問相同 System.out.println(Variable.CONST); } }