Форум программистов, компьютерный форум, киберфорум
Java для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116

Инициализация переменных

08.07.2024, 16:24. Показов 876. Ответов 18
Метки java (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, умники и знатоки!

У меня есть цена товара и я ее в функции высчитываю. ТОваров может быть много, поэтому необходимо сделать итоговую цену.
обЪявила необходимые переменные. Инициализация происходит через set/get.

В изначальной функции создаю объект ИтоговыеПеременные для установки переменных.

Java
1
 setTotalPrice(getTotalPrice() + total);// после второго захода в метод getTotalPrice()=0, хотя должен иметь значение
Я что-то делаю не правильно,а может вообще полностью)

после инициализации и выхода с метода, а потом со второго захода в этот метод getTotalPrice() обнуляется. Я думала, если установлю значение, то оно должно сохранится.

Я думаю глобально не надо делать переменную, значит как поступить?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.07.2024, 16:24
Ответы с готовыми решениями:

Инициализация переменных класса
Какие из способов имеют недостатки и в чем это выражается? Все варианты- переменная для значения объекта. Т.е. в этой переменной будет...

Инициализация переменных
Я новичок в Java, хочу проверить что поля в Java инициализируются по умолчанию. Проверьте плиз...меня смущает что при Run выдает...

Инициализация переменных (Spring)
Инициализация полей осуществляется через <bean> и после вызова контекста получается просто результат <bean id="rect"...

18
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
08.07.2024, 16:40
Ну по идее, нужно не +total делать, а + price, где price это цена добавленного товара.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
08.07.2024, 16:44  [ТС]
Coffeini, total = price * quantity; ))

прикол в том, что set первый раз устанавливает, а после второго вхождения в метод при get переменная TotalPrice = 0, хотя при первом вхождении инициализировалась.

для наглядности
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Класс {
 
private double TotalPrice;
public static double getTotalPrice() {
        return totalPrice;
    }
 
    public static void setTotalPrice(double totalPrice) {
        totalPrice = totalPrice;
    }
 
МЕТОД(){  // идет свой расчет и может несколько раз заходить
 
 
setTotalPrice(getTotalPrice() + total);
 
}
 
}
0
156 / 62 / 16
Регистрация: 12.12.2023
Сообщений: 389
08.07.2024, 16:57
Вы уверены что "при втором заходе" вы в тот же самый экземпляр объекта вообще попадаете, а не пересоздаете его где то случайно? Самая частая причина таких полтергейстов вида "было и пропало"

И то что вы для примера написали принципально не может работать из за static
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
08.07.2024, 17:15  [ТС]
Ewlampiy, объект не новый и это точно. Я изначально насчет этого и подумала. Можно по подробней static,почему нет?
0
156 / 62 / 16
Регистрация: 12.12.2023
Сообщений: 389
08.07.2024, 17:25
static методы не имеют доступа к полям объекта. они могут оперировать только такими же static полями класса, то есть общими для всех объектов
0
 Аватар для Coffeini
753 / 370 / 133
Регистрация: 01.02.2020
Сообщений: 1,096
Записей в блоге: 1
08.07.2024, 17:37
Мне в этом случае вообще не нравится решение через static. Поскольку оно не масштабируемо, типа сделать totalPrice по каким-то groupBy, аля Детские товары, Взрослые. Также операция удаления объекта нетривиальна. Не финализаторы же перегружать.

Типа почему бы не ввести сущность корзинки какой-нибудь:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Basket {
    List<Product> products = new ArrayList<>();
    long totalPrice = 0;
 
    public void add(Product product) {
        products.add(product);
        totalPrice += product.price;
    }
 
    public void remove(Product product) {
        products.remove(product);
        totalPrice -= product.price;
    }
}
 
record Product(int price){
 
}
Цитата Сообщение от OdinNastya Посмотреть сообщение
хотя при первом вхождении инициализировалась.
Тут реальный код бы. А то ваш пример вовсе не рабочий.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
08.07.2024, 17:50  [ТС]
Ewlampiy, значит надо попрбоыатEwlampiy,
Ошиблась в написании у меня переменная тоже static и по этом все равно не работает
0
156 / 62 / 16
Регистрация: 12.12.2023
Сообщений: 389
08.07.2024, 19:16
Ну не видя кода можно только гаданием заниматься. Может вы допустим в конструкторе обнуляете статик поле, тогда создание вообще любого объекта будет обнулять это поле для всех объектов разом
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
08.07.2024, 20:30  [ТС]
Ewlampiy, Coffeini, Сейчас покажу код, которой мне кажется логичен)))
много что убрала, но наверное не то понятие пока,что не вижу ошибку
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
   public static void main(String[] args) {
        Check check = new Check();
        Check.readRecord(); // чтение из файла
    }
}
 
class Check {
 
    public static double getTotalPrice() {
        return totalPrice;
    }
 
    public static void setTotalPrice(double totalPrice) {
        totalPrice = totalPrice;
    }
 
    private static double totalPrice;
 
    public static void readRecord() {
        double x=1;
        double y=2;
        while (x<3){
            formationCh(x,y);
            x++;
        }
 
    }
 
    public static String formationCh(double x, double y) {
        String full;
        double val = y;
        double price = x;
        double total = val * price;
        setTotalPrice(getTotalPrice() + total);
        full= String.valueOf(getTotalPrice());
        System.out.println(full);
        return full;
    }
в set заходит и устанавливает
Миниатюры
Инициализация переменных  
0
156 / 62 / 16
Регистрация: 12.12.2023
Сообщений: 389
08.07.2024, 20:35
Лучший ответ Сообщение было отмечено OdinNastya как решение

Решение

Java
1
Check.totalPrice = totalPrice
У вас параметр присваивается сам себе вместо присваивания полю. Либо делайте разные имена у поля и параметра либо вот с явным указанием класса как выше. Если бы это был нормальны объект без статиков тогда this.totalPrice = totalPrice;

Java
1
Check check = new Check();
А в этом вообще нуль смысла коли у вас все вокруг static. Это static прямо зубную боль вызывает, вас на любом экзамене, собеседовании, сдаче работы и так далее, везде где вы такой код покажете - съедят.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
08.07.2024, 21:03  [ТС]
Ewlampiy, юху, спасибо)
я писала изначально this и оно подсвечивалось,что статик. Я подумала из-за того,что статик, можно this не писать))



хммм,хорошо. Я использую static из-за того,что у меня ругается
что метод надо сделать static, а из-за этого другие методы делаю и переменные
Java
1
2
3
4
5
6
7
8
9
10
  public static void main(String[] args) {
        Scanner sc;
        String filepath = "./src/main/resources/products.csv";
        sc = new Scanner(System.in);
        //расчленение ID
        Check check = new Check();
        Check.readRecord(check.getStrId(), filepath); // чтение из файла  !!!!!! этот метода
 
 
public  void readRecord(String searchTerm, String filepath) { } // сейчас он статичен
Добавлено через 45 секунд
Цитата Сообщение от Ewlampiy Посмотреть сообщение
Это static прямо зубную боль вызывает
как мне от этого избавится
0
4 / 3 / 1
Регистрация: 10.05.2024
Сообщений: 10
08.07.2024, 21:14
Цитата Сообщение от OdinNastya Посмотреть сообщение
как мне от этого избавится
Сходить к стоматологу? Но не вам.

Если вы пишете в процедурном стиле, и это продиктовано этапом обучения или требованием преподавателя — пусть будет static, ничего страшного. Это проблема, если от вас требовали другого, а вы не разобрались.

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

Покажите оригинальный текст задания, тогда может стать понятнее, что от вас ожидается.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
08.07.2024, 21:31  [ТС]
GrafRebro, вообще просят сформировать чек. Данный брать товаров из файла и записать тоже в файл.

Поэтому передаю в функцию public static String formationCh(List strProduct, int i, String allList) { } все для чека, его формирую и возвращаю строку для дальнейшей записи.

На данном этапе надо показать понимание ООП.

Добавлено через 1 минуту
GrafRebro, программа работает и исключение ловит, но сомневаюсь на адекватность кода))
0
4 / 3 / 1
Регистрация: 10.05.2024
Сообщений: 10
08.07.2024, 21:34
Цитата Сообщение от OdinNastya Посмотреть сообщение
На данном этапе надо показать понимание ООП.
Это принципиальный момент, выше я как раз сказал, что решение похоже на процедурное.

Тогда единственный static остается у функции main. Класс Check делаем «накопителем». Например, у класса может быть метод addProduct. Создаем экземпляр класса, читаем данные из файла, и на каждый продукт добавляем данные методом addProduct. Отдельный метод (toString) может возвращать строку.

Это в общих чертах, чтобы не писать решение целиком. В деталях реализации возможны варианты.
0
156 / 62 / 16
Регистрация: 12.12.2023
Сообщений: 389
09.07.2024, 05:21
Цитата Сообщение от OdinNastya Посмотреть сообщение
у меня ругается что метод надо сделать static,
А ругается видимо из за самой первой опечатки

Java
1
Check.readRecord(check.getStrId()...
поменяйте тут первый Check тоже на check и все поменяется обратно
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.07.2024, 10:44  [ТС]
Ewlampiy, точно, спасибо большое

Добавлено через 2 часа 19 минут
Ewlampiy, Вопрос, в каких ситуациях надо создавать объект и через название объекта вызывать его методы, а когда просто название класса и его метод?

Если я общаюсь между нестатическими классами, то можно просто НазваниеКласса.метод?
0
156 / 62 / 16
Регистрация: 12.12.2023
Сообщений: 389
09.07.2024, 11:28
Статические методы - это как правило "утилиты". Ну допустим "округлить сумму до центов". Такому методу не нужно никакой другой информации кроме той суммы что передали в параметре, он "сам по себе" и не привязан ни к какому объекту и его полям. Иногда даже все такие статические методы выносят в отдельный класс, от которого никаких объектов и вовсе не создают. Можно даже специально запретить создавать объекты объявив приватный конструктор.

Ну вот как класс Math например, это просто склад функций типа синус, косинус, округлить. Они и вызываются напрямую как "Math.sin(angle)". А не "new Math().sin(angle)".

А статические поля это чаще всего (не обязательно, но чаще) "константы". public static final double PI = 3.14159265358979323846; "Настоящих" констант в джаве нет, но компилятор достаточно умный чтобы при использовании такого PI сразу его значение подставлять, а не доставать его реально из памяти где оно лежит в статической переменной. Ну или что то такое "одно на всех", пусть и не константа. System.out вот например.

Допустим вы точно знаете что вот этот вот класс, если создавать из него объект, он все равно будет создан только РОВНО ОДИН и ни в коем случае на две или три штуки. Ну например класс MyConfigurationVariablesFromFile. Возникает соблазн тогда все внутри него объявить статиком и вообще объектов не создавать. И все равно даже в таком случае лучше создать объект, "signleton", тем или иным способом защитившись от создания потенциальных повторных экземпляров.

Я говорю не о том, как в джаве вообще "можно", а о том как общепринято, как "сложилось". А возможности писать иначе хоть отбавляй. Но даже если вы всю жизнь в одиночку "для себя" будете писать, все равно всевозможные фреймворки и среды начнут вам палки в колеса вставлять как только вы начнете писать "нетрадиционно". Поставьте какой-нибудь checkstyle и пусть он вас по рукам бьет, хоть и раздражает.
0
0 / 0 / 0
Регистрация: 05.10.2023
Сообщений: 116
09.07.2024, 11:36  [ТС]
Ewlampiy, супер, спасибо большое
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.07.2024, 11:36
Помогаю со студенческими работами здесь

Инициализация static переменных
Есть код class UseStatic { static int a = 3; static int b; static void meth(int x) { ...

Инициализация обычных статических переменных
Добрый вечер. Читаю небезызвестную философию джава. В одной из глав есть пример о порядке иницыализации статических и обычных полей. Код...

Инициализация переменных в операторе Switch
Почему компилятор ругается на дубликат локальной переменной, ведь придерживается ветвление? int a,b; switch (a) { case 1: int...

ООП(зачем нужна инициализация переменных в конструкторе Box)
package pkg1; public class Main { public static void main(String args) { BoxWeight hhh = new BoxWeight(10,20,30,40); ...

Инициализация переменных
Почему при вхождении в метод ссылочные поля не инициализируются дефолтными значениями? SomeComOblect classVar; public Method()...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
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 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru