static
所解决的问题
这里摘录一下《Java编程思想(第四版)》(《Java核心技术Ⅰ卷/Ⅱ卷》)里关于static关键字的一段原话:(P29)通常来说,当创建类时,就是在描述那个类的对象的外观与行为 。除非用new创建那个对象,否则,实际上并未获得任何对象。执行new来创建对象的时候,数据存储空间才被分配,其方法才供外界调用。有两种情形用上述方法是无法解决的。一种情形是,只想为某特定域分配单一存储空间,而不去考虑究竟要创建多少个对象,甚至根本不需要创建任何对象。另一种情形是,希望某个方法不与包含他的类的任何对象关联在一起。也就是说,即使没有创建对象,也能够调用方法。
简单来说,static的主要目的就是创建独立于具体对象的域变量与方法。
static 的使用
static可以修饰方法,还可以修饰变量、代码块
static所修饰的方法和变量的特点
- 属于当前类所有,与对象无关
- 调用方式:不需要创建对象就能够直接使用,可以通过类名.属性名/类名.方法名()
- 存储空间:存在与方法区中静态区
package org.lanqiao.staticdemo;
public class CountObject {
public static void main(String[] args) {
Person p1 = new Person();
System.out.println("Person类的对象的数量为:" + Person.objNum());
Person p2 = new Person();
System.out.println("Person类的对象的数量为:" + Person.objNum());
Person p3 = new Person("张三" ,20);
System.out.println("Person类的对象的数量为:" + Person.objNum());
System.out.println("Person类的对象的数量为:" + Person.objNum());
System.out.println("Person类的对象的数量为:" + Person.objNum());
}
}
/*
* 统计person类创建对象的个数
*/
class Person{
private String name;
private int age;
static int objNum = 0 ;
public Person() {
objNum++;
}
public Person(String name, int age) {
this.name = name;
this.age = age;
objNum++;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
使用static所修饰的变量是属于当前类所有,是所有对象所共有的。
使用static所修饰的变量是随着类的加载而加载;而我们的成员变量 是随着对象的创建而创建
对于静态的变量的访问方式:类名.属性名
静态变量随着类的加载而创建,所以在Person加载到class区时,在静态区就已经创建了bojNum,当p1要进行访问时,底层实现其实是从class区Person存储的一个静态地址访问到的静态区。