1、Java中被static修饰的成员,称为静态成员或者类成员。它属于整个类所有,而不是某个对象所有。
系统在第一次使用该类时,就会为其分配内存空间,直到该类被卸载才进行资源回收。
2、静态成员的访问方式:可以使用类名直接访问;也可以使用对象名进行访问。
package com.imooc;
public class HelloWorld {
static String hobby="imooc";
public static void main(String[] args) {
System.out.println("通过类名访问hobby:"+HelloWorld.hobby);
HelloWorld hello=new HelloWorld();
System.out.println("通过对象名访问hobby:"+hello.hobby);
hello.hobby="爱慕课";
System.out.println("通过类名访问hobby:"+HelloWorld.hobby);
}
}
运行结果:
通过类名访问hobby:imooc
通过对象名访问hobby:imooc
通过类名访问hobby:爱慕课
3、静态方法:用static修饰的方法,称为静态方法或类方法。
package com.imooc;
public class HelloWorld {
//使用static关键字声明静态方法
public static void print(){
System.out.println("欢迎您:慕课网!");
}
public static void main(String[] args) {
//直接使用类名调用静态方法
HelloWorld.print();
//也可以通过对象名调用,更推荐使用类名调用。
HelloWorld demo=new HelloWorld();
demo.print();
}
}
运行结果:
欢迎您:慕课网!
欢迎您:慕课网!
注意点:
(1)静态方法可以直接调用同类中的静态成员,但是不能直接调用非静态成员;
package com.imooc;
public class HelloWorld {
static String hobby="imooc";
String name="爱慕课";
public static void print(){
System.out.println("爱好:"+hobby+"!");
//编译不通过,会在这行有红色叉号
System.out.println("欢迎您:"+name+"!");
}
}
(2)如果要在静态方法中调用非静态变量,可以通过创建类的对象,通过对象来访问非静态变量。
package com.imooc;
public class HelloWorld {
static String hobby="imooc";
String name="爱慕课";
public static void print(){
HelloWorld hello=new HelloWorld();
System.out.println("爱好:"+hobby+"!");
//通过对象实现,在静态方法中调用非静态变量。
System.out.println("欢迎您:"+hello.name+"!");
}
public static void main(String[] args) {
HelloWorld.print();
}
}
(3)普通成员方法,可以直接访问同类中的静态和非静态变量。
static String hobby="imooc";
String name="爱慕课";
public void print(){
System.out.println("爱好:"+hobby+"!");
System.out.println("欢迎您:"+name+"!");
}
(4)静态方法中,不能直接调用非静态的方法,需要通过对象来访问非静态方法。
4、static之静态初始化块
在类的声明中,可以包含多个初始化块,当创建实例时,会依次执行这些代码块。如果使用static修饰,就称之为静态初始化块。
静态初始化块只能在类加载时执行,且只会执行一次,同时静态初始化块只能给静态变量赋值,不能初始化普通的成员变量。
package com.imooc;
public class HelloWorld {
int num1;
int num2;
static int num3;
public HelloWorld(){
num1=91;
System.out.println("通过构造方法为变量num1赋值");
}
{
num2=82;
System.out.println("通过初始化块为变量num2赋值");
}
static{
num3=73;
System.out.println("通过静态初始化块为静态变量num3赋值");
}
public static void main(String[] args) {
HelloWorld hello=new HelloWorld();
System.out.println("num1:"+hello.num1);
System.out.println("num2:"+hello.num2);
System.out.println("num3:"+num3);
HelloWorld hello2=new HelloWorld();
}
}
执行结果:
通过静态初始化块为静态变量num3赋值
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
num1:91
num2:82
num3:73
通过初始化块为变量num2赋值
通过构造方法为变量num1赋值
由结果可以得出以下结论:程序运行时静态初始化块最先被执行,然后执行普通的初始化块,最后执行构造方法。
由于静态初始化块只在类加载时执行一次,所以在创建对象hello2时,并未执行静态初始化块。