static 是一个常用关键字,用于修饰类的成员(变量、方法、内部类等)
1. 静态变量
静态变量(类变量)是属于类的,而不是某个特定的实例。所有实例共享同一个静态变量。
可以使用类名直接访问静态变量。(建议直接用类名直接访问)。
静态变量赋值之前是默认值;
public class Test {
public static void main(String[] args) {
People p = new People();
p.age = 30;
p.name = new String("chen");
System.out.println(People.name);//chen
System.out.println(People.age);//30
//可以使用类名直接访问静态成员变量
}
}
2. 静态方法
静态方法(类方法)可以直接通过类名调用(建议直接用类名直接访问),而不需要创建类的实例。静态方法不能访问非静态成员变量。
注意:静态方法中不可以使用this关键字,this代指的是调用该方法的实例对象,而静态方法是可以通过类名直接调用的。
public class People {
public int age;
static String name;
public static void say()
{
System.out.println("my name is " + name);
//System.out.println("my age is " + age);报错,静态方法不能访问非静态成员变量
}
}
public class Test {
public static void main(String[] args) {
People p = new People();
p.age = 30;
p.name = "chen";
p.say();//my name is chen
People.say();//my name is chen
}
}
3. 静态代码块
格式:static { }
特点:类加载时自动执行,由于类只会加载一次,所以静态代码块也只会执行一次。
作用:完成类的初始化,即对静态变量的初始化。
public class People {
public int age;
public static int num ;
static {
num ++;
//静态代码块中不能含有非静态变量
}
}
public class Test {
public static void main(String[] args) {
People p = new People();
p.age = 30;
System.out.println(People.num);//1
System.out.println(People.num);//1
System.out.println(People.num);//1
}
}
拓展:
实例态代码块
格式:{ }
特点:每次创建对象时,执行实例代码块,并在构造器前执行。
作用:和构造器一样,都是用来完成对象的初始化的。
public class People {
public int age;
public static int num ;
public People(){
System.out.println("构造器执行,第 " + num + "次创建对象");
}
{
num++;
}
}
public class Test {
public static void main(String[] args) {
People p1 = new People();//构造器执行,第 1次创建对象
People p2 = new People();//构造器执行,第 2次创建对象
People p3 = new People();//构造器执行,第 3次创建对象
People p4 = new People();//构造器执行,第 4次创建对象
}
}
4. 静态内部类
静态内部类可以独立于外部类实例使用。
public class People {
public int age = 3;
static String name = "1334";
public static class inner//成员内部类,成员内部类调用外部类方法,属性和外部类方法权限相同
{
public void print()
{
//静态内部类只能访问外部类的静态成员变量
//System.out.println(age);报错
System.out.println(name);
}
}
}
public class Test {
public static void main(String[] args) {
People.inner in = new People.inner();//可直接创建静态内部类
}
}
总结
静态变量:类的所有实例共享同一个变量。
静态方法:可以直接通过类名调用,不能访问非静态成员。
静态代码块:在类加载时执行一次性的初始化代码。
静态内部类:可以独立于外部类实例使用。