java以類爲基礎,沒有遊離在類以外單獨存在的變量。因此,c++中的全局變量,在java中應該是不存在的。java中有的是成員變量和成員方法。當成員前以static修飾時,即爲靜態成員變量或靜態成員方法。java
1. 訪問規則c++
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變量,屬於不可改變值的常量,存放在常量區。this