static的英文本义是静态的,在java语法中,static既可以修饰成员变量又可以修饰成员方法。被static修饰的成员变量叫作静态成员变量,被static修饰的方法叫作静态成员方法。需要注意的是,在Java中,静态成员(类成员)不属于某个具体的对象,可以被类的所有对象共享(访问、修改)。
被static修饰的成员,储存在方法区当中,它的生命周期伴随类的一生,即随着类的加载而创建,随着类的卸载而销毁。这里我给大家举个例子。
public class Phone {
private String brand;
private String color;
public int price;
public static String location;//生产地
}
我们创建了一个Phone类,用static修饰location这个成员,手机有各种各样的品牌、颜色、价格。但是一般我们购买的手机都是在中国生产组装的,所以生产地是一个公共的属性,属于一整个类,而不是某一个对象。
我们可以通过类名.成员的方式进行访问。
public class Dome {
public static void main(String[] args) {
System.out.println(Phone.location);
}
}
也可以使用对象的引用去访问静态成员,不推荐。
public class Dome {
public static void main(String[] args) {
System.out.println(Phone.location);
Phone phone = new Phone();
System.out.println(phone.location);
}
}
虽然我们可以通过对象的引用去访问静态成员,但是这里会有一个警告,它提示你使用实例引用访问了静态成员,因为这在语法上虽然可以,但是实际使用过程中可能会产生混淆,给代码阅读者带来不便,也会在编程中产生一些潜在的问题,所以不推荐大家使用实例引用访问。
跟成员一样,被static修饰的方法属于类的方法,也就是静态成员方法,当一个方法是以公共使用为目的的,就可以用static修饰成类方法。
public class Phone {
private String brand;
private String color;
public static int price;
public static String location;//生产地
public static int getPhonePrice(){
return price;
}//获取价格
}
不同的颜色的同一款手机,它的价格是相同的,所以我们可以使用static来修饰getPhonePrice这个方法。
和静态成类似,静态成员方法的访问也可以通过类名.方法名或者对象的引用的方法来访问,当然不推荐使用对象的引用的方法。
public class Dome {
public static void main(String[] args) {
System.out.println(Phone.location);
Phone phone = new Phone();
System.out.println(phone.location);
Phone.getPhonePrice();// 访问静态成员方法
}
}
当然,在静态成员方法中我们也不能调用非静态成员方法,因为非静态成员方法中带有this关键字,静态方法中调用的时候无法传递this参数。
静态成员变量初始化有两种,分别是就地初始化跟静态代码块初始化。
就地初始化指的是在静态成员定义时直接给出初始值
public class Phone {
private String brand;
private String color;
public static int price = 3000;
public static String location = "中国";//生产地
public static int getPhonePrice(){
return price;
}//获取价格
}
如上代码,给price赋值3000,给location赋值中国。我们在Dome中运行一下代码。
public class Dome {
public static void main(String[] args) {
System.out.println(Phone.location);
Phone phone = new Phone();
System.out.println(phone.price);
Phone.getPhonePrice();// 访问静态成员方法
}
}
运行结果如下:
到这里我们基础的static语法就讲解结束了,关于如何通过静态代码块初始化,我将会在代码块的知识中给大家讲解,还有更多关于static关键字的知识,也会再之后娓娓道来。