static关键字
1、什么是static
static是静态修饰符,修饰的方法称为静态方法,修饰的属性称为静态属性
2、非静态属性
非静态的属性和方法都是随着对象的创建而加载的,也就是只有当对象存在时,非静态的属性及方法才会存在。
非静态属性演示:
/**
*模拟售票功能
*/
public class Ticket {
//默认的票数
private int ticketCount = 100;
//输出销售出一张票数后的值,ticketCount变量减一
public void sale() {
if(ticketCount>0) {
System.out.println("售票一张,还剩"+(--ticketCount)+"张");
}
}
public static void main(String[] args) {
//创建两个售票窗口
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
//两个售票窗各自销售出一张票
t1.sale();
t2.sale();
}
}
/*输出结果是
售票一张,还剩99张
售票一张,还剩99张
*/
这是因为ticketCount变量只存在于对象中,两个不同的对象只能操作各自的ticketCount变量。如果多个对象想要公用同一个变量或方法时,就需要用到static修饰符修饰的静态属性和方法。
3、静态属性
类中的变量或方法前加上static修饰符,属性将会变为静态属性,其作用是使类中的变量或方法被该类的所有对象所共享,同时变量或方法可以在没有创建对象的情况下来进行调用。
静态属性演示:
public class Ticket {
//默认的票数
private int ticketCount = 100;
//输出销售出一张票数后的值,ticketCount变量减一。加上static修饰符变为静态变量。
public void sale() {
if(ticketCount>0) {
System.out.println("售票一张,还剩"+(--ticketCount)+"张");
}
}
public static void main(String[] args) {
//创建两个售票窗口
Ticket t1 = new Ticket();
Ticket t2 = new Ticket();
//两个售票窗各自销售出一张票
t1.sale();
t2.sale();
}
}
/*输出结果是
售票一张,还剩99张
售票一张,还剩98张
*/
加上static修饰符后ticketCount变量变为共享属性,可以被该类的所有对象使用。因此t1和t2两个对象可以对同一个ticketCount变量进行修改。
4、非静态属性与静态属性的调用
非静态:只能通过对象调用,因为非静态的变量或方法只有在创建对象的时候才会被加载进内存
静态:既可以通过对象调用,也可以通过类名调用,建议使用类名调用(非静态的变量或方法属于对象的,静态的变量或方法属于类的)
演示如下:
//非静态方法
public void sale() {
...
}
//静态方法
public static void show() {
...
}
public static void main(String[] args) {
Ticket t1 = new Ticket();
t1.show();//可以通过对象调用静态方法,但不建议使用
Ticket.show();//用类名调用静态方法
t1.sale();//非静态方法只能通过对象调用
Ticket.sale();//会报错
}
不能在静态的方法中调用非静态的变量或方法,因为非静态的变量或方法只有在创建对象的时候才会被加载进内存。如下所示:
public class Ticket {
//非静态方法
public void sale() {
...
show();//可以非静态的方法中调用静态的属性或方法
}
//静态方法
public static void show() {
...
sale();//不能在静态的方法中调用非静态的属性或方法,该语句会报错
}
}
静态的属性及方法都会随着class文件的加载而加载。也就是类加载,那么静态的属性及方法就加载了。