说到static 我们先了解一下什么是static?

static-----表示“全局”或者“静态”的意思,在Java中属于一种修饰符。

static用来修饰什么?

1.可以修饰变量或者属性--------静态属性或者类属性

2.可以修饰方法------静态方法

3.可以修饰代码块------静态代码块

静态属性或者类属性

        如果属性前没有加static,这种属性成为对象属性,在使用对象属性的时候我们需要对象,也就是new出来一个对象,通过对象区调用对象属性。

public class Person {
     public String name;
     public int age=18;//对象属性
     
	public static void main(String[] args) {
		// TODO Auto-generated method stub
      Person p=new Person();
      System.out.println(p.age);
	}

}

        static如果修饰属性,则这个属性就由对象属性变成了类属性,在使用时不需要对象,直接类名.属性

public class Person {
     public String name;
     public int age=18;//对象属性
     public static String NAME;
     public static int AGE=18;//类属性  属性名必须大写 如果有多个字母组成 需要加下划线 例如:HOME_NUM
	public static void main(String[] args) {
		// TODO Auto-generated method stub
      Person p=new Person();
      System.out.println(p.age);
      System.out.println(Person.AGE);
	}

}

静态方法

      1.如果方法前没有加static,这种方法成为对象属性,在使用对象方法的时候我们需要对象,也就是new出来一个对象,通过对象区调用对象方法。

public class Demo {
    public void method() {
    	System.out.println("hahhahahaha");
    }
    public static void run() {
    	System.out.println("xixixiixi");
    }
	public static void main(String[] args) {
		// TODO Auto-generated method stub
      Demo d=new Demo();
      d.method();
      Demo.run();
	}

}

2.static修饰的属性在内存中只有一个,即由这个类生成对象全部公用这个属性

public class Student {
    static int age=18;
    int score=99;
    String name="小李";
	public static void main(String[] args) {
		// TODO Auto-generated method stub
       Student s=new Student();
       s.age=88;
       Student s1=new Student();
       s1.age=77;
       System.out.println(Student.age);
	}

}

注:我们要明白的是我们创建了几个对象,我们就有几个score,如上代码,我们创建了两个对象,就有两个score。但是不管我们创建多少个对象,只有一个age。

java static 类单例 java static对象_类属性

注:只有我们看到代码中有new对象,我们就去类中找是否有static,只要有static就放入静态区。

3.静态的属性不能引用非静态的属性后者方法,静态的属性之间也有先后顺序;非静态的属性可以引用静态属性,没有先后顺序

public class Demo01 {
  static int n=1;
  static int m=2;
  int x=1;
  int y=1;
  public void run() {
	  
  }
  public int randomNum() {
	  System.out.println("hahahaha");
	  return (int) (Math.random()*100);
  }
}

注:1.x能否等于randomNum():可以,等于randomNum(),才会执行randomNum()这个方法;

        2.n能否等于randomNum():不可以,因为randomNum()是对象方法,需要调用它必须得有对象;

        3.n能不能等于x:不可以,因为x是对象属性

        4.m能不能等于n:可以,因为均为静态

        5.n能不能等于m:不可以,因为有先后顺序

        6.y能不能等于x:可以,因为先存的是x

         7.x能不能等于y:不可以,因为有先后顺序

静态代码块

         static定义的静态代码块在类加载阶段只执行一次,并且是自上而下的顺序执行

public class Demo02 {
    //静态语句块
	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) {
		// TODO Auto-generated method stub
       System.out.println("hello");
       System.out.println("hello word");
	}

}

       运行结果如下图:

java static 类单例 java static对象_java_02