静态成员是属于整个类的,由类所进行维护,仅在类初次加载时会被初始化,在类销毁时回收。
通过该类实例化的所有对象都共享类中静态资源,任一对象中信息的修订都将影响所有对象。
由于静态成员在类加载期间就已经完成初始化,存储在Java Heap(JDK7.0之前存储在方法区)中静态存储区,因此优先于对象而存在,可以通过类名和对象名两种方式访问。
非静态成员属于对象独有,每个对象进行实例化时产生各自的成员,随着对象的回收而释放。
对象对各自成员信息的修订不影响其他对象
只能通过对象名访问。
类外可应用“类名.成员名”或“对象名.成员名”的方式访问非私有静态成员,更推荐用“类名.成员名”体现其特性。应用“对象名.成员名”时会出现警告,但不影响程序运行。
类内可应用“类名.成员名”或“this.成员名”或“成员”的方式访问,应用“this.成员名”时会出现警告,但不影响程序运行。
静态方法:用static修饰的成员方法,通常也称为静态方法、类方法、全局方法等。
非静态方法:没有被static修饰的成员方法,也称为叫做非静态方法、实例方法,对象方法等。
与静态成员相似,静态方法属于整个类的,由类所进行维护,优先于对象而存在,因此可以通过类名和对象名两种方式访问,也因此在静态方法中无法直接访问同类中的非静态成员。
静态方法中不能直接访问同一个类的非静态成员,只能调用同一个类静态成员.
只能通过对象实例化后,对象.成员方法的方法访问.
静态方法不能使用this.
静态代码块:被static修饰的,定义在类内部,用{}括起的代码段。
构造代码块:没有被static修饰的,定义在类内部,用{}括起的代码段。
普通代码块:定义在方法内部,用{}括起的代码段。
静态代码块:
只能出现在类内,不允许出现在方法内。
可以出现多次,按顺序在类加载时执行。
无论该类实例化多少对象,只执行一次。
构造代码块:
可以在类内出现多次,按顺序在每个对象实例化时执行。
执行优先级:晚于静态代码块,高于构造方法。
每次执行对象实例化时,均会执行一次。
普通代码块:
可以在方法内出现多次,按顺序在方法调用时执行。
静态代码块:基于性能优化的考量,多适用于需要在项目启动时执行一次的场景,譬如项目资源整体加载等。
构造代码块:多适用于类中每个对象产生时都需要执行的功能封装。与构造方法的区别在于,构造方法是在new执行时有选择性的调用带参或者无参构造,而构造代码块则是,在每个对象实例化时都一定会执行。
普通代码块:适用于在方法内进行代码功能拆分。
1 public class Car { 2 static String field; 3 4 static { 5 field = "字段1"; 6 System.out.println("我是静态代码块1"); 7 } 8 9 static { 10 field = "字段2"; 11 System.out.println("我是静态代码块2"); 12 } 13 14 { 15 field = "字段3"; 16 System.out.println("我是构造代码块1"); 17 } 18 19 { 20 field = "字段4"; 21 System.out.println("我是构造代码块2"); 22 } 23 24 public Car() { 25 System.out.println("我是构造方法"); 26 } 27 28 public void show() { 29 System.out.println("字段show:" + field); 30 } 31 32 }
1 public class CarTest { 2 3 public static void main(String[] args) { 4 Car one = new Car(); 5 one.show(); 6 System.out.println("******************************"); 7 Car two = new Car(); 8 two.show(); 9 //我是静态代码块1 10 //我是静态代码块2 11 //我是构造代码块1 12 //我是构造代码块2 13 //我是构造方法 14 //字段show:字段4 15 //****************************** 16 //我是构造代码块1 17 //我是构造代码块2 18 //我是构造方法 19 //字段show:字段4 20 } 21 }
原文:https://www.cnblogs.com/mingmingn/p/13279711.html