static关键字的使用
static是用来修饰什么的?
static可以用来修饰属性、方法、代码块
修饰属性:
按照是否使用static关键字修饰可以分为静态属性和非静态属性
public class Student {
String name;
int age;
}
public static void main(String[] args) {
Student student = new Student();
student.name = "张三";
student.age = 10;
}
关于非静态属性的用法,无非new一个对象,通过对象.属性的方式来调用
而静态变量,它是被static修饰的,它是随着类的加载而加载的,要早于对象的创建
类只会加载一次,所以静态变量也只有一份。静态变量是被共享的。
同样是刚才这个例子:
public class Student {
String name;
int age;
static int number = 10;
public static void main(String[] args) {
Student student = new Student();
Student student2 = new Student();
System.out.println(student.number);
System.out.println(student2.number);
student.number = 20;
System.out.println(Student.number);
System.out.println(student2.number);
}
}
在Student这个类中声明了一个静态变量number,创建了2个学生对象实例,分别调用number属性,会发现输出结果是一样的,都是10;这就印证了上面所说,静态变量在类中是共享的,下面再用student对这个number做了修改,再输出一遍,student2的number还会是10吗?显然不会,因为已经通过student对这个共用的属性进行了修改。
修饰方法
同样的,当static修饰方法时,也可以分为静态方法和非静态方法,对于方法这一块,需要注意的点相对来说要多一些。
String name;
int age;
static int number = 10;
private static void sing(){
System.out.println("he is singing");
System.out.println(name); // 这里将会报错,编译不通过
System.out.println(number);
}
- 第一点:上述代码中,第一句输出name将会报错,可以归纳出静态方法中可以调用静态属性,但不可以调用非静态属性,那么对于方法是否也同样如此,代码出真知!!
public class Student {
String name;
int age;
static int number = 10;
private static void sing(){
System.out.println("he is singing");
System.out.println(name);
System.out.println(number);
}
private void jump(){
System.out.println("he is jumping");
}
private static void run(){
jump(); // 报错,编译不通过
sing();
}
}
在调用jump()方法时,再次报错,因此得出第二条结论
- 第二点:静态方法中可以调用静态方法,但不可以调用非静态方法
那么非静态方法中可以调用些什么呢?通过上图得出结论
- 第三点:非静态方法中可以调用静态属性、非静态属性、静态方法、非静态方法