static,静态的意思,是一个修饰符.加在属性上分为静态属性和非静态属性,加在方法上分为静态方法和非静态方法,那静态/非静态属性和方法之间有什么区别呢?我们通过一段代码来认识.
public class Student extends Person{ private static int age;//静态变量 private double score;//非静态变量 public void run(){//非静态方法可以直接访问静态方法所有东西 go(); } public static void go(){//静态方法可以直接调用其他静态方法 } public static void main(String[] args) {//但静态方法不可以直接调用非静态方法 Student s1 = new Student(); System.out.println(s1.age);//静态变量可以通过对象访问 System.out.println(s1.score);//非静态变量也可以通过对象访问 System.out.println(Student.age);//静态变量可以通过类名访问 //System.out.println(Student.score);//非静态变量不能通过类名访问 new Student().run();//非静态方法需要用过对象.方法来调用 Student.go();//静态变量可以直接调用 } }
总结来说:
属性 : 静态属性既可以通过对象访问,也可以通过类名访问;而非静态属性只能通过对象访问,不能通过类名访问.
方法 : 静态方法只能直接调用其他静态方法,如果要调用非静态方法,需要通过new 对象.方法来调用; 非静态方法可以直接调用静态方法和非静态方法.
这里再引进静态代码块和匿名代码块:
public class Person { //第二步执行 匿名代码块 功能:赋初始值 { System.out.println("匿名代码块"); } //第一步执行 静态代码块只执行一次 static { System.out.println("静态代码块"); } //第三步执行 空参构造方法 public Person(){ System.out.println("构造方法"); } public static void main(String[] args) { Person person1 = new Person();//静态代码块 匿名代码块 构造方法 System.out.println("================"); Person person2 = new Person();//匿名代码块 构造方法 } }
通过代码输出结果,我们不难看出:代码块常常是以一对花括号出现的,代码块是在构造方法之前执行的,首先先执行静态代码块,而且要注意,静态代码块在程序中只执行一次,而匿名代码块和构造方法重复执行,匿名代码块在代码中一般是用来赋初始值.