JavaSE基础语法--static成员

假设我们现在有一个场景,定义一个学生类。

class Student{
    private String name;
    private  int age;
    private int classroom_num;

    public Student(String name, int age, int classroom_num) {
        this.name = name;
        this.age = age;
        this.classroom_num = classroom_num;
    }
}
public class TestDemo {
    public static void main(String[] args) {
        Student student1=new Student("牛1",11,8);
        Student student2=new Student("马2",12,8);
        Student student3=new Student("猪3",13,8);
        System.out.println("--------------------------------------");


    }
    }

定义了三个private权限的成员变量。并且通过构造函数给他们初始化了值。我们看到我们创建的三个同学对象中,他们都是一个班的。但是这样写的代码,却又三份属性。调试看看效果:

JavaSE基础语法--static成员_第1张图片

那么在内存布局中是这样子的:

JavaSE基础语法--static成员_第2张图片

但是其实我们只需要一份这样的数据就可以了。那么怎么做呢,这个时候就需要我们的static关键字了。我们把代码修改一下:

class Student{
    private String name;
    private  int age;
    private static int classroom_num=8;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class TestDemo {
    public static void main(String[] args) {
        Student student1=new Student("牛1",11);
        Student student2=new Student("马2",12);
        Student student3=new Student("猪3",13);
        System.out.println("--------------------------------------");


    }
    }

 这个时候,我们再调试一下:

JavaSE基础语法--static成员_第3张图片

就只有name和age这两个成员变量了。这说明,我们的classroom_num成员变量,在加了static之后就不在堆上了。也不属于这个对象。那么它放了了什么位置呢?它在JVM的方法区内放着。而且只有一份。这种加了static关键字的变量我们称之为 静态成员变量。现在我们可以把成员变量分为两种:

1.静态成员变量(加了static关键字修饰的)

2.非静态成员变量(普通成员变量)

静态成员变量的一个很大特点是它不属于某个对象,是所有对象共享的。那么如何去访问这个静态变量呢?

我们知道静态成员变量不属于对象,也就不在堆上,虽然可以用对象引用去得到。不报错但是会报警告。我们最好通过类名去引用这个静态成员变量,我暂时把classroom_num的权限改为public:

JavaSE基础语法--static成员_第4张图片


 static关键字既然能修饰成员变量,是否能修饰成员方法呢?是可以的。有了static的加入,成员方法也分为两类:

1.静态成员方法/类方法(static 修饰)

2.非静态成员方法

和静态成员变量一样,静态成员方法被static修饰后也不再属于对象。但是可以通过类名来访问:

class Student{
    private String name;
    private  int age;
    public static int classroom_num=8;

    public static void Study(){
        System.out.println("这是个静态成员方法");
    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class TestDemo {
    public static void main(String[] args) {
        Student student1=new Student("牛1",11);
        Student student2=new Student("马2",12);
        Student student3=new Student("猪3",13);
        System.out.println("--------------------------------------");
        System.out.println(Student.classroom_num);
       Student.Study();


    }
    }

输出如下:

JavaSE基础语法--static成员_第5张图片

在静态方法内部是不能直接调用非静态的成员方法。非静态方法一定是依赖对象的引用。因此static关键字,能够让方法不依赖于对象而被调用。普通成员方法内部,是可以使用静态成员方法。总结几个点:

1.在静态方法内部是不能直接调用非静态成员方法。

2.在静态方法内部,不能直接使用非静态的数据成员。

3.静态方法里面是不能使用this的。

 

你可能感兴趣的:(Java,java,开发语言)