Java中static(随着类的出现而出现):
-
适用范围:可以修饰变量和方法
-
静态(
static
)修饰如下:
a.变量:称为类变量、静态变量
b.方法:称为类方法、静态方法
c.代码块:称为静态代码块
3.特点:
a.随着类的加载而加载
public class Demo {
//创建一个类,定义一个静态变量,一个实例变量
String name="赵丽颖";
static String sex="男";
// 在mian方法里面调用这两个变量是不一样的
public static void main(String[] args) {
// 静态变量可以通过类调用也可以通过对象调用,而实例变量只能通过对象调用
System.out.println(Demo.sex);
Demo demo=new Demo();
System.out.println(demo.sex);
System.out.println(demo.name);
}
}
b.优先于对象存在 (为创建对象的时候就已经存在)
c.被类的所有对象共享(静态变量随着类的加载出现,全局中类只会被加载一次,静态会被所有对象共享)
public class Demo {
//创建一个类,定义一个静态变量,一个实例变量
static int age=18;
int a=10;
public static void main(String[] args) {
// 静态变量是被所有对象共享的,实例对象是每个对象里面都是独立的
// demo1,demo2对age都进行了修改,以最终修改为主
Demo demo1=new Demo();
demo1.age=22;
demo1.a=5;
Demo demo2=new Demo();
demo2.age=30;
demo2.a=50;
System.out.println(demo1.age);
System.out.println(demo1.a);
System.out.println(demo2.age);
System.out.println(demo2.a);
}
}
d.可以通过类名调用
4.类的成员变量可以分为以下两种:
- 静态变量(或称为类变量),指被 static 修饰的成员变量。
- 实例变量,指没有被 static 修饰的成员变量。
5. 注意事项:
a.在静态方法中不可以使用this关键字(静态方法随着类的出现而出现,this指向的是当前对象,类出现时对象还没有出现,所以不能用this) b.静态方法只能访问静态的成员变量和静态的成员方法(静态方法随着类的出现而出现,成员变量,成员方法需要对象的调用,类出现时对象还没有出现) c.子类不能重写父类中含有static,final,private修饰的方法 6.静态变量和成员变量的区别: a. 所属不同 静态变量属于类,所以也称为为类变量 成员变量属于对象,所以也称为实例变量(对象变量) b. 内存中位置不同 静态变量存储于方法区的静态区(常量池) 成员变量存储于堆内存 c.内存出现时间不同 静态变量随着类的加载而加载,随着类的消失而消失 成员变量随着对象的创建而存在,随着对象的消失而消失 d.调用不同 静态变量可以通过类名调用,也可以通过对象调用 成员变量只能通过对象名调用7.代码块
- 定义:在Java中,使用{}括起来的代码被称为代码块,根据位置和声明的不同,可以分为局部代码块,构造代码块,静态代码块,同步代码块。
- 局部代码块在方法中出现;限定变量生命周期,及早释放,提高内存利用率
- 构造代码块在类中方法外出现;多个构造方法方法中相同的代码存起,每次调用构造都执行,并且在构造方法前执行(相当于构造方法的初始化)
- 静态代码块在类中方法外出现,加了static修饰在类中方法外出现,并加上static修饰;用于给类进行初始化,在加载的时候就执行,并且只执行一次。
- 执行顺序:静态代码块>构造代码块>构造方法
public class Demo { static { System.out.println("Demo 静态代码块"); } { System.out.println("Demo 代码块"); } public Demo() { System.out.println("Demo 构造方法"); } } public class Test { static { System.out.println("我是静态代码块"); } public static void main(String[] args) { System.out.println("我是main方法"); Demo demo1=new Demo(); Demo demo2=new Demo(); } }