假设我们现在有一个场景,定义一个学生类。
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权限的成员变量。并且通过构造函数给他们初始化了值。我们看到我们创建的三个同学对象中,他们都是一个班的。但是这样写的代码,却又三份属性。调试看看效果:
那么在内存布局中是这样子的:
但是其实我们只需要一份这样的数据就可以了。那么怎么做呢,这个时候就需要我们的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("--------------------------------------");
}
}
这个时候,我们再调试一下:
就只有name和age这两个成员变量了。这说明,我们的classroom_num成员变量,在加了static之后就不在堆上了。也不属于这个对象。那么它放了了什么位置呢?它在JVM的方法区内放着。而且只有一份。这种加了static关键字的变量我们称之为 静态成员变量。现在我们可以把成员变量分为两种:
1.静态成员变量(加了static关键字修饰的)
2.非静态成员变量(普通成员变量)
静态成员变量的一个很大特点是它不属于某个对象,是所有对象共享的。那么如何去访问这个静态变量呢?
我们知道静态成员变量不属于对象,也就不在堆上,虽然可以用对象引用去得到。不报错但是会报警告。我们最好通过类名去引用这个静态成员变量,我暂时把classroom_num的权限改为public:
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();
}
}
输出如下:
在静态方法内部是不能直接调用非静态的成员方法。非静态方法一定是依赖对象的引用。因此static关键字,能够让方法不依赖于对象而被调用。普通成员方法内部,是可以使用静态成员方法。总结几个点:
1.在静态方法内部是不能直接调用非静态成员方法。
2.在静态方法内部,不能直接使用非静态的数据成员。
3.静态方法里面是不能使用this的。