static是Java中的一个关键字,单词本身是静态的含义。一个类的成员包括变量、方法、构造方法、代码块和内部类,static可以修饰除了构造方法以外的所有成员。
使用static修饰的成员成为静态成员,是属于某个类的;而不使用static修饰的成员成为实例成员,是属于类的每个对象的
1,实例成员变量存放在堆内存上面 静态成员变量存储在方法区中
public class Person {
/**
* static 修饰的成员变量叫做静态成员变量
* 没有static修饰的成员变量叫做实例成员变量
* 实例成员变量存放在堆内存上面
* 静态成员变量存储在方法区中
*
* 静态成员变量被当前类对象共享
* 实例对象是每个对象独有的
*
* 静态成员变量可以使用对象名.属性名访问
* 推荐使用 类名.属性名 的方式进行访问
* 实力成员变量只能有对象.属性名访问
*
*/
static String firstName;
String lastName;
public void name(){
System.out.println("我叫"+firstName+lastName);
}
}
此时的firstName被static修饰
可以看到当person1修改firstName后person的firstName也随之变化,这是因为static修饰的成员变量和实例成员存储的位置不一样,被static修饰的属性共用一个方法区的属性
2,静态成员推荐使用类名.属性名的方式访问, 实例成员变量只能有对象名.属性名的形式访问

这种只需要创建一个Person.firstName就可以了,如果修改仍然可以用对象.firstName修改
3,static修饰的方法叫做静态成员方法
静态成员方法中只能直接使用静态成员变量(可间接使用实例对象)
静态成员方法推荐使用类名.方法名调用(也可以使用对象名.方法名调用)
静态成员方法不能使用this关键字(如果使用this则使用类名.方法名this则不知道指向哪里)
静态成员方法只能直接调用其他静态成员方法
在构造方法 中,往往不会对静态成员变量进行初始化
4,static代码块
public class Block {
static String firstName;
String lastName;
public void myName(){
System.out.println("我叫"+firstName+lastName);
}
public static void showName(){
System.out.println("show:"+firstName);
}
//普通代码块
{
System.out.println("普通代码块");
}
static {
System.out.println("静态代码块");
}
}
测试输出
public class BlockTest {
public static void main(String[] args) {
Block block = new Block();
Block block1 = new Block();
}
}
输出的结果为:
静态代码块
普通代码块
普通代码块
Process finished with exit code 0
可以看出
普通代码块
每次实例化对象时,都会执行一次全部的普通代码块
一般可以用于初始化实例成员变量
静态代码块
当类的字节码进入内存时执行一次,后续不会再执行了
一般用于初始化静态成员变量