java-static静态
作用
用于修饰成员变量、成员函数。可被对象或类调用。
使用场景
当多个对象有共同数据时,没必要每个对象都具有该成员变量,可以独立出来。例:
class Person
{
String name;
String country = "cn";
public void show(){}
}
每个对象的建立都会拥有name、country两个变量,但country是每个对象所共有的数据,都是"cn"。因此可将其独立出来。
class Person
{
String name;
static String country = "cn";
public void show(){}
}
此时,static修饰的country存储于方法区(共享区)中,而并非存于堆内存中。
static特点
1、随着类的加载而加载,类的消失而消失。
2、优先于对象存储在
3、被所有对象共享
4、可以直接被类名所调用
**非静态变量在创建对象后才存在,成为实例变量
**静态变量在加载类时即存在,成为类变量
实例变量与类变量的区别:
1、存放位置:实例变量在堆内存中,类变量在方法区中
2、生命周期:类变量生命周期长,随类的消失而消失;实例变量生命周期随对象的消失而消失
注:
public static void main(String[] args)
{
Person p = new Person;//定义对象,静态变量、非静态变量(默认值0、null)都创建
Person.country;//类名调用静态变量,静态变量存在、非静态变量不存在
Person p1 = null;//p1赋值为null,没有加载类,静态变量不存在。
}
static使用注意事项:
1、静态方法只能访问静态成员(变量、方法)
2、静态方法优先于对象存在,不可以在静态方法内使用this、super关键字
static利弊:
利:共享数据单独空间存储,节省内存,可直接被类名调用。
弊:生命周期过长,访问出现局限(只能访问静态成员)。
static的应用:
用静态建立工具类
class ArrayTool
{
private ArrayTool(){}//构造函数私有化,防止程序定义该类对象,直接用类名调用方法即可。
public static int getMax(int[] arr){...}//获取数组最大值
public static int getMin(int[] arr){...}//获取数组最小值
public static void selectSort(int[] arr){...}//选择排序
public static void bubbleSort(int[] arr){...}//冒泡排序
private static void swap(int[] arr,int x,int y){...}//交换位置
}
static代码块:
public class StaticCode {
int num = 9;
//构造函数
StaticCode()
{
System.out.println("b");
}
//静态代码块,初始化类
static
{
System.out.println("a");
}
//构造代码块,初始化构造函数。
{
System.out.println("c");
}
}
执行顺序:静态代码块>构造代码块>构造函数
输出为:a c b
public static void main(String[] args)
{
new StaticCode();
new StaticCode();
}
两次加载StaticCode类,静态代码块只执行一次,输出结果为a c b c b
class StaticCodeDemo{
static
{
System.out.println("b");
}
public static void main(String[] args)
{
System.out.println("d");
}
static
{
System.out.println("c");
}
}
静态代码块优先于主函数(函数)执行,输出为b c d