java以類為基礎,沒有游離在類之外單獨存在的變量。所以,c++中的全局變量,在java中應該是不存在的。java中有的是成員變量和成員方法。當成員前以static修飾時,即為靜態成員變量或靜態成員方法。
1. 訪問規則
- static成員變量,可被static或非static方法訪問。
- static成員變量,僅可通過類名訪問,不可通過類實例訪問。
- static成員方法,僅可訪問static成員變量,無法訪問非static成員變量。
- static成員方法,僅可通過類名訪問,不可通過類實例訪問。
- 非static成員方法,僅可通過類實例訪問,不可通過類名訪問。
- static成員變量和static成員方法,沒有this方法。即,不可以通過this.age或this.setAge()來訪問。
package com.javaPractise; public class TestStatic { public String name; public static int age; public static String staticField = "靜態成員變量"; public TestStatic(){ System.out.println("無參構造函數Constructor of TestStatic"); } public TestStatic(String myName, int myAge){ this.name = myName; age = myAge; System.out.println("有參構造函數Constructor of TestStatic"); } public static void setStaticField(String value){ staticField = value; System.out.println("staticField: " + staticField); } public static void printStaticField(){ System.out.println("staticField: " + staticField); } public void printNameAndAge(){ //非靜態成員方法可訪問 靜態 和 非靜態 成員變量 System.out.println("name: " + name + " age: " + age); } public static void setAge(int n){ //靜態成員方法,僅可訪問靜態成員變量,不可訪問普通成員變量 age = n; // name = "abc"; } public static void printAge(){
System.out.println("age: " + age); } }
import com.javaPractise.TestStatic; public class Main { public static void main(String[] args){ System.out.println("age of TestStatic"); System.out.println(TestStatic.age); //靜態成員可通過類名直接調用 TestStatic.printAge(); //靜態方法可通過類名直接調用 //TestStatic.printNameAndAge(); //非靜態方法不可通過類名直接調用 TestStatic.printStaticField(); TestStatic.setStaticField("haha"); TestStatic testStatic1 = new TestStatic(); System.out.println("name and age of testStatic1"); testStatic1.printNameAndAge(); //非靜態成員僅通過類實例調用 testStatic1.printAge(); //靜態方法可通過類實例調用 } }
2. 存放區域
static變量,存放在靜態存儲區;普通成員變量,存放在棧區;new出來的實例,存放在堆區;static final變量,屬於不可改變值的常量,存放在常量區。