1.static关键字可以修饰方法、成员变量、代码块。
(1)若static关键字修饰成员变量,则该成员变量可以给所有其所属对象共享并且该属性会随着类加载而加载(在对象实例化之前就已经初始化完成了)。原理:该成员变量随着类文件一起加载到java虚拟机(以下简称jvm)运行时数据区中的方法区,若给它赋值,则方法区中的该成员变量可以给所有该类的对象获得。那么以下代码的输出结果是啥?
class Demo01
{
public static void main(String[] args)
{
Student student = new Student();
student.setName("张三");
System.out.println(student.getName());
Student student2 = new Student();
System.out.println(student2.getName());
}
}
class Student
{
private static String name;
private int age;
public int getAge(){
return this.age;
}
public void setAge(){
this.age = age;
}
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
}
答案:。可以看见上述代码中的student2的name属性并没有手动给它赋值,但是输出结果也为“张三”,说明用static声明的变量可以被对象共享。
(2)若static修饰方法,则该方法可以直接使用类名.方法名 调用。同理,静态方法也会随着jvm加载类文件而一起加载到方法区中。示例代码如下:
public class Demo {
public static void main(String[] args)
{
shopping.shopCart();
}
}
class shopping{
public static void shopCart(){
System.out.println("我是一个静态方法");
}
}
输出结果为:。由此可见,静态方法不需要创建对象也可以直接调用。
需要注意的是:如果一个类中所有的方法都是静态方法,那最好将这个类的构造函数用private关键字修饰,以防止他人在使用时去创建对象
(3)静态代码块:
static {
System.out.println("我是静态代码块");
}
在同一类里面,首先静态代码块在类加载的时候就执行了,而且只执行一次,不论你是否new了对象,而构造代码块和构造方法是在每次创建对象时都会被调用,并且构造代码块的执行次序优先于类构造函数