Java статикалық баптандыру әрекеті

public class Hello {
        public static final Hello h = new Hello();
        static int i = 5;
        int j  = i;

        private void print() {
            System.out.println(i+" , "+j);

        }
        public static void main(String[] args) {

            h.print();
        }

    }

Бұл коды шығу 5, 0. егер себебі - сыныпта бірінші статикалық жүктеме болса және i инициализирленсе және j - болмаса

public class Hello {
        public static final Hello h = new Hello();
        int i = 5;
        int j  = i;

        private void print() {
            System.out.println(i+" , "+j);

        }
        public static void main(String[] args) {

            h.print();
        }

    }

енді неге 5,5 шығар? онда i және j инициализацияланған кезде. себебін түсіндіріп беріңіз.

13

7 жауаптар

Статикалық блок тәртіппен орындалады.

Сіз алдымен «Hello» нысанын жасайсыз, бұл жерде i = 0 параметрі орнатылмаған.

Only after this does i = 5

Статикалық мәлімдемелерді жоғарыдан төменге қарай оқыңыз.

16
қосылды

Hello нысаны жасалған сәтте статистикалық емес айнымалылар i және j

public static final Hello h = new Hello();

Питер сұрағының бірінші бөлігінде сізге жауап берді. Мұны толықтыра беріңіз. Статикалық айнымалылардың тәртібін өзгертсеңіз:

static int i = 5;
public static final Hello h = new Hello();
int j  = i;

ол 5, 5 емес, 5, 0 емес, басып шығарады.

5
қосылды
бірақ алдыңғы жағдайда, j неге баптандырылмады, оның мәні 0.
қосылды автор ankita gahoi, көзі
енді оны алды. Рахмет
қосылды автор ankita gahoi, көзі

Бірінші мысалда не болады:

  • Static memory is initialized to 0. At this point Hello.i equals 0.
  • Hello.h is instantiated:
    • Hello.h.j is initialized to Hello.i's current value, i.e. 0.
  • Hello.i is initialized to 5.

Екінші мысалда, екінші жағынан:

  • Hello.h is instantiated:
    • Hello.h.i is initialized to 5.
    • Hello.h.j is initialized to Hello.h.i's current value, i.e. 5.
2
қосылды

public static final Hello h = жаңа Сәлем (); және static int i = 5; жолдарын ауыстырып көріңіз. Сіз алдымен hello нысанын (i = 0 болса, uninitialized) және i мәнінен инициализирлеңіз. Күтілетін мінез-құлықты алу үшін, алдымен i сөзін енгізіңіз.

2
қосылды

Питер Лоджридің жауабы дұрыс, сіздердің шатасуларыңыз бәрі бір сыныпта және аты-жөні сияқты болуы мүмкін, сондықтан сіздің кодыңыздың келесі кодымен логикалық түрде баламасы бар:

public class Program {

    public static Hello h = new Hello();

        public static void main(String [] args) {
            h.i = 5;
            h.print();
        }
    }

    class Hello {

        public static int i = 0;
        private int j = i;

        public void print() {
            System.out.println(i+", "+j);
        }
    }
1
қосылды

Оракл ерекшеліктерінің құжаттарынан

Сыныпта жарияланған статикалық инициализатор класс баптандырылған кезде орындалады (§12.4.2). Класс айнымалысы үшін кез келген өріс инициализаторларымен бірге (§8.3.2) сыныптың сынып айнымалыларын инициализациялау үшін статикалық инициализаторлар қолданылуы мүмкін.

0
қосылды

Java сынып жүктелу кезінде статикалық инициализацияны жасайды. Сондықтан

public static final Hello h = new Hello();

Hello сынып жүктелген кезде i = 5 және j әдепкі мәні бар нысанды жасайды.

Егер i және j айнымалыларының екеуі де статикалық мүшелер болмаса, екеуінде де static object h үшін әдепкі мәндер болады.

Егер сіз негізгі әдісіңізде жаңа нысан жасасаңыз

Hello helloObj = new Hello();

Ол сізге қажетті нәтиже береді.

0
қосылды