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