成员变量
class Person{
public String name="小米";
}
上面代码中,name就是Person类的成员变量,它会随着对象的创建,存储在堆内存中。
Person p = new Person();
局部变量
public void test(){
int i=0;
}
上面代码中i就是局部变量,它会随着方法的调用,存储在栈内存。
静态变量
当成员变量和局部加上static关键字后,就变成了静态变量,这时候它随着类的加载,存储在堆中(JDK8之后方法区被原空间替代,静态变量和常量池都转移到堆中了)。静态变量被类的所有对象共享,即使没有类实例时你也可以通过类来访问它。
public class Test {
public static void main(String[] args) {
Person p1=new Person();
Person p2=new Person();
System.out.println(Person.i);//控制台输出100;
System.out.println(p1.i);//控制台输出100;
System.out.println(p2.i);//控制台输出100;
}
}
class Person{
public static int i=100;
}
如果我们更改这个实例变量的值,那么所有使用这个实例变量的值都会更改。
public class Test {
public static void main(String[] args) {
Person p1=new Person();
Person p2=new Person();
System.out.println(Person.i);
Person.i=101;
System.out.println(p1.i);
System.out.println(p2.i);
}
}
class Person{
public static int i=100;
}
因为他们指向的是同一块存储空间,所以该变量的值有任何改动,其余使用该变量的地方也会跟着变化。
静态方法
除了静态变量以外还存在着静态方法,静态方法和静态变量差不多,都可以被类调用,也可以被类的对象调用。
class Incrementable {
static void increment() {
StaticTest.i++;
}
}
上例中,Incrementable 的 increment() 方法通过 ++ 运算符将静态数据 i 加 1。我们依然可以先实例化对象再调用该方法。 代码示例:
Incrementable sf = new Incrementable();
sf.increment();
当然了,首选的方法是直接通过类来调用它。代码示例:
Incrementable.increment();