之前学习了Java的抽象和封装,接下来继续研究Java的高级功能,即面向对象编程的进阶功能。 本文先讲解Java语言基于面向对象原理给出的第一个关键字——static,给之后写Java继承、多态打好基础。
static在英文中是“静态”的意思。
在Java中,将static列为一个关键字,用来修饰类层次的成员,被所有对象共享。
即在装入类之后,可以直接通过类名访问,不需要再new一个对象出来。
static在Java中,主要有这三种用法:
在编写Java程序时,被static修饰的成员变量也叫做静态成员变量。
当JVM虚拟机在加载类中就创建了该变量。该变量在内存中只有一份,被所有对象所共享。
创建一个类,该类中有一个静态变量code,用static关键字修饰
package cn.zwz.entity;
public class ParameterSetting {
public static String code = "ZWZ";
}
然后创建一个测试类,从中调用该参数
package cn.zwz;
import cn.zwz.entity.ParameterSetting;
public class Main {
public static void main(String[] args) {
System.out.println(ParameterSetting.code);
}
}
输出:
ZWZ
Process finished with exit code 0
即 ParameterSetting 对象中的code变量,被所有对象所共享,不用创建对象,就可以通过类名访问。
而且不能通过this来访问该变量,由此推断出没有this指针。
通常来讲,用static关键字修饰的变量称为静态成员变量,而不用static关键字修饰的变量叫做实例变量。
实例变量需要用户创建对象后再调用。
比如我们创建一个实例变量code:
package cn.zwz.entity;
public class ParameterSetting {
public String code = "ZWZ";
}
在测试类中,我们需要先创建对象,才能调用
package cn.zwz;
import cn.zwz.entity.ParameterSetting;
public class Main {
public static void main(String[] args) {
ParameterSetting parameterSetting = new ParameterSetting();
System.out.println(parameterSetting.code);
}
}
Java的实例变量,每创建一次对象,都会新建一份内容,即每个对象都拥有一份内存空间。
类变量必须唯一,而实例变量来说,类所实例化的不同对象,都可以拥有不同的值。
用static关键字修饰的方法称为静态方法。和静态成员变量一样,不能使用this指针,而且不能类的实例变量和实例方法。
比如在类中创建一个add静态方法,可以被静态的main方法所调用。
package cn.zwz;
public class Main {
public static int add(int a,int b) {
return a + b;
}
public static void main(String[] args) {
add(1,2);
}
}
如果add不为静态方法,则不允许,IDE会提示错误信息。
静态方法支持访问类的静态变量和静态方法
package cn.zwz.entity;
public class ParameterSetting {
public static String code = "ZWZ";
public static int add(int a,int b) {
return a + b;
}
}
测试类
import cn.zwz.entity.ParameterSetting;
public class Main {
public static void main(String[] args) {
System.out.println(ParameterSetting.add(1,2));
System.out.println(ParameterSetting.code);
}
}
在Java的类中,支持包含static修饰的代码块。
这段代码块属于公共的部门,不属于任何方法,即静态代码块。
在加载类中,JVM会执行这些静态代码块。
这些代码块会按照代码的顺序依次执行,但只会被执行一次,所以有很多适用的场景。
静态代码块类似静态方法,没有this指针,不能访问类的实例变量和实例方法,必须要先创建对象。
静态代码块最常用的场景,就是初始化类变量
package cn.zwz.entity;
public class ParameterSetting {
public static String code = "ZWZ";
static {
System.out.println("ParameterSetting 类加载了");
}
}
测试类
package cn.zwz;
import cn.zwz.entity.ParameterSetting;
public class Main {
public static void main(String[] args) {
System.out.println(ParameterSetting.code);
}
}
输出
ParameterSetting 类加载了
3
ZWZ