Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 32

О порядке создания объекта - разобрать логику работы кода

14.08.2014, 02:37. Показов 2277. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем времени, вот разбираюсь с порядками инициализации и создания объектов. Все вроде бы ясно-понятно, но не могу понять одного момента.
Есть код:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TestYourSelf {
 
 
 
    public static void main(String[] args) {
        new Parent();
    }
}
 
    class Parent {
        Parent() {
            foo();
        }
 
 
      void foo() {
            System.out.println("parent foo");
        }
    }
и все работает - т.е. на экран выводится надпись parent foo. А я не могу понять почему. Ведь, насколько я поняла, процесс создания объекта идет следующим образом: вызвали конструктор и начали выполнять инструкции в нем. а тут инструкция вызвать метод (нестатический!). т.е. этот метод применим к объекту класса. но здесь же у нас ещё никакого объекта нет и в помине - мы как раз его создаем. Так почему же оно работает?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
14.08.2014, 02:37
Ответы с готовыми решениями:

Разобрать логику работы приведенного кода
наткнулся на такой элементарный на мой взгляд пример, но увидев результат работы, я немного озадачился(на самом деле не немного): class...

Разобрать логику работы приведенного кода
Здравствуйте, уважаемые! #include <iostream> using namespace std; long brackets_balance (char * str) { long count; for...

Бинарный поиск через рекурсию: разобрать логику кода
Помогите , уже второй день мучаюсь с алгоритмом бинарного поиска через рекурсию . Не понимаю откуда берутся значения которые мне выдает...

7
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,766
14.08.2014, 08:35
Сначала создаётся объект (выделяется память), затем производится инициализация полей и только потом вызывается конструктор.
0
237 / 236 / 72
Регистрация: 02.07.2013
Сообщений: 881
14.08.2014, 09:16
Цитата Сообщение от Hbadger Посмотреть сообщение
но здесь же у нас ещё никакого объекта нет и в помине - мы как раз его создаем.
явного объекта нет, но
Цитата Сообщение от Hbadger Посмотреть сообщение
new Parent();
вот Вы вызываете конструктор класса Parent, в котором есть вызов метода foo()

почему это не должно работать?
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 32
14.08.2014, 13:44  [ТС]
Wado-Ru, меня это почему-то смущает) вроде как конструирование объекта ещё не завершено, а мы уже методы для него вызываем. Но, насколько я поняла, здесь главное что - что этот метод foo() может спокойно исполнятся и на данном этапе создания объекта, поскольку он не использует никакие части объекта, которые могли бы быть на данном этапе ещё не проинициализированны. а вот, например, такой случай:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class TestYourSelf {
   
    public static void main(String[] args) {
        new Child();
    }
}
 
    class Parent {
        Parent() {
            foo();
        }
 
 
      void foo() {
            System.out.println("parent foo");
        }
    }
    class Child extends Parent {
       int x=10;
       foo() {
            System.out.println("Child foo() "+x);
        }
    }
уже не будет работать, т.к. на этапе конструирования объекта класса Parent вызывается перегруженный метод из дочернего класса Child, в котором используется поле х, а поле х ещё не было проинициализированно.
Я правильно размышляю?
0
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,766
14.08.2014, 14:00
Работать будет. Выведет "Child foo() 0". Вот если бы вместо "x" был указатель на объект и вызывался бы какой-нибудь его метод, то случилось бы исключение NullPointerException.
0
0 / 0 / 0
Регистрация: 25.07.2014
Сообщений: 32
14.08.2014, 18:25  [ТС]
kotelok, ага, спасибо) уже разобралась. точнее дочитала до того момента, где сказано, что "при создании нового объекта первым делом выделяется память под него и вся она заполняется двоичными нулями". получается именно с примитивами все будет работать, но не так как предполагается, а со ссылочными типами- фиг.

п.с. сорри, что я ваш же ответ вам пересказала. мне так проще размышляется-запоминается
0
 Аватар для newb_programmer
238 / 238 / 113
Регистрация: 03.09.2011
Сообщений: 558
14.08.2014, 22:56
както у вас все сложно...

Default Values

It's not always necessary to assign a value when a field is declared. Fields that are declared but not initialized will be set to a reasonable default by the compiler. Generally speaking, this default will be zero or null, depending on the data type. Relying on such default values, however, is generally considered bad programming style.

The following chart summarizes the default values for the above data types.Data Type Default Value (for fields)
byte 0
short 0
int 0
long 0L
float 0.0f
double 0.0d
char '\u0000'
String (or any object) null
boolean false

Local variables are slightly different; the compiler never assigns a default value to an uninitialized local variable. If you cannot initialize your local variable where it is declared, make sure to assign it a value before you attempt to use it. Accessing an uninitialized local variable will result in a compile-time error.
0
237 / 236 / 72
Регистрация: 02.07.2013
Сообщений: 881
15.08.2014, 11:36
вопрос был вообще-то не о том, что поля в налы и нули инициализируются, а переменные нет. А о том, в каком порядке происходит инициализация и вызов конструктора.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.08.2014, 11:36
Помогаю со студенческими работами здесь

Объясните, пожалуйста, логику работы кода
Пожалуйста, объясните логику этого примера, не могу совсем разобраться. Сначала мы вызываем функцию setupHelp(), у нас в ней есть массив...

Объясните, пожалуйста, в каком порядке Java-машина читает код и логику работы
Объясните, пожалуйста, в каком порядке Java-машина читает код и логику работы. Для меня выглядит так, как будто не хватает одного...

Разобрать участок кода и результат его работы
Вот сам код на C#: { int a,b; b = 0; for (a = 1; a <= 5; b+=a++) { Console.WriteLine(b); } Console.ReadKey();

Метод Симпсона: разобрать логику программы
Наковырял код, переделал под свой интеграл, считает всё правильно, но я не могу понять сам алгоритм вычисления интеграла. (как считать...

Разобрать логику. Основной код уже есть
<script> $(".line").hide(); $('.flat').hide(); $('.block').change(function(){ $("hr").remove(); ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru