static很奇异

学习者这么久,对static关键字还是有一点绕,因为它在各个场景的用法的规则比较繁琐,难以记忆。

修饰属性
静态属性用于表示某个类的所有对象共享的属性。

一般的非静态属性中各个对象之间是隔离的,没有任何关系的

public class Test{
    
    
	private static int number = 0;//因为static修饰的属性,所以这个属性是当前类的所有对象可以共享的属性,任何一个对象对其进行修改,则会导致所有对象的这个属性值都发生了变化
	public test(){
    
    
		number++;
	}
	public static void main(String[] args){
    
    
		Test[] arr = new Test[5];
		for(int i = 0;i<5;i++){
    
    
			arr[i] = new Test[];
		}
	System.out.println(arr[5].count);
	System.out.println(arr[1].count);
	}
}

修饰方法
可以直接通过类名.方法名的方式对方法进行调用

public class Test{
    
    
	private int age;
	private static String name;//静态方法只能访问静态成员
	public static void func(){
    
    //静态成员方法,可以通过Test.func();进行调用,也可以通过new Test().func();进行调用
		System.out.peintln(age);
		System.out.peintln(new A().age);//访问非静态成员必须构建实例
		System.out.println(name);
		new Test().func1();
		func2();
	}
	public void fun1(){
    
    }
	public static void fun2(){
    
    }
}

!!!静态代码块
在类加载完成后,并在构建对象之前,自动执行静态代码块,在这个代码块的对象的声明周七中只能执行一次,除非有新的加载动作,否则不会执行第二次,因为匿名的原因,所以不可以进行显示调用

public class Test{
    
    
	//先执行静态代码块后执行非静态代码块,最后执行构造器代码块
	static{
    
    
		System.out.println("Static code.");
	}
	{
    
    
		System.out.println("Not static code.");
	}
}

非静态代码块
非静态代码块是一个匿名方法,在构建对象之前会自动执行一次。

public class Test{
	{//允许多次定义
	}
}

各种代码块的执行顺序

  1. 当类加载完毕是会自动优先处理static静态属性和静态带代码块,谁在前先执行谁
  2. 创建对象是才会执行非静态代码块,这两个优先级相同,所以谁先定义,则先执行谁
  3. 最后执行构造方法,如果是继承父类,则先执行父类的构造方法
class Parent{
    
    
	static{
    
    
		System.out.println("Parent静态代码块");
	}
	public Parent(){
    
    
		System.out.println("Parent构造方法");
	}
	{
    
    
		System.out.println("Parent非静态代码块");	
	}
}

class Son extends Parent{
    
    
	static{
    
    
		System.out.println("Son静态代码块");
	}
	{
    
    
		System.out.println("Son非静态代码块");	
	}
	public Son(){
    
    
		System.out.println("Son构造方法");
	}
}
//执行结果:
//Parent静态代码块
//Son静态代码块
//Parent非静态代码块
//Parent构造方法
//Son非静态代码块
//Son构造方法

static总结

  • 当所有成员变量的数据都相同时,可以使用static修改静态属性,从而实现多个对象共享一个静态属性
  • 方法如果访问了特有数据(非静态成员),则这个方法就是非静态方法,如果需要方法不持有数据,则方法时静态的,例如:Math.abs(-123);
  • 如果类中的所有方法都是静态的,那么构建这个类的对象则是没有意义的,所以构造器一般会设置为私有的,例如工具类

猜你喜欢

转载自blog.csdn.net/ananhenku/article/details/121766116