类就像一个模板,(摸具) ,可以根据模板弄出一个个对象。
static
静态的内容,我们可以理解为是属于这个类的,也可以理解为是所有对象共享的内容。
我们通过使用static关键字来声明一个变量或一个方法为静态的,一旦被声明为静态,那么通过这个类创建的所有对象,操作的都是同一个目标,也就是说,对象再多,也只有这一个静态的变量或方法。即 静态变量或静态方法是属于类的。
一个对象改变了静态变量的值,那么其他的对象读取的就是被改变的值。即共享的。
静态方法是属于类的,而不是属于某个对象的
静态变量属于类的,无法调用成员变量
成员变量
成员变量是某个具体对象拥有的属性,就像小明这个具体的人的名字才叫小明。
而静态变量是类具有的,并不是具体对象,肯定没办法访问到的。
同样的,在静态方法中,无法使用this关键字,因为this关键字代表的是当前的对象本身。
但是静态方法是可以访问到静态变量的。
静态变量是在什么时候初始化的?
实际上是将.class 文件丢给JVM去执行的,而每一个.class 文件其实就是我们编写的一个类,我们在java中使用一个类前,JVM并不会在一开始就去加载它,而是在需要使用时才会去加载(优化)
一般遇到以下情况时才会会加载类:
- 访问类的静态变量,或者为静态变量赋值
- new 创建类的实例(隐式加载)
- 调用类的静态方法
- 子类初始化时
- ......
所有被标记为静态的内容,会在类刚加载的时候就分配,而不是在对象创建的时候分配,所以说静态内容一定会在第一个对象初始化之前完成加载
public class Person {
String name = test();
int age;
String sex;
{
System.out.println("我是普通代码块");
}
Person() {
System.out.println("我是构造方法");
}
String test() {
System.out.println("我是成员变量初始化");
return "小明";
}
static String info = init(); //init静态方法的返回值作为变量的初始化,便于观察
static {
System.out.println("我是静态代码块");
}
static String init() {
System.out.println("我是静态变量初始化");
return "test";
}
}
先将静态内容初始化之后,才得到值的.
如果压根没有使用这个类,也就不会被初始化.