Внесите ясность в код (я начинающий), объекты

Доброго времени суток! Спасибо разработчикам данного форума, за приятный интерфейс и функционал!
Теперь суть вопроса. Внесите ясность…что происходит…смотрю видео курс…но автор так объясняет…коробочки…ящички…лучше бы говорил где объект, для чего…и почему именно объект…Смотрите есть два файла…
первый файл один содержит код:

public class StudentOrder {
    String hFirstName;
    String hLastName;
    String wFirstName;
    String wLastName;
}

второй файл содержит код

public class SaveStudentOrder {
    public static void main(String[] args) {
        StudentOrder so = new StudentOrder();
        so.hFirstName = "Алексей";
        so.hLastName = "Петров";
        so.wFirstName = "Галина";
        so.wFirstName = "Петрова";
        long answ = saveStudentOrder(so);
        System.out.println(answ);
    }

    static long saveStudentOrder(StudentOrder studentOrder) {
        long answer = 199;
        System.out.println("hello My Friend! " + studentOrder.hLastName);
        return answer;
    }
}

Во втором файле(классе) получается мы создаем переменную so…StudentOrder so = new StudentOrder(); - Здесь что происходит создается объект? или что…не понимаю как это работает…почему объект…если изначально переменная…и дальше я так понимаю мы обращаемся к полям so.hFirstName и тд. этого объекта( Правильно ли я понимаю это?) :slightly_smiling_face:

а еще вот здесь не понимаю в параметры положили so.

Так а с числами или строками почему такой вопрос не возникает?

int a = 42;

тоже ж “изначально переменная”.

Только в случае с объектом в ней будет ссылка на объект, а не сам объект.

То есть несколько переменных могут ссылаться на один объект

        StudentOrder so = new StudentOrder();
        StudentOrder so2 = so;
        so.hFirstName = "Алексей";
        System.out.println(so2.hFirstName); // "Алексей";

Просто обычный параметр функции. Как например

a = Math.sqrt(4); // 2

Вместо “объект” можно говорить “экземпляр класса” (instance), может тогда понятнее. То есть класс это как рецепт/шаблон, и по нему можно создать много экземпляров.

1 лайк

Переменная - это имя, которым вы называете участок памяти, в котором находится объект.

Переменную, в которой лежит объект, называют объектом для удобства речи и понимания - вот и все. Ну еще чтоб отличать от простых типов. Потому что переменные простых типов (int, char, double) называют переменными.

new StudentOrder() - это создание объекта, да.

А тут вы говорите, что будете к объекту обращаться so. Вот как с людьми. Если вы в толпе крикните “Эй, ты” - никто же не поймет, к кому вы обращаетесь. А если “Вася” - то повернется только Вася. Единственное отличие - человеку дается имя на всю жизнь, а объекту вы можете давать несколько “имен”, или же забрать у объекта “имя” и назвать им другой объект. Тогда первый объект останется без имени и вы больше не сможете к нему обратиться.

Проиллюстрирую:

StudentOrder Вася = new StudentOrder() - вот мы создали новый объект и сказали, что отныне мы обращаемся к нему “Вася”
StudentOrder Петя = new StudentOrder() - создали еще один объект и будем обращаться к нему “Петя”
StudentOrder Герасим = Вася - теперь мы говорим, что к Васе мы можем обращаться еще и как “Герасим”.
Петя = Вася - а тут мы говорим, что к Васе-Герасиму добавляется обращение “Петя”. Но в программировании не может быть такого, чтоб мы сказали “Петя” - и повернулись два чувака. Поэтому у первого Пети обращение отбирается. Теперь он безымянный. Но он никуда не исчез. Сидит обиженно в углу, занимает оперативную память, и вы не можете ничего с ним сделать.

Передача в параметры функции пусть вас не смущает. С объектами можно сделать все то же, что и с простыми типами.

1 лайк

Откликнутся все кого именовали “Вася”

Называется убежал “Петя” = утечка памяти

1 лайк

Ребят, огромное спасибо вам за разъяснения! Благодарствую! И остаюсь на форуме!

В Джаве сборщик мусора (GC) освободит эту память )

static long saveStudentOrder(StudentOrder studentOrder)

Интересует вот это строка…а именно параметры метода. Первая это входные параметры…мы передаем этому методу…данные типа StudentOrder. (а точнее я так понял…именно структуру которая находится в файле 1. см.выше) А второй параметр studentOrder - автор видео курса говорит, я к этим данным буду обращаться через это имя. т.е studentOrder не понял вот этот момент. обращение через это имя…в интернете полазил…в основном пишут для метода (параметр 1, параметр 2)… :pleading_face:

Это один параметр - вначале указан его тип, а затем внутреннее для метода имя.
А для двух будет что-то вроде (StudentOrder studentOrder1, StudentOrder studentOrder2).

P.S.: если автор курса непонятно объясняет, можно другого попробовать.

Автор курса рассказывает о классах до объяснения просто обычных функций что ли?)

static int sum(int a, int b)
{
    return a + b;
}

Как вариант можно отсюда начать:

https://ru.code-basics.com/languages/java

Видимо автор через чур упрощает…вот впринципе ссылка на урок смотреть с 7 минуты. Урок номер 6 Ну либо я совсем новичек, не совсем все понимаю. До этого объяснения примитивных типов данных.

И даже не обязательно брать другого вместо первого, можно сразу оба.
Разные авторы по-разному объясняют, добавляют разные детали + при повторении станет понятно то, что пропустил/не понял в первый раз.

Спасибо за ссылочки! :+1:

Продолжаем диалог. :hugs:
Поясните что здесь происходит. Если нужен дополнительный код - выложу.
Выделю строку кода, которая не ясна.

static AnswerCityRegister checkCityRegister(StudentOrder so) {
        CityRegisterValidator crv1 = new CityRegisterValidator();
        crv1.hostName = "hostName 1:";
        crv1.login = " root 1";
        crv1.password = "1234";

        CityRegisterValidator crv2 = new CityRegisterValidator();
        crv2.hostName = "hostName 2:";
        crv2.login = " root 2";
        crv2.password = "777";
        **AnswerCityRegister ans1 = crv1.checkCityRegister(so);** - вот это совсем неясно. Жирным код не выделяется к сожалению.
        AnswerCityRegister ans2 = crv2.checkCityRegister(so);
        return ans1;
    }

В переменную ans1 записывается то, что вернула функция checkCityRegister объекта crv1.