Модераторы: LSD, AntonSaburov

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оболочки простых типов 
V
    Опции темы
Samotnik
Дата 17.6.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Добрый день!
Любопытно узнать чем отличается запись (в смысле что происходит со значениями)
тут
Код

int x = 3;

и тут
Код

Integer x = new Integer(3);


PM MAIL   Вверх
ekr
Дата 17.6.2007, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


...и это пройдет...
**


Профиль
Группа: Участник
Сообщений: 359
Регистрация: 6.5.2007
Где: Moscow, RU

Репутация: 3
Всего: 19



java.lang.Integer - класс, т.е. x во втором примере - объект, экземпляр класса. У него "внутри" будет свойство типа int со значением 3.
Оболочки (обертки, wrappers) нужны, когда:
1. актуально передавать в методы значения по ссылке
2. у классов-оберток куча полезных утилитарных методов, например парсинг строки в число


--------------------
и это пройдет....

http://ekrs.blogspot.com
PM WWW   Вверх
w1nd
Дата 17.6.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



+reflection (простые типы не являются объектами).


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
batigoal
Дата 17.6.2007, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Нелетучий Мыш
****


Профиль
Группа: Участник Клуба
Сообщений: 6423
Регистрация: 28.12.2004
Где: Санктъ-Петербургъ

Репутация: 24
Всего: 151



Вплоть до Java 5, класть в коллекции простые типы было невозможно. Это тоже делалось с помощью обёрток. Однако сейчас этого ограничения нет.


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли)
ЖоржЖЖ
PM WWW   Вверх
Samotnik
Дата 17.6.2007, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



2 all
Пасибо вам за ответ, просто я это знаю все,  я в шилде и ноутоне прочитал  smile   Т.е. простые данные передаются по значению, а обьекты поссылке. Это все понятно.
Так вот вопрос(просто сразу не обьяснил, время не было):
Сматрите:
Код

int x=3;

Это значит, если значение икс, передать в метод(ну допустим x++) то оно не измениться, т.е. измениться только копия, с кот мы будем работать, так?!?!?
А вот если
Код

Integer x = new Integer(3);

То это означает, если передать значение в метод(x++), то значение измениться, т.к. переданно по ссылке(т.е. работаем непосредственно с самим значением икса)  Так?!?!?
И вот что получается, я набрасал примерчик элементарный
Код

class A 
{
    public Integer v = new Integer(3);
    public int k = 15;
        
  int dekr()
    {v++;
        return v;
                
        }
        int dekrnow()
        {
            for(int i=0; i<10;i++)
            {
                v++;
                }
                return v;
            }
            
            int fds()
            {
                k=14;
                return k;
                }
                
                int sd()
                {
                    k++;
                return k;
                    }
        A(){}
}
class B  extends A
{
    int vklasseb()
    {    
        return k;
        }
        
        int asechas()
        {
            
            return v;
            }
    }
    public class Andr
{
    public static void main(String args[]) 
{

    A obj3 = new A();
    B obj4 = new B();
    
    Integer q = new Integer(100);
    
    int vol, interesno;
                        

System.out.println("Now is" + obj3.dekr());
System.out.println("Wat's up" + obj3.dekrnow());
System.out.println("sdf" + obj3.fds());
System.out.println("sf" + obj3.sd());
System.out.println("sf" + obj4.vklasseb());
System.out.println("sf" + obj4.asechas());
}
}

И в итоге получилось, что и по ссылке и по значению, получается одинаковый результат  smile 
Может я че не понимаю? Просто интересен вопрос очень!!!  обьясните плз, кто знает!!
PM MAIL   Вверх
LSD
Дата 17.6.2007, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15719
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



Цитата(batigoal @  17.6.2007,  16:29 Найти цитируемый пост)
Вплоть до Java 5, класть в коллекции простые типы было невозможно. Это тоже делалось с помощью обёрток. Однако сейчас этого ограничения нет.

На самом деле там происходит скрытый враппинг, и об этом не стоит забывать. Там можно и NullPointerException получить, плюс накладные расходы.


Цитата(Samotnik @  17.6.2007,  17:26 Найти цитируемый пост)
Это значит, если значение икс, передать в метод(ну допустим x++) то оно не измениться, т.е. измениться только копия, с кот мы будем работать, так?!?!?А вот если
....

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
nornad
Дата 17.6.2007, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(Samotnik @  17.6.2007,  19:26 Найти цитируемый пост)
И в итоге получилось, что и по ссылке и по значению, получается одинаковый результат

А где ты передаёшь по ссылке и где по значению? Я даже уточню, чтобы понятнее было - где ты вообще хоть что-то передаёшь?

Цитата(Samotnik @  17.6.2007,  19:26 Найти цитируемый пост)
Может я че не понимаю?

Вот уж в самую точку попал.

Теперь по поводу сути твоего вопроса.
Если коротко и ясно:
Код

public class RefTest {
  public static void test1( int val ) { val = val + 1; }
  public static void test2( Integer val ) { val = val + 1; }
  public static void test3( Test3 val ) { val.test3 = 1; }
  public static void main( String[] args ) {
    int t1 = 0;
    test1( t1 );
    System.out.println( t1 );
    Integer t2 = 0;
    test2( t2 );
    System.out.println( t2 );
    Test3 t3;
    test3( t3 );
    System.out.println( t3 );
  }
}
class Test3 { public int test3 = 0; }

Возможно, придётся немного подправить, т.к. писал вслепую и мог опечататься. smile 


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Samotnik
Дата 17.6.2007, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



2 LSD
А что такое врапперы?   smile 

2 nornad
Код ошибку выдавал, вот тута
Код

class Test3 { public int test3 = 0; }

Но это не важно, я закоментил, все что связанно с тест3. Получилось, что 2 метода(1, 2) выдавали один и тот же результат! 

Цитата(nornad @  17.6.2007,  18:44 Найти цитируемый пост)
А где ты передаёшь по ссылке и где по значению?

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


PM MAIL   Вверх
nornad
Дата 18.6.2007, 01:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(Samotnik @  18.6.2007,  02:17 Найти цитируемый пост)
Но это не важно

В том-то всё и дело, что важно. smile
Цитата(Samotnik @  18.6.2007,  02:17 Найти цитируемый пост)
Просто я думал, что в Java автоматически передаються аргументы

Куда они должны передаваться? У меня подозрения, что ты не понимаешь основ - чтобы аргументы передавались хоть как-то, они должны хотя бы вообще быть.  smile 
А у тебя они где? Ну, покажи хоть один? Кроме неявного this, который всегда по ссылке. smile
Цитата(Samotnik @  18.6.2007,  02:17 Найти цитируемый пост)
Код ошибку выдавал, вот тута

Mea culpa... Хотя, ошибку он выдал и не совсем там - я забыл инициализировать переменную, да и выводить надо было не её, а её поле.  smile 
Исправляю:
Код

public class RefTest
{
    public static void test1( int val ) { val = val + 1; }

    public static void test2( Integer val ) { val = val + 1; }

    public static void test3( Test3 val ) { val.test3 = 1; }

    public static void main( String[] args ) {
        int t1 = 0;
        test1(t1);
        System.out.println(t1);
        Integer t2 = 0;
        test2(t2);
        System.out.println(t2);
        Test3 t3 = new Test3();
        test3(t3);
        System.out.println(t3.test3);
    }
}

class Test3
{
    public int test3 = 0;
}


Добавлено через 2 минуты и 10 секунд
Цитата(Samotnik @  18.6.2007,  02:17 Найти цитируемый пост)
А что такое врапперы?

Враппер - wrapper - объект-обёртка. В моём примере Test3 как раз и есть враппер. Другое дело, что его суть не сильно информативна, но для примера сойдёт.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Samotnik
Дата 18.6.2007, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



Цитата(nornad @  18.6.2007,  01:16 Найти цитируемый пост)
У меня подозрения, что ты не понимаешь основ - чтобы аргументы передавались хоть как-то, они должны хотя бы вообще быть.

Ну допустим так... 
Тогда возьмем пример
Код

public void print(int x)
{
x++;
}
..  main()..
{
int q = 1;
print(q);
System.out.println("q=" + q);
}

Это по вашему передача аргумента??
PM MAIL   Вверх
Samotnik
Дата 18.6.2007, 03:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



2 nornad
Все!! с кодом разобрался, и все понял, теперь хотелось бы вернуться к началу  smile .
Знчит, возьмем твой пример. Результат его следущий : 0, 0, 1. 
Т.е. получается, что по значению передались int x и Integer x, а обьект как ему и положено передался по ссылке, и соотвно значение изменилось. 
Внимание вопрос: 
Почему Integer x передался по значению, ведь это ОБОЛОЧКА и соответственно должен являться объектом и передоваться по ссылке, как и пологается всем обьектам? 
Ведь даже создался обьект
Код

 Integer t2 = 0;
...

А передалось по значению, а не по сылке ?!?!   Меня вот этот вопрос интересовал, то что если написать int x; или  Integer x; (ну и передовать их дальше есстно) получается разницы ни какой? В любом случае передается все по значению, так?
PM MAIL   Вверх
nornad
Дата 18.6.2007, 06:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(Samotnik @  18.6.2007,  06:03 Найти цитируемый пост)
Т.е. получается, что по значению передались int x и Integer x, а обьект как ему и положено передался по ссылке

Не совсем. smile
int - по значению.
Integer и Test3 - по ссылке, как и все объекты.
Но! Важный момент - ссылка в жабе это далеко не то же самое, что и ссылка в си. Саму ссылку ты здесь изменить не можешь (потому-то случай с Integer работает, как и с int), но можно изменить поля объекта, на который ссылается эта ссылка (поэтому вариант с Test3 сработал).


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
Samotnik
Дата 18.6.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Super star !
****


Профиль
Группа: Awaiting Authorisation
Сообщений: 7192
Регистрация: 4.11.2006
Где: Минск City

Репутация: 8
Всего: 191



2 nornad
Вот теперь  понятно!!!  smile   
Только это .....
Цитата(nornad @  18.6.2007,  06:39 Найти цитируемый пост)
Саму ссылку ты здесь изменить не можешь (потому-то случай с Integer работает, как и с int), но можно изменить поля объекта, на который ссылается эта ссылка (поэтому вариант с Test3 сработал)

Вопрос 1:
Что такое поле обьекта, и почему его можно изменить?
Вопрос 2:
Integer x вообще никаким способом передать нельзя, чтобы она сработала как НАСТОЯЩИЙ обьект, и изменила свое значение???

PM MAIL   Вверх
nornad
Дата 18.6.2007, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1079
Регистрация: 16.2.2007
Где: в Караганде

Репутация: 16
Всего: 31



Цитата(Samotnik @  18.6.2007,  14:47 Найти цитируемый пост)
Что такое поле обьекта

В примере это Test3.test3 (интовое поле, инициализирующееся нулём).

Цитата(Samotnik @  18.6.2007,  14:47 Найти цитируемый пост)
почему его можно изменить?

Потому что мы передаём в метод ссылку на объект. Саму ссылку менять нельзя, но можно менять данные, на которые она ссылается.

Цитата(Samotnik @  18.6.2007,  14:47 Найти цитируемый пост)
Integer x вообще никаким способом передать нельзя, чтобы она сработала как НАСТОЯЩИЙ обьект, и изменила свое значение???

Напрямую - нет. Сделай обёртку (скажем, IntegerX), которая будет содержать поле Integer x и передавай её, если так уж надо. Но! Изменение принимаемого параметра есть плохой стиль. Здесь вам не тут и не надо использовать подход чистого си  (даже в с++ не рекомендуется таким заниматься). В подавляющем большинстве случаев необходимость изменения входящего параметра (с неявным возвратом значения) вызвана отсутствием проектировки и кривыми руками кодера.


--------------------
Три достоинства программиста: Леность, Нетерпение и Гордость
Ларри Уолл
PM MAIL WWW ICQ Skype MSN   Вверх
fixxer
Дата 18.6.2007, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 672
Регистрация: 14.9.2006
Где: Саратов, Россия

Репутация: 6
Всего: 27



Цитата из http://skipy.developer.juga.ru/technics/references.html

Цитата

Несколько слов о вопросе, который вызывает много споров. А именно - как передаются параметры-объекты, по значению или по ссылке. С одной стороны - содержимое объекта не копируется, потому вроде как передача происходит по ссылке. Но с другой стороны - сама ссылка (значение области памяти, занимаемой переменной типа ссылка) КОПИРУЕТСЯ во фрейм вызова, как я уже упоминал выше. Т.е. вроде как передается по значению. Это порождает некую путаницу.

На мой взгляд все упирается в один вопрос - на каком уровне абстракции мыслить. Можно думать о ссылке как о ячейке памяти, в которой находится адрес объекта, и тогда ссылка, естественно, передается по значению - содержимое копируется. А можно думать просто об объекте. И знать при этом, что при передаче объекта в качестве параметра реально передается ссылка на него. И что эта ссылка - копия исходной (если она была). В принципе, этого более чем достаточно. Нужно просто понимать то, что из такого представления вытекает. Именно это я и описывал в данной статье.

Мне ближе мышление именно на уровне объектов. Да, я знаю всю эту кухню, но думать о ней каждую секунду мне совсем необязательно. Я передаю ссылку на объект. И с таким представлением проблем у меня пока не было. А все эти споры по поводу действительного способа передачи - по большей части религиозные. Каждый может представлять себе процесс так, как наиболее близко ему. И если это не мешает работе - то и Бог с ним!



--------------------
user posted image
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0651 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.