——static的特点?
——static修饰的(变量/方法)可以直接通过类名去访问,不需要创建对象。
1、静态变量:
1.有多种方式调用静态变量。
2.有多种方式修改静态变量的值。
3.每创建一个对象,非静态变量都会分配一次内存,修改非静态变量,不同对象的该变量互不影响。
4.无论创建多少个对象,静态变量只分配一个内存,修改静态变量,会影响该类的其他对象,不推荐通过对象访问静态变量,以免误修改静态变量的值,影响其他对象的使用。
public class StaticTest {
static String str = "我是静态变量";
public static void main(String[] args) {
//直接调用静态变量
System.out.println(str);
//通过对象调用静态变量
StaticTest s = new StaticTest();
System.out.println(s.str);
//通过类调用静态变量
System.out.println(StaticTest.str);
//使用多种方法修改静态变量的值
str = "重新赋值"; //方法1
s.str = "重新赋值"; //方法2
StaticTest.str = "重新赋值"; //方法3
}
}
2、静态方法
1.有多种方式调用静态方法。
public class StaticTest {
public static void MyPrint(){
System.out.println("我是静态方法");
}
public static void main(String[] args) {
//直接调用静态方法
StaticTest.MyPrint();
//通过对象调用静态方法
StaticTest s = new StaticTest();
s.MyPrint();
}
}
3、静态方法调用变量
1.静态方法可直接调用静态变量。
2.静态方法不可直接调用非静态变量。(红色字体为报错)
3.若硬要在静态方法在调用非静态变量,需要先创建对象,再通过对象调用非静态方法。
String a = "非静态变量";
static String b = "静态变量";
public static void MyPrint(){
//静态方法可直接调用静态变量
System.out.println(b);
//静态方法不可直接调用非静态变量
System.out.println(a); //会报错
StaticTest s = new StaticTest();
System.out.println(s.a);
}
4、静态方法调用非静态方法
1.静态方法不可直接调用非静态方法。
2.若硬要在静态方法中调用非静态方法,需要先创建对象,再通过对象调用非静态方法。(和调用非静态变量类似)
public void MyFunc(){}
public static void MyPrint(){
//静态方法可直接调用静态方法
MyFunc(); //会报错
//静态方法通过创建对象调用非静态方法
StaticTest s = new StaticTest();
s.MyFunc();
}
5、初始化块
1.创建类的实例时,会依次执行初始化块。
2.静态初始化块只在类加载时执行,且只执行一次。
3.静态初始化块不能给非静态变量初始化。
String a; //非静态变量
static String b; //静态变量
//创建类的实例时,会依次执行初始化块
{
a = "qwe";
b = "asd";
}
//静态初始化块只在类加载时执行,且只执行一次
//静态初始化块不能给非静态变量初始化
static {
a = "abc"; //会报错
b = "xyz";
}
氷鸢鸢鸢
2020.2.1