powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / ошибки начинающих java-программистов
25 сообщений из 69, страница 2 из 3
ошибки начинающих java-программистов
    #33353163
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Denis PopovДавай его в FAQ, а в ТОПЕ указать первым пунктом, хорошенько выделив.готово:

http://www.sql.ru/faq/faq_topic.aspx?fid=566
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353166
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyа еще в топе 2 раза пункт "2", а пункта "3" нет
давно туда смотрел? :)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353217
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.ГрасоffT wrote:

> готово: http://www.sql.ru/faq/faq_topic.aspx?fid=566

Поместил. ИМХО неплохо бы рекомендации по книгам дополнить.
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353247
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопиющая несправедливость! а где указан переводчик и спасибо ему?????

и еще по пункту 9: его надо исправить в соответствии с комментарием в
конце фака

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353251
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deady
> вопиющая несправедливость! а где указан переводчик и спасибо ему?????


о, увидел. в самом начале мелкими буквами :-))))))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353253
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyвопиющая несправедливость! а где указан переводчик и спасибо ему?????
what's up man???

http://www.sql.ru/faq/faq_topic.aspx?fid=566

PS конец топика прочитал, а начало???
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353255
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyвопиющая несправедливость! а где указан переводчик и спасибо ему?????
PS спасибо :)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353588
0sya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deady 10. Использование объектов класса String как параметров метода.

В Java класс java.lang.String хранит строковые данные. Однако, строки в Java
(1) обладают постоянством (то есть их нельзя изменять),
(2) являются объектами.

Поэтому с ними нельзя обращаться как просто с буфером символов, это
неизменяемые объекты. Иногда студенты передают строки, ошибочно
расчитывая на то, что строка-объект будет передана как массив символов
по ссылке (как в C или C++). Компилятор обычно не считает это ошибкой.

Ошибочный пример .
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 public   static   void  main(String args[]) {
   String test1 = "Today is ";
   appendTodaysDate(test1);
   System.out.println(test1);
}

/* прим. редактора: закомментированный метод должен иметь модификатор
    static (здесь автором допущена ошибка №9)
public void appendTodaysDate(String line) {
    line = line + (new Date()).toString();
}
*/

 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

В примере выше студент хочет изменить значение локальной переменной test1,
присваивая новое значение параметру line в методе appendTodaysDate.
Естественно это не сработает. Значение line изменится, но значение test1
останется прежним.

Эта ошибка возникает из-за непонимания того, что (1) java объекты всегда
передаются по ссылке и (2) строки в Java неизменяемы. Нужно осмыслить, что
объекты-строки никогда не изменяют своего значения, а все операции над
строками создают новый объект.

прим. перев.вообще-то понять в чем ошибка не так просто.
так как объекты передаются по ссылке, то значит line ссылается туда же,
куда и test1. А значит создавая новый line, мы создаем новый test1.
в неправильном примере все выглядит так, как будто передача String идет
по значению, а не по ссылке.

Так что, String передается по значению? Или по ссылке, но не изменяется? В чем конкретно ошибка?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353611
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
0sya

> Так что, String передается по значению? Или по ссылке, но не
> изменяется? В чем конкретно ошибка?



в чем ошибка, описано в тексте - попытка измениить immutable.
в Java все объекты передаются по ссылке, а String неизменяем.

в итоге создается иллюзия передачи String по значению, а как это
сделано - для меня немного непонятно. Обсуждал это с другими
программерами. Думаю причина моего недопонимания - в том, что в Java
нет указателей, а я пытаюсь трактовать данный пример с точки зрения
указателей. Например, в C++ или Pascal данный пример точно бы
изменил строку.

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353671
jdev333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353696
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).и?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353699
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdev333
> public static void appendTodaysDate(String line) { line = line + (new Date()).toString();}

> переменной line присваивается ссылка на только что созданный
> новый объект (конкатенация строк line и текущей даты). Ссылка на
> старый (неизменившийся) объект ("Today is ") утеряна (внутри данного
> метода).Тема==Ответить




в конце концов я к этому и пришел )))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353740
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ jdev333
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).и?

тут еще наверное нужно знать, что когда объект передается в метод по ссылке, то на этот объект создается еще одна временная ссылка, именно с этой временной ссылкой и происходит работа в методе. В данном случае, новое значение (line + (new Date()).toString()) присвоено именно такой ссылке, которая при выходе из метода была убита, а иначе бы переменная line (глобальная), изменилась бы, даже несмотря на то, что создался новый объект.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353746
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen А.Грасоff™ jdev333
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).и?

тут еще наверное нужно знать, что когда объект передается в метод по ссылке, то на этот объект создается еще одна временная ссылка, именно с этой временной ссылкой и происходит работа в методе. В данном случае, новое значение (line + (new Date()).toString()) присвоено именно такой ссылке, которая при выходе из метода была убита, а иначе бы переменная line (глобальная), изменилась бы, даже несмотря на то, что создался новый объект.
и? ты это все к чему вообще пишешь?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353779
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ wessen А.Грасоff™ jdev333
Код: plaintext
1.
2.
 public   static   void  appendTodaysDate(String line) {
    line = line + ( new  Date()).toString();
}

переменной line присваивается ссылка на только что созданный новый объект (конкатенация строк line и текущей даты). Ссылка на старый (неизменившийся) объект ("Today is ") утеряна (внутри данного метода).и?

тут еще наверное нужно знать, что когда объект передается в метод по ссылке, то на этот объект создается еще одна временная ссылка, именно с этой временной ссылкой и происходит работа в методе. В данном случае, новое значение (line + (new Date()).toString()) присвоено именно такой ссылке, которая при выходе из метода была убита, а иначе бы переменная line (глобальная), изменилась бы, даже несмотря на то, что создался новый объект.
и? ты это все к чему вообще пишешь?

вот тут человеку не совсем все понятно
Deady
в чем ошибка, описано в тексте - попытка измениить immutable.
в Java все объекты передаются по ссылке, а String неизменяем.

в итоге создается иллюзия передачи String по значению, а как это
сделано - для меня немного непонятно. Обсуждал это с другими
программерами. Думаю причина моего недопонимания - в том, что в Java
нет указателей, а я пытаюсь трактовать данный пример с точки зрения
указателей. Например, в C++ или Pascal данный пример точно бы
изменил строку.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353827
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessenвот тут человеку не совсем все понятно:)
а он об этом знает?
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353836
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А.Грасоff™ wessenвот тут человеку не совсем все понятно:)
а он об этом знает?
о чем? о том, что ему чего то не понятно? :)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353839
Фотография А.Грасоff™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen А.Грасоff™ wessenвот тут человеку не совсем все понятно:)
а он об этом знает?
о чем? о том, что ему чего то не понятно? :)да
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33353842
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wessen
> А.ГрасоffT wessenвот тут человеку не совсем все понятно:)
> а он об этом знает?
> о чем? о том, что ему чего то не понятно? :)Тема==Ответить




вы гоните. вроде еще только понедельник. я уже примерно все понял,
что и как. )))))

-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354149
Osya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Deadyвы гоните. вроде еще только понедельник. я уже примерно все понял, что и как. )))))
Ну так объясни пожалста. :-)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354555
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Osya
Ну так объясни пожалста. :-)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
public string s = "";
static {
   appendTodaysDate(s);
}
public static void appendTodaysDate(String line) {
    line = line + (new Date()).toString();
}  

как я понял:
пусть s указывает на адрес в куче: xxx.
в момент вызова создастся новая переменная line, которая указывает на
тот же адрес xxx.
теперь на xxx указывают 2 переменные.
при присваивании line нового значения создается новый объект String с
адресом yyy, и line указывает на него. а s по прежнему указывает на
xxx. Собственно поэтому метод и не работает так, как нужно.
А создается новый объект с новым адресом, потому что String реализует
паттерн Immutable.
при компиляции этой строки:
Код: plaintext
1.
line + (new Date()).toString();
компилятор заменит ее на что-то типа
Код: plaintext
1.
line = new StringBuffer().append(line).append(new Date().toString()).toString()

с обычными объектами такой номер не пройдет, потому что они не
реализуют Immutable. то есть, например:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
public class Test {

        public static void main(String[] args) {
                Person person = new Person();
                System.out.println("Person before: "+person);
                setNewAge(person);
                System.out.println("Person after: "+person);
        }

        public static void setNewAge(Person person) {
                person.setAge( 20 );
        }
}

class Person {
        private int age =  0 ;
        public int getAge () { return age; }
        public void setAge(int age) { this.age = age; }
        public String toString() {
                return "person: age="+age;
        }
}

выведет:
Код: plaintext
1.
2.
3.
4.
5.
---------- run java class ----------
Person before: person: age= 0 
Person after: person: age= 20 

Output completed ( 0  sec consumed) - Normal Termination
-----------------------------------
The Bat + My Gate

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354617
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
объясни тогда вот это:

Код: plaintext
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  Test {

         public   static   void  main(String[] args) {
                Person person =  new  Person();
                System.out.println("Person before: "+person);
                setNewAge(person);
                System.out.println("Person after: "+person);
        }

         public   static   void  setNewAge(Person person) {
                Person p =  new  Person();
                p.setAge( 10 );
                person = p;
        }
}

 class  Person {
         private   int  age =  0 ;
         public   int  getAge () {  return  age; }
         public   void  setAge( int  age) {  this .age = age; }
         public  String toString() {
                 return  "person: age="+age;
        }
}

Код: plaintext
1.
Person before: person: age= 0 
Person after: person: age= 0 
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354699
Фотография Penkov Vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так все понятно. person в сигнатуре метода - это копия переменной person из main, указывающей на объект, оперделенный в main. если мы обращаемся по этой переменной, то фактически обращаемся к старому объекту. если же мы присваиваем ей новое значение, то укывать она будет на новый объект, и работать мы будем с новым объектом. при этом указатель на старый объект не изменится.
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354822
Фотография Timm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все. догнал :-)
вот тут хорошо разжевано.
Ура. всё передается по значению :-)
...
Рейтинг: 0 / 0
ошибки начинающих java-программистов
    #33354824
wessen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deadyтак все понятно. person в сигнатуре метода - это копия переменной person из main, указывающей на объект, оперделенный в main. если мы обращаемся по этой переменной, то фактически обращаемся к старому объекту. если же мы присваиваем ей новое значение, то укывать она будет на новый объект, и работать мы будем с новым объектом. при этом указатель на старый объект не изменится. ... и поэтому, immutable здесь не причем.
...
Рейтинг: 0 / 0
25 сообщений из 69, страница 2 из 3
Форумы / Java [игнор отключен] [закрыт для гостей] / ошибки начинающих java-программистов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]