About 静态代码块,普通代码块,同步代码块,构造代码块和构造函数的纳闷

时间:2023-03-08 17:05:36
构造函数用于给对象进行初始化,是给与之对应的对象进行初始化,它具有针对性,函数中的一种。特点:1:该函数的名称和所在类的名称相同。2:不需要定义返回值类型。3:该函数没有具体的返回值。记住:所有对象创建时,都需要初始化才可以使用。

注意事项:一个类在定义时,如果没有定义过构造函数,那么该类中会自动生成一个空参数的构造函数,为了方便该类创建对象,完成初始化。如果在类中自定义了构造函数,那么默认的构造函数就没有了。

一个类中,可以有多个构造函数,因为它们的函数名称都相同,所以只能通过参数列表来区分。所以,一个类中如果出现多个构造函数。它们的存在是以重载体现的。

构造函数和一般函数有什么区别呢?1:两个函数定义格式不同。2:构造函数是在对象创建时,就被调用,用于初始化,而且初始化动作只执行一次。    一般函数,是对象创建后,需要调用才执行,可以被调用多次。   什么时候使用构造函数呢?分析事物时,发现具体事物一出现,就具备了一些特征,那就将这些特征定义到构造函数内。

构造代码块和构造函数有什么区别?构造代码块:是给所有的对象进行初始化,也就是说,所有的对象都会调用一个代码块。只要对象一建立。就会调用这个代码块。构造函数:是给与之对应的对象进行初始化。它具有针对性。

普通代码块

  直接在一个方法中出现的{}就称为普通代码块,例子程序如下:
  public class CodeDemo01{

  public static void main(String[] args){

  //普通代码块

  {

  ;

  System.out.println("x=" + x);

  }

  ;

  System.out.println("x=" + x);

  }

 
构造代码块

  直接在类中定义的没有加static关键字的代码块{}称为构造代码块,例子程序如下:
  public class CodeDemo02{

  public CodeDemo02(){

  System.out.println("========这是构造方法=========");

  }

  //这是构造代码块,而且在new对象时,构造代码块优先构造方法执行

  {

  System.out.println("=========这是构造块!=========");

  }

  public static void main(String[] args){

  new CodeDemo02();

  new CodeDemo02();

  }

  }
静态代码块就是一个有静态关键字标示的一个代码块区域。定义在类中。

  使用static关键字声明的代码块称为静态代码块,静态块的主要目的是用来为静态属性初始化,例子程序如下: 
 public class CodeDemo03

  {

  static{

  System.out.println("这是主类中的静态代码块!");

  }

  public static void main(String[] args){

  new Demo();

  new Demo();

  new Demo();

  }

  }

  class Demo

  {

  static{

  System.out.println("这是Demo类中的静态代码块!");

  }

  {

  System.out.println("这是Demo类中的构造块!");

  }

  public Demo(){

  System.out.println("这是构造方法!");

  }

  }
静态块优先于主方法的执行,静态块优先于构造方法的执行,而且只执行一次!

作用:可以完成类的初始化。静态代码块随着类的加载而执行,而且只执行一次(new 多个对象就只执行一次)。如果和主函数在同一类中,优先于主函数执行。
静态块的特点是在类加载的时候就执行,先说一下类加载,一个程序要想运行,首先要把代码加载到内存中对吧?然后才能去和CPU交流,这是冯诺依曼计算机规定的。Java也是一样,Java的.class字节码文件要想执行,首先也要加载到内存,由类加载器把字节码文件的代码加载到内存中,这一步就叫类加载,这是首先要进行的。
public class Test {
static {
System.out.println("我是静态块");
}
}
当创建Test类的一个对象的时候,比如new Test() ,是这样,首先是类加载,然后才能new对象,静态块在类加载的时候就执行了,这就说明静态块在new对象之前就会执行,而且一个类在第一次被使用的时候会被加载,然后在整个应用程序的生命周期当中不会再次被加载了,就加载这一次,所以这就说明,静态块就执行一次,不会执行第二遍!
public class Test {
public Test() {// 构造方法
System.out.println("我是构造方法,创建对象的时候我会执行,我执行完,对象就造出来了");
}

static {
System.out.println("我是静态块,类加载的时候我就执行了,而且只执行这一次");
}
}
然后这样:new Test();new Test();你会发现首先打印出静态块的信息,然后才打印出构造方法信息,然后再次new Test();的时候,只打印出了构造方法的信息,这个例子证明了我上面说的是对的!

这就是静态块,静态块中初始化Map。下面就可以说是在静态块中初始化Map,
public class Test {
private static Map m;
static {
m = new HashMap();
}
}
静态代码块是当类在加载时,静态代码块就会被自动执行,先于main方法被执行且只执行一次,常用来对一些类的属性进行初始化构造代码块是每次进行对象的建立时都会被执行到

同步代码块。
如果在代码块前加上 synchronized关键字,则此代码块就成为同步代码块。
同步代码块的格式:
synchronized(同步对象){
需要同步的代码;
}
同步对象一般为当前对象,即使用this关键字
package cn.sunzn.synchronize;

public class SynchronizeCode {
   public static void main(String[] args) {
       new Thread() {
           public void run() {
               while (true) {
                   System.out.println("同步代码");
               }
           };
       }.start();
       new Thread() {
           public void run() {
               while (true) {
                   System.out.println("SynchronizeCode");
               }
           };
       }.start();
   }
}

结果为:

SynchronizeCode
SynchronizeCode
SynchronizeCode
SynchronizeCode
同步代码
同步代码
同步代码
同步代码
静态代码块、构造代码块、构造函数同时存在时的执行顺序静态代码块 -->构造代码块 --> 构造函数;
也就是 先执行静态代码块,接着就是构造代码块。再接着就是构造函数。如果在主类里面的话。执行顺序是:先执行静态代码块。在执行main方法、在执行构造代码块。在接着才是构造函数。