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

Работа с классами

13.05.2014, 23:43. Показов 1229. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Давно делал программы с множеством классов, но вот нашол проблему.. Объясните где ошибка...
Java
1
2
3
4
5
6
7
8
public class Test {
    public static void main (String [] args) {
        int a = 5;
        Test2 t = new Test2 (a);
        t.mmm();
        System.out.println(a);
    }
}
Java
1
2
3
4
5
6
7
8
9
10
public class Test2 {
    int k;
    Test2 (int r) {
        this.k = r;
    }
     
    public void mmm () {
        k=0;
    }
}
Вот два маленьких класса.. В главном классе создается экземпляр Test2 и переменная "а" в главном классе через конструктор переприсваивается локальной переменой k в Test2... Вызывается метод mmm который изменяет локальную переменную k.. И выводится "a" в главном классе.. Выводит ожиданий результат a=5...
А вот следующий пример аналогичен, но с матрицами..
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Test {
    public static void main (String [] args) {
        double [][] A = {
                {1,2,3,4},
                {5,6,7,8},
                {9,10,11,12},
                {13,14,15,16}
            };
        Test2 t = new Test2 (A);
        t.mmm();
    
        for (int i=0;i<A.length;i++){
            System.out.println();
            for(int j=0;j<A[i].length;j++) 
                System.out.print(A[i][j]+"  ");
    }
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
public class Test2 {
    double[][] tt;
    
    Test2 (double r[][]) {
        this.tt = r;
    }
     
    public void mmm () {
        tt[2][2]=2;
    }
}
Выводит результат где A[2][2] = 2... Почему?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.05.2014, 23:43
Ответы с готовыми решениями:

Работа с Классами
Реализовать класс Bankomat, моделирующий работу банкомата. В классе должны содержаться поля для хранения идентификационного номера...

Работа с классами
Уважаемые профи помогите с решением задачи и подскажите,что ДЕЙСТВИТЕЛЬНО СТОИТ почитать по Java, чтобы в голове всё укладывалось по...

Работа с классами
Работа с классами Создать классы, спецификации которых приведены ниже. определить кон- структоры и методы setТип () getТип ()...

6
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
14.05.2014, 00:49
Sluva1410, потому что массив - это объект.
Для работы с объектами используются ссылки

Каждый язык программирования имеет свои средства манипуляции данными. Иногда программисту приходится быть постоянно в курсе, какая именно манипуляция производится в программе. Вы работаете с самим объектом или же с каким-то видом его косвенного представления (указатель в C или в C++), требующим особого синтаксиса? Все эти различия упрощены в Java. Вы обращаетесь со всем как с объектом, и поэтому повсюду используется единый последовательный синтаксис. Хотя вы обращаетесь со всем как с объектом, идентификатор, которым вы манипулируете, на самом деле представляет собой ссылку на объект. Представьте себе телевизор (объект) с пультом дистанционного управления (ссылка). Во время владения этой ссылкой у вас имеется связь с телевизором, но при переключении канала или уменьшении громкости вы распоряжаетесь ссылкой, которая, в свою очередь, манипулирует объектом. А если вам захочется перейти в другое место комнаты, все еще управляя телевизором, вы берете с собой «ссылку», а не сам телевизор. Также пульт может существовать сам по себе, без телевизора. Таким образом, сам факт наличия ссылки еще не означает наличия присоединенного к ней объекта.

Особый случай: примитивные типы

Одна из групп типов, часто применяемых при программировании, требует особого обращения. Их можно назвать «примитивными» типами (табл. 2.1). Причина для особого обращения состоит в том, что создание объекта с помощью new — особенно маленькой простой переменной — недостаточно эффективно, так как new помещает объекты в кучу. В таких случаях Java следует примеру языков C и C++. То есть вместо создания переменной с помощью new создается «автоматическая» переменная, не являющаяся ссылкой. Переменная напрямую хранит значение и располагается в стеке, так что операции с ней гораздо производительнее.
В Java размеры всех примитивных типов жестко фиксированы. Они не меняются с переходом на иную машинную архитектуру, как это происходит во многих других языках. Незыблемость размера — одна из причин улучшенной переносимости Java-npoгpaмм.

Массивы в Java

Фактически все языки программирования поддерживают массивы. Использование массивов в C и C++ небезопасно, потому что массивы в этих языках представляют собой обычные блоки памяти. Если программа попытается получить доступ к массиву за пределами его блока памяти или использовать память без предварительной инициализации (типичные ошибки при программировании), последствия могут быть непредсказуемы.
Одной из основных целей Java является безопасность, поэтому многие проблемы, досаждавшие программистам на C и C++, не существуют в Java. Массив в Java гарантированно инициализируется, к нему невозможен доступ за пределами его границ. Проверка границ массива обходится относительно дорого, как и проверка индекса во время выполнения, но предполагается, что повышение безопасности и подъем производительности стоят того (к тому же Java иногда может оптимизировать эти операции). При объявлении массива объектов на самом деле создается массив ссылок, и каждая из этих ссылок автоматически инициализируется специальным значением, представленным ключевым словом null. Оно означает, что ссылка на самом деле не указывает на объект. Вам необходимо присоединять объект к каждой ссылке перед тем, как ее использовать, или при попытке обращения по ссылке null во время исполнения программы произойдет ошибка. Таким образом, типичные ошибки при работе с массивами в Java предотвращаются заблаговременно.
Также можно создавать массивы простейших типов. И снова компилятор гарантирует инициализацию — выделенная для нового массива память заполняется нулями. Массивы будут подробнее описаны в последующих главах. В большинстве языков программирования концепция жизненного цикла переменной требует относительно заметных усилий со стороны программиста. Сколько «живет» переменная? Если ее необходимо удалить, когда это следует делать? Путаница со сроками существования переменных может привести ко многим ошибкам, и этот раздел показывает, насколько Java упрощает решение затронутого вопроса, выполняя всю работу по удалению за вас.

Добавлено через 5 минут
Пардон, забыл указать источник:
Кликните здесь для просмотра всего текста
http://wikijava.org.ua/index.php?title=Thinking_in_Java_4th_edi tion
0
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 3
14.05.2014, 01:20  [ТС]
Тогда надо делать еще один массив что бы передать его в другой класс?? Мне нужно работать с массивом в другом классе, но чтобы в главном классе он был неизменен...
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
14.05.2014, 01:22
Sluva1410, тогда еще проще. Это:
Java
1
2
3
Test2 (double r[][]) {
        this.tt = r;
}
заменяем на:
Java
1
2
3
Test2 (double r[][]) {
        this.tt = r.clone();
}
0
0 / 0 / 0
Регистрация: 13.05.2014
Сообщений: 3
14.05.2014, 02:06  [ТС]
Поменял.. Не помогло.. Все равно меняется...
0
173 / 131 / 74
Регистрация: 04.12.2013
Сообщений: 552
14.05.2014, 10:18
Sluva1410, ок. Тогда:
Java
1
2
3
4
5
6
7
8
9
Test2 (double[][] r) {
        
        tt = new double[r[0].length][r.length];
        
        for (int i = 0; i < r.length; i++){
            for(int j=0;j<r[i].length;j++) 
                tt[i][j] = r[i][j];
    }
    }
0
14.05.2014, 10:57

Не по теме:

Цитата Сообщение от Prorok2323 Посмотреть сообщение
заменяем на:
прикол в том, что таким образом клонируется только первая строка двухмерного массива - она действительно будет клоном и в ней можно менять значения

что бы клонировать двумерный массив можно пробежать по строкам и вызвать на каждой clone()

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2014, 10:57
Помогаю со студенческими работами здесь

Работа с классами
Нужна помощь. Не могу понять в чем ошибка,так как еще новичек.Помогите пожалуйста. Вот ,что пишет компилятор: Exception in thread...

Работа с классами в Java
Добрый день.Задача:Описать класс с именем Route, содержащий следующие поля: название начального пункта маршрута, название конечного пункта...

Работа с абстрактными классами
Создать абстрактный класс Currency (валюта) для работы с денежными суммами. Определить абстрактными методы перевода в рубли и вывода на...

Работа между классами
Есть главный класс main.java, есть класс pampam.java, созданный отдельно путем &quot;new&quot;-&gt;&quot;Java class&quot;... Как можно вызвать из main,...

Работа с классами и объектами
Необходимо вывести на экран перечень стран, у которых: 1) площадь больше или равна введенному пользователем с клавиатуры значению; 2)...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru