成员变量,局部变量,方法和"static"关键字

579 阅读2分钟

成员变量

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++; 
    }
}

上例中,Incrementableincrement() 方法通过 ++ 运算符将静态数据 i 加 1。我们依然可以先实例化对象再调用该方法。 代码示例:

Incrementable sf = new Incrementable();
sf.increment();

当然了,首选的方法是直接通过类来调用它。代码示例:

Incrementable.increment();