Initialization of "final" instance variables

I would like to understand the initialization of class instances in different cases.
Section 12.5 of JLS-7 did not mention how and when the final instance variables were initialized? Can someone give me a link to understanding behavior in the case of instance variables declared as final?

   public class Test {

        public static void main(String args[]){

            Child  c1 = new Child();
        }
    }

    class Parent{
        final int a =30;
        Parent(){
            System.out.println("From super Contsrutor "+a);
            meth();
        }
        void meth(){
             System.out.println("From super");
        }
    }

    class Child extends Parent{
         final  int e=super.a;
         int b=30;
        void meth(){
            System.out.println("From Sub e=" +e+", b="+b);
        }
    }

outputs Output as follows

From super Contsrutor 30
From Sub e=0,b=0

Where

public class Test {

    public static void main(String args[]){

        Child  c1 = new Child();
    }
}

class Parent{
    final int a =30;
    Parent(){
        System.out.println("From super Contsrutor "+a);
        meth();
    }
    void meth(){
         System.out.println("From super");
    }
}

class Child extends Parent{
     final  int e=a;
    void meth(){
        System.out.println("From Sub " +e);
    }
}

gives output as

From super Contsrutor 30
From Sub 30
+4
source share
3 answers

it

final int e = a;

is a variable constant , constant expression . In a call

System.out.println("From Sub e=" +e+", b="+b);

the compiler can replace the use of eits value 30.

AT

final int e = super.a;

e , super.a , .

+2

From super Contsrutor 30
From Sub e=0,b=0

.

, new Child(), Child

, constrctor

constrcutor

() {           System.out.println( " Contsrutor" + a);           ();       }

meth(), , () .

, child() super constrcutor , , a, b.

b 0 , constrcutor.

, , .. meth() constrctor, constrcutor.

package com.kb.finalVariables;

public class Test {

    public static void main(String args[]){

        Child  c1 = new Child();
    }
}

class Parent{
    final int a =30;
    Parent(){
        System.out.println("From super Contsrutor "+a);
       // meth();
    }
    void meth(){
         System.out.println("From super");
    }
}

class Child extends Parent{

     final  int e=super.a;
     int b=30;
     public Child() {
        meth();
    }
    void meth(){
        System.out.println("From Sub e=" +e+", b="+b);
    }
}
+1

, :

package com.test;

public class Test {

    public static void main(String args[]) {
        Child c1 = new Child();
    }
}

class Parent {
    final int a = 30;
    static int count = 0;
    {
        System.out.println("Parent initialization block " + ++count);
    }
    Parent() {
        System.out.println("Parent constructor " + ++count);
        // System.out.println("From super Contsrutor " + a);
        meth();
    }
    void meth() {
        // System.out.println("From super");
        System.out.println("Parent meth method " + ++count);
    }
}

class Child extends Parent {
    final int e = super.a;
    int b = 30;
    {
        System.out.println("Child initialization block " + ++count);
    }
    public Child() {
        System.out.println("Child constructor " + ++count);
    }
    void meth() {
        System.out.println("Child meth method " + ++count);
        // System.out.println("From Sub e=" + e + ", b=" + b);
    }
}

:

Parent initialization block 1
Parent constructor 2
Child meth method 3
Child initialization block 4
Child constructor 5

, Parent Child , .

, Child, Parent , meth Parent , meth Child class, Child, Child , , b 30, int 0, e.

+1

Source: https://habr.com/ru/post/1540566/


All Articles