——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