java静态代码块、普通代码块、构造代码块

    xiaoxiao2021-11-18  72

    静态代码块、普通代码块、构造代码块

    执行顺序:(优先级从高到低。)静态代码块>main方法>构造代码块>构造方法。

    其中静态代码块只执行一次。构造代码块在每次创建对象是都会执行。

    static{...}是静态块,而只有{...}的是叫做构造块。

    而构造块是,只要建立一个对象,构造代码块都会执行一次。

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

    1、普通代码块

    普通代码块:在方法或语句中出现的{}就称为普通代码块。普通代码块和一般的语句执行顺序由他们在代码中出现的次序决定--“先出现先执行”。

    public class Test {

       public staticvoidmain(String[] args){

           {

               int x=3;

               System.out.println("1,普通代码块内的变量x="+x);   

            }

                         

            int x=1;

           System.out.println("主方法内的变量x="+x);

                         

           {

              inty=7;

             System.out.println("2,普通代码块内的变量y="+y);   

            }

       }

    }

    执行结果:

    1,普通代码块内的变量x=3

    主方法内的变量x=1

    2,普通代码块内的变量y=7

    2、构造代码块

    构造块:直接在类中定义且没有加static关键字的代码块称为{}构造代码块。构造代码块在创建对象时被调用,每次创建对象都会被调用,并且构造代码块的执行次序优先于类构造函数。

    public class Test {

       {

         System.out.println("第一代码块");   

        }

          

        public Test(){

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

       }

              

       {

         System.out.println("第二构造块");

       }

       public staticvoidmain(String[] args){    

          new Test();

          new Test();

          new Test();

                    

       }

    }

    执行结果:

    第一代码块

    第二构造块

    构造方法

    第一代码块

    第二构造块

    构造方法

    第一代码块

    第二构造块

    构造方法

    3、静态代码块

    静态代码块:在java中使用static关键字声明的代码块。静态块用于初始化类,为类的属性初始化。每个静态代码块只会执行一次。由于JVM在加载类时会执行静态代码块,所以静态代码块先于主方法执行。

    如果类中包含多个静态代码块,那么将按照"先定义的代码先执行,后定义的代码后执行"。

    注意:静态代码块不能存在于任何方法体内。

    练习1:

    class Code{

        {

          System.out.println("Code的构造块");

        }

       

        static{

            System.out.println("Code的静态代码块");

            }

           

        public Code(){

            System.out.println("Code的构造方法");

            }

        }

       

    public class CodeBlock03{

         {

          System.out.println("CodeBlock03的构造块");   

         }

        

         static{

            System.out.println("CodeBlock03的静态代码块");

         }

           

         public CodeBlock03(){

            System.out.println("CodeBlock03的构造方法");

         }

           

          public static void main(String[] args){

                System.out.println("CodeBlock03的主方法");

                new Code();

                new Code();

                new CodeBlock03();

                new CodeBlock03();

              }

        }

    执行结果:

    CodeBlock03的静态代码块

    CodeBlock03的主方法

    Code的静态代码块

    Code的构造块

    Code的构造方法

    Code的构造块

    Code的构造方法

    CodeBlock03的构造块

    CodeBlock03的构造方法

    CodeBlock03的构造块

    CodeBlock03的构造方法

     

    练习2:

    package riqi_test;

     

    import java.util.Random;

    /**

     * 静态代码块、构造块、构造函数练习

     * @author fandi1993

     *

     */

    public class EmployeeTest {

       public staticvoidmain(String[] args){

          Employee[] e = new Employee[3];

          e[0] = newEmployee("张三", 400);

          e[1] = newEmployee(500);

          e[2] = newEmployee();

         

          for (Employee employee : e) {

          System.out.println("name:"+employee.getName()+",id:"+employee.getId()+",salary:"+employee.getSalary());

          }

       }

    }

     

    class Employee{

       private staticintnextId;  //静态变量

      

       private intid;

       private String name;

       private doublesalary;

       /*

        * 静态代码块

        */

       static{

          Random generator = new Random();

          nextId = generator.nextInt(10000);

       }

       /*

        * 构造代码块

        */

       {

          id = nextId;

          nextId++;

       }

       /*

        * 构造方法

        */

       public Employee(){

         

       }

       public Employee(String namedoublesalary){

          this.name = name;

          this.salary = salary;

       }

       public Employee(doublesalary){

          this("Emplyee#"+nextIdsalary);

       }

      

       public intgetId() {

          return id;

       }

       public voidsetId(intid) {

          this.id = id;

       }

       public String getName() {

          return name;

       }

       public voidsetName(String name){

          this.name = name;

       }

       public doublegetSalary() {

          return salary;

       }

       public voidsetSalary(doublesalary){

          this.salary = salary;

       }

      

    }

    执行结果:

    name:张三,id:9316,salary:400.0

    name:Emplyee#9317,id:9317,salary:500.0

    name:null,id:9318,salary:0.0

     

    转载请注明原文地址: https://ju.6miu.com/read-678321.html

    最新回复(0)