- Java中static的用法
- static修饰成员变量
- static修饰成员方法
- static成员变量初始化
- static静态代码块
- static静态代码块和static方法的使用区别
static修饰的成员变量,称为静态成员变量,静态成员变量最大的特性:不属于某个具体的对象,是所有对象所共享的。
【静态成员变量特性】
-
不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中
-
既可以通过对象访问,也可以通过类名访问,但一般更推荐使用类名访问
class Student{ //普通成员变量 public int a; //静态成员变量(类变量) public static int b = 1; } public class Test { public static void main(String[] args) { //调用类的普通成员变量 (属性) 创建对象(实例) 通过对象去调用-->实例变量 Student student1 = new Student(); System.out.println(student1.a); //调用静态成员变量(类变量)方法1: 通过类名访问(推荐使用) System.out.println(Student.b); //调用静态成员变量(类变量)方法2: 通过对象的引用访问 Student student = new Student(); System.out.println(student.b); } }
-
类变量存储在方法区当中
-
生命周期伴随类的一生(即:随类的加载而创建,随类的卸载而销毁)
【静态方法特性】
-
不属于某个具体的对象,是类方法
-
可以通过对象调用,也可以通过类名.静态方法名(…)方式调用,更推荐使用后者
class Student{ //这是一个静态方法,也叫类方法 public static void staticFunc(){ System.out.println(); } } public class Test { public static void main(String[] args) { //方法1: 类名.静态方法名(...)方式调用(推荐) Student.staticFunc(); //方法2: 通过对象调用(不推荐) Student stu = new Student(); stu.staticFunc(); } }
-
不能直接在静态方法中访问任何非静态成员变量
解释: 静态方法可以直接通过类名调用,任何的实例也都可以调用,因此静态方法中不能用this和super关键字,不能直接访问所属类的实例变量和实例方法(就是不带static的成员变量和成员成员方法),只能访问所属类的静态成员变量和成员方法。因为实例成员与特定的对象关联!因为static方法独立于任何实例,因此static方法必须被实现,而不能是抽象的abstract。
//解决办法 方法1: 创建对象引用
public static void staticFunc1(){
Student student = new Student();
student.a = 1;
}
//方法2: 传入对象引用参数
public static void staticFunc(Student student){
student.a = 1;
}
- 静态方法中不能直接调用任何非静态方法,因为非静态方法有this参数,在静态方法中调用时候无法传递this引用
- 静态方法无法重写,不能用来实现多态
注意:静态成员变量一般不会放在构造方法中来初始化,构造方法中初始化的是与对象相关的实例属性
- 就地初始化
就地初始化指的是:在定义时直接给出初始值 - 静态代码块初始化
一般用来初始化静态成员.
class Student1{
public int a;
public static int b = 1;
{
//实例代码块:定义在类的内部,方法的外部.可以有多个
System.out.println("实例代码块!");
}
static{
//静态代码块:定义在类的内部,方法的外部且{}前加上static.可以有多个
System.out.println("静态代码块!");
}
public static void staticFunc(){
System.out.println();
}
}
注意事项
1.静态代码块不管生成多少个对象,其只会执行一次
2.静态成员变量是类的属性,因此是在JVM
加载类时开辟空间并初始化的
3.如果一个类中包含多个静态代码块,在编译代码时,编译器会按照定义的先后次序依次合并
4.实例代码块只有在创建对象时才会执行
class Student1{
public int a;
public static int b = 1;
{
//实例代码块:定义在类的内部,方法的外部.可以有多个
a = 1;
System.out.println("实例代码块!");
}
static{
//静态代码块:定义在类的内部,方法的外部且{}前加上static.可以有多个
b = 2;
System.out.println("静态例代码块只执行了一次!");
}
public Student1(int a) {
this.a = a;
System.out.println("有一个参数的构造方法执行了!");
}
}
public class Test {
public static void main(String[] args) {
Student1 student1 = new Student1(1);
System.out.println("===============");
Student1 student2 = new Student1(2);
}
}
运行结果:
静态例代码块只执行了一次!
实例代码块!
有一个参数的构造方法执行了!
===============
实例代码块!
有一个参数的构造方法执行了!
static静态代码块和static方法的使用区别
如果有些代码必须在项目启动的时候就执行,就需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化但是不执行,在不创建对象的情况下,可以供其他程序调用,而在调用的时候才执行,这需要使用静态方法,这种代码是被动执行的。 静态方法在类加载的时候 就已经加载 可以用类名直接调用。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)