What is the difference between a static and a non-static initialization code block

后端 未结 8 1984
萌比男神i
萌比男神i 2020-11-21 23:32

My question is about one particular usage of static keyword. It is possible to use static keyword to cover a code block within a class which does not belong to

8条回答
  •  傲寒
    傲寒 (楼主)
    2020-11-22 00:12

    when a developer use an initializer block, the Java Compiler copies the initializer into each constructor of the current class.

    Example:

    the following code:

    class MyClass {
    
        private int myField = 3;
        {
            myField = myField + 2;
            //myField is worth 5 for all instance
        }
    
        public MyClass() {
            myField = myField * 4;
            //myField is worth 20 for all instance initialized with this construtor
        }
    
        public MyClass(int _myParam) {
            if (_myParam > 0) {
                myField = myField * 4;
                //myField is worth 20 for all instance initialized with this construtor
                //if _myParam is greater than 0
            } else {
                myField = myField + 5;
                //myField is worth 10 for all instance initialized with this construtor
                //if _myParam is lower than 0 or if _myParam is worth 0
            }
        }
    
        public void setMyField(int _myField) {
            myField = _myField;
        }
    
    
        public int getMyField() {
            return myField;
        }
    }
    
    public class MainClass{
    
        public static void main(String[] args) {
            MyClass myFirstInstance_ = new MyClass();
            System.out.println(myFirstInstance_.getMyField());//20
            MyClass mySecondInstance_ = new MyClass(1);
            System.out.println(mySecondInstance_.getMyField());//20
            MyClass myThirdInstance_ = new MyClass(-1);
            System.out.println(myThirdInstance_.getMyField());//10
        }
    }
    

    is equivalent to:

    class MyClass {
    
        private int myField = 3;
    
        public MyClass() {
            myField = myField + 2;
            myField = myField * 4;
            //myField is worth 20 for all instance initialized with this construtor
        }
    
        public MyClass(int _myParam) {
            myField = myField + 2;
            if (_myParam > 0) {
                myField = myField * 4;
                //myField is worth 20 for all instance initialized with this construtor
                //if _myParam is greater than 0
            } else {
                myField = myField + 5;
                //myField is worth 10 for all instance initialized with this construtor
                //if _myParam is lower than 0 or if _myParam is worth 0
            }
        }
    
        public void setMyField(int _myField) {
            myField = _myField;
        }
    
    
        public int getMyField() {
            return myField;
        }
    }
    
    public class MainClass{
    
        public static void main(String[] args) {
            MyClass myFirstInstance_ = new MyClass();
            System.out.println(myFirstInstance_.getMyField());//20
            MyClass mySecondInstance_ = new MyClass(1);
            System.out.println(mySecondInstance_.getMyField());//20
            MyClass myThirdInstance_ = new MyClass(-1);
            System.out.println(myThirdInstance_.getMyField());//10
        }
    }
    

    I hope my example is understood by developers.

提交回复
热议问题