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变量,属于不可改变值的常量,存放在常量区。