Live2D
复制代码

07-static关键字

static关键字

1、静态语句块

/*
 *    static 关键字
 *         1.static修饰的变量叫做静态变量
 *         2.static修饰的方法叫做静态方法
 *         3.static还可以定义静态语句块
 *         
 */
//以下例子演示:static定义静态语句块
//static定义的静态语句块在类加载阶段执行,并且只执行一次,是自上而下的顺序执行
package h八static关键字;

public class StaticTest001 {
	
	//静态语句块
	static{
		System.out.println('1');
	}
	static{
		System.out.println('2');
	}
	static{
		System.out.println('3');
	}
	static{
		System.out.println('4');
	}
	public static void main(String[] args){
			System.out.println("what do you know?");
	}

}

2、实例语句块

/*
 *   关于实例语句块
 *         1.每一次调用构造方法之前执行一次,调用n次,就执行n次
 *         2.实例语句块执行顺序也是自上而下
 */
package h八static关键字;

public class StaticTest02 {
	
	//静态语句块
	static{
		System.out.println('A');
	}
	
	//实例语句块
	{
		System.out.println('1');
	}
	{
		System.out.println('2');
	}
	{
		System.out.println('3');
	}
	{
		System.out.println('4');
	}
	//入口
	public static void main(String[] args){
		    new StaticTest02();//别忘了构造方法后的小括号
		    new StaticTest02();
		    new StaticTest02();
	}
	
	//构造方法
	StaticTest02(){
		System.out.println("StaticTest02执行无参数构造方法");
	}

}

3、静态方法

/*
 *     static修饰的方法叫静态方法
 *     
 *     一般情况下工具类的方法大部分是静态方法
 *     
 *     静态方法不用创建对象也能直接访问该方法
 */
package h八static关键字;

public class StaticTest03 {
	
	//成员方法
	//成员方法必须使用"引用."调用
	public void m1(){
		
	}
	
	//静态方法
	//静态方法必须使用"类名."去调用
	//静态方法不能直接访问静态类数据(成员变量、成员方法等)
	//因为静态方法不能使用this
	public static void m2(){
	System.out.println("类名点");	
	}

	//入口
	public static void main(String[] args){
		
		//如何调用,如下
		StaticTest03 s = new StaticTest03();
		s.m1();
		m2();//在同一个类中可省略"类名."
		
		//静态方法按正规的方式去调用: 类名.
		//其也能用“引用.”去调用
		s.m2();
		/*编译阶段检查出s是StaticTest03类型,编译通过,在运行的时候,
		 * 任然使用"StaticTest03."方式去访问
		 * 该方法执行不需要对象
		 */
		//空的引用去访问成员的时候会出县空指针异常
		//m2方法不是成员而是静态的
		//所以即使引用是空的也不会报空指针异常
		StaticTest03 s1;
		s1=null;
		s1.m2();
		       
		
	}

}

4、静态变量

/*
 *  static修饰的变量叫静态变量
 *         变量分类:
 *             1.局部变量
 *             2.成员变量(实例变量、非静态变量)
 *             3.静态变量(存储在方法区)
 *             
 *         什么时候变量声明成静态变量?
 *             如果这个属性所有的对象都有,并且此属性的值都是相同的,
 *             则该属性声明成静态变量
 *             
 *          成员变量:创建java对象的时候初始化
 *          静态变量:在类加载阶段赋值,并且只赋值一次
 *         
 */

package h八static关键字;

public class StaticTest04 {
	
	public static void main(String[] args){
		
		Animal a1 = new Animal("老虎",15656);
		Animal a2 = new Animal("Tiger",156155);
		
		System.out.println(a1.name+"的年龄是"+a1.age);
		System.out.println(a2.name+"的年龄是"+a2.age);
		
		//如何访问静态?(类名.)
		System.out.println(Animal.type);
		
		//也可以用  引用.
		System.out.println(a1.type);
		
		Animal a3;
		a3=null;
		System.out.println(a3.type);
		//静态变量底层访问的时候一定使用的  类名. 的方式,和对象无关,不出现空指针异常
	}

}

//抽象现实中的“陆生”动物
class Animal{
	
	//Filed
	//成员变量(一个对象一份)
	//成员变量在创建对象时初始化,并且存储在堆中的每一个对象中
	String name;
	int age;
	
	//静态变量,被存储在方法区中
	//所有的java对象共享这一份
	//所以静态变量是类级别的,使用"类名."方式访问
	static String type="陆生";
	Animal(){}
	
	Animal(String name,int age){
		this.name=name;
		this.age=age;
	}
}

5、代码执行顺序的一个小提示

    //关于代码的顺序
package h八static关键字;

public class StaticTest05 {
	
	//编译通过
	static int i=10;
	static{
		System.out.println(i);
	}
	/*
	 * 编译不通过
	
	static{
		System.out.println(i);非法向前引用
	} 
	 * static int i=10;
	 */
	public static void main(String[] args) {
		
		System.out.print(StaticTest05.i);
		
	}

}

posted @ 2021-07-22 22:12  Milen-jie  阅读(40)  评论(0)    收藏  举报