static关键字:
1.概念:
被该类的所有对象共享使用,不依赖于某个具体的对象,和对象无关,依赖于类,在内存中唯一只有一份2.类的加载过程:
第一次使用new创建Student类的对象时,首先检查.class文件,是否被加载到方法区中,如果没有,把
Student类的.class文件加载到方法区中(此时还没有对象),如果.class文件中有static静态修饰的内容,
会把static静态修饰的内容,加载方法区的静态区中,并且要完成静态成员的初始化然后: 才进行对象的创建。所以: 先有静态代码块,才加载对象。
static修饰成员变量的使用:
static修饰修饰成员变量(类变量: 依赖于类,与对象无关)
1.定义格式:
static 数据类型 变量名称 = 数据值;2.使用格式:
类名.静态成员变量名称; 推荐使用
对象名.静态成员变量名称; 不推荐使用
static修饰成员方法的使用
static修饰成员方法(类方法: 依赖于类,与对象无关)
1.定义格式:
public static 返回值类型 方法名称(参数列表...) {...}2.使用格式:
类名.静态成员方法名称(...) 推荐使用
对象名.静态成员方法名称(...) 不推荐使用
3.注意:
静态成员变量也有默认初始化值
public class JavaEE372Student {
String name;//不能使用static修饰: 属于每个对象的特有数据
static String room;//使用static修饰: 属于所有对象的共享数据
//定义静态方法
public static void show() {
System.out.println("班级: "+room);
}
}
//测试类
public class Demo05Static {
public static void main(String[] args) {
System.out.println(JavaEE370Student.room);//null
//创建JavaEE372Student类的对象
JavaEE372Student stu = new JavaEE372Student();
//不推荐使用对象调用静态成员
System.out.println(stu.room);//null
System.out.println("---------");
//给静态成员赋值
JavaEE372Student.room = "HMTBD1002";
System.out.println(JavaEE372Student.room);//HMTBD1002
System.out.println(stu.room);//HMTBD1002
System.out.println("---------");
JavaEE372Student stu2 = new JavaEE372Student();
stu2.room = "HMTBD1003";
System.out.println(stu.room);//HMTBD1003
System.out.println(stu2.room);//HMTBD1003
System.out.println(JavaEE372Student.room);//HMTBD1003
System.out.println("---------");
//调用静态成员方法
//推荐使用类名调用
JavaEE372Student.show();//班级: HMTBD1003
//不推荐使用对象调用
stu.show();//班级: HMTBD1003
}
}
静态代码块
静态代码块
1.格式:
static {
...
}2.特点:
(1)假如只创建对象,静态代码块会优先于构造方法执行,唯一执行一次
(2)静态代码块,随着类的加载而加载并唯一执行一次
(3)完成静态成员变量的赋值,没有赋值,会有默认初始化值
(4)静态代码块,仍然属于静态内容,内部不能使用非静态
(5)完成项目的初始化工作
/*
静态代码块
1.格式:
static {
...
}
2.特点:
(1)假如只创建对象,静态代码块会优先于构造方法执行,唯一执行一次
(2)静态代码块,随着类的加载而加载并唯一执行一次
(3)完成静态成员变量的赋值
(4)静态代码块,仍然属于静态内容,内部不能使用非静态
(5)完成项目的初始化工作
*/
public class Demo07StaticKuai {
public static void main(String[] args) {
//创建对象
//Person p = new Person();
//Person p2 = new Person();
System.out.println(Person.country);
}
}
//此类只针对咱们中国人
public class Person {
String name;//不能使用static修饰: 每个对象的特有数据
static String country = "CHINESE";//必须使用static修饰: 所有的对象的共享数据
//空参构造方法
public Person(){
System.out.println("空参构造被执行了...");
}
//静态代码块
static {
System.out.println("静态代码块执行了...");
//(3)完成静态成员变量的赋值
country = "CHINA";
//(4)静态代码块,仍然属于静态内容,内部不能使用非静态
/*
name属于非静态成员变量,必须由对象调用,
但是静态代码块执行时,还没有完成对象的创建,
所以静态代码块中不能使用非静态的内容
*/
//System.out.println(name);
/*
this代表对象,但是静态代码块执行时,还没有完成对象的创建
*/
//System.out.println(this.name);
//(5)完成项目的初始化工作
init();
}
//模拟项目初始化的方法
public static void init() {
System.out.println("项目正在完成初始化,需要稍等10秒钟....");
for (int i = 10; i > 0; i--) {
//此代码直接复制,后面多线程中讲解
try {
Thread.sleep(1000);//1000毫秒,程序在此处休眠1000毫秒(1秒)
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(i);
}
System.out.println("项目初始化完成,你可以尽情使用了....");
}
}