Перейти к содержимому

Фотография

Курсы по JAVAкуда пойти учиться???


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 121

#21
Klaymen

Klaymen
  • Свой человек
  • 516 сообщений
Поясните пожалуйста, что значит "виртуальные функции"?

Вообще-то в Java эти самые функции принято называть методами.
  • 0

#22
Klaymen

Klaymen
  • Свой человек
  • 516 сообщений

Java завоевал популярность благодаря двум главным преимуществам: 1) своей независимости от платформы (теоретически, одна и таже программа без всякой переделки может работать под Linux, Windows, Macintosh и т.д.) и 2) своей доступности: Java SDK можно было бесплатно загрузить с сервера Sun.

Однако на практике все оказалось не так-то просто. Красивый лозунг, придуманный для Java "Написано один раз - запускается везде" вскоре многие разработчики стали произносить с разочарованием и иронией: "Написано один раз - отлаживать надо везде" :)

Каждый программист знает, что тестировать программы нужно всегда. Независимо от того, на сколько профессионально они сделаны. То количество ошибок, которое может возникнуть при тестировании на разных ОС, зависит от уровня граммотности разработчика, т.к. все известные проблемы можно сразу учитывать во время разработки.

А бесплатность тоже, как оказалось, имеет свои пределы. Для настоящей профессиональной работы на Java все равно понадобятся коммерческие пакеты. Доказательством этого являются популярные пакеты Visual Cafe, Visual Age и JBuilder.

Никто из начинающих не будет сразу заниматься так называемыми настояшими профессиональными работами, так что на первые 2-3 года каждый начинающий обеспечен бесплатным ПО в виде Eclipse или NetBeans.

Кроме того, сам язык Java, хотя и значительно более упорядочен по сравнению с очень похожим на него С++, но именно этот строгий порядок, дисциплина, обернулись ограничением свободы разработчика:[list]

Мне пока известно, что есть ограничения в области DirectX, но над этим люди работают.

Java, в отличие от С++, не поддерживает указатели. Работа напрямую с памятью невозможна, зато повышается безопасность работы приложений (иногда в ущерб быстродействию).

Если не ошибаюсь. то в С++ можно выйти за рамки размера массива, что приведет к непредсказуемым поведениям программы.

Среда Java предоставляет механизм сборки "мусора", который предотвращает утечки памяти.

Ни один нормальный Java программист не надеется на сборщик мусора на все 100%. Но, в то же время, опытному Java программисту, открываются тайны, как более граммотно избегать утечек памяти. Например, правильное использование слушателей.

Java, в отличие от С++, не поддерживает перегрузку операторов.

Если под операторами понимаются поля класса, то, используя принцип инкапсуляции, переопределять их просто нет смысла. Но можно, создав их как public.

Java является полностью объектно-ориентированным языком. Это значит, все функции должны определяться в области видимости класса. Глобальные функции не допускаются - значит, программист на Java не может применять процедурное программирование (тогда как в С++ глобальные данные и функции допускаются, и процедурное программирование всегда возможно, хотя С++ при этом полностью объектно-ориентированный язык).

Глобальные функции допускаются и называются они статическими методами.
Процедурное программирование в Java просто не нужно. Нет смысла.

Java поставляется в комплекте с обширной иерархией классов, это одновременнно и достоинство, и недостаток (легче вести разработку, но в то же время выше зависимость разработчика от готовых классов).

Все (или почти все, т.к. есть еще темные места в области безопасности) имеющиеся классы в Java можно переопределить задав им нужные свойства.
  • 0

#23
T. Anre

T. Anre

    Data Miner

  • В доску свой
  • 2 327 сообщений

Поясните пожалуйста, что значит "виртуальные функции"?

Вообще-то в Java эти самые функции принято называть методами.

или функциями-членами.

Точно самое время вводить определения:
Если метод класса может быть переопределен в классах-наследниках и при этом реализация метода определяется во время исполнения, то данный метод можно смело назвать - virtual.

Сообщение отредактировал T. Anre: 07.11.2006, 12:15:07

  • 0

#24
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
2 Klaymen:

Поясните пожалуйста, что значит "виртуальные функции"?

Вообще-то в Java эти самые функции принято называть методами.


1. Определение виртуальных функций уже достаточно хорошо дано T. Anre, оно правильное, но слишком краткое, суть виртуальных функций может остаться непонятной. Ключевыми словами здесь являются "реализация метода определяется во время исполнения". Отметим, что в производном классе ничто не мешает перекрыть и те функции базового класса, которые в базовом классе не были объявлены виртуальными. И такое перекрытие функций (точнее, их скрытие в производном классе) иногда бывает необходимо.

При вызове виртуальной функции необходимо делать проверки во время выполнения, чтобы определить, какой из перекрывающихся методов нужно вызвать. Но для невиртуальных функций эта информация доступна во время компиляции (компилятор может определить соответствующий перекрывающий метод по типу объекта, на который объявлена ссылка). А для виртуальных функций это невозможно: объектная переменная может указывать на базовый класс B, но компилятор ведь позволяет такой переменной хранить ссылку и на любой класс D, производный от B (на стадии компиляции это неизвестно!). В таком случае вызываться будет виртуальная функция базового класса - если она не была перекрыта в производном классе - а если была, то будет вызвана перекрывающая ее функция объекта производного класса - и только путем поиска адреса этой функции в таблице виртуальных функций vtable. Так-то. :)

2. Каждая функция - это метод. Но методы - это лишь часть функций класса. Термин "функция" обозначает не только методы, но и все остальное, что не является данными, но может содержаться в классе: конструкторы, деструкторы, операции.

А в C# к функциям относятся, кроме того, индексаторы, а еще - свойства (хотя по своему внешнему виду и способу работы с ними свойства очень похожи на данные).

Сообщение отредактировал Visual1: 08.11.2006, 01:39:41

  • 0

#25
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений
2 Klaymen:

Каждый программист знает, что тестировать программы нужно всегда. Независимо от того, на сколько профессионально они сделаны. То количество ошибок, которое может возникнуть при тестировании на разных ОС, зависит от уровня граммотности разработчика, т.к. все известные проблемы можно сразу учитывать во время разработки.

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

Никто из начинающих не будет сразу заниматься так называемыми настояшими профессиональными работами, так что на первые 2-3 года каждый начинающий обеспечен бесплатным ПО в виде Eclipse или NetBeans.

Аналогично, для начинающих Microsoft предоставляет бесплатную учебную версию Visual Studio .NET 2005, в ней тоже есть все, что необходимо, и она позволяет (с некоторыми ограничениями) создавать вполне реальные и даже вполне коммерческие программы. Так что уровень "бесплатности" MS VS.NET ничуть не хуже (если не лучше), чем у Java.

Если не ошибаюсь. то в С++ можно выйти за рамки размера массива, что приведет к непредсказуемым поведениям программы.

Если речь идет о классическом С++, то нет, не ошибаетесь. Хотя я не вижу здесь особой проблемы для среднего программиста на С++, а с использованием STL этой проблемы вообще нет. В С# этой проблемы с самого начала не существует - массив поддерживается как определенный, отдельный тип. Каждый созданный в программе массив - это объект, имеющий методы и свойства. Диапазон массива является свойством, есть методы для его установки и контроля. Более того, в C# массив может менять свой размер динамически. Вообще, работать с массивами в C# очень удобно - программисту предоставляются все наиболее необходимые свойства и методы (сортировка массива, получение его длины, причем в случае многомерного массива длину можно получить по каждому из измерений). Во всех случаях память под массивы выделяется и освобождается автоматически. Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java? :eek:

Если под операторами понимаются поля класса, то, используя принцип инкапсуляции, переопределять их просто нет смысла. Но можно, создав их как public.

Нет. Под операторами понимаются не "поля класса", а операторы. Например такие, как + (оператор операции сложения), - (оператор операции вычитания). Если вы разработали класс Vector, то в Java вы не сможете написать:
Vector V1, V2, V3;
// Инициализация V2 и V3
...
V1 = V2 + V3;
потому что Java не поддерживает перегрузку операций. Хотя конечно, перегрузка методов, я думаю, программистам на Java хорошо знакома, а без перегрузки операций Java все равно остается полностью объектно-ориентированным языком. Однако в Java придется разработать вместо операции для каждого класса свой метод этого класса. И затем в Java-программе вместо простейшего D = (A + B)*C вам придется написать что-нибудь вроде
D = C.Multiply(A.Add(B)); 
и еще разобраться, выполняет ли здесь оператор присваивания = на самом деле то, что подразумевал программист? Скорее всего, нет. :mad:

Глобальные функции допускаются и называются они статическими методами.

С этим я полностью не согласен. Статический метод можно вызывать без создания экземпляра класса, но попробуйте написать в Java простейшую программу, чтобы в ней хотя бы одна функция была глобальной - иначе говоря, чтобы она была определена вне любого класса. Глобальных функций (методов) в Java нет, любые методы (статические и нестатические) обязательно принадлежат своим классам.

Процедурное программирование в Java просто не нужно. Нет смысла.

В С++ тоже вообще-то нет. Он создавался как полностью объектно-ориентированый язык - однако все возможности процедурного программирования в стиле C там удалось сохранить, без всякого ущерба для реализации принципов ООП. Это удобно при написании низкоуровневых программ - в отличие от Java, разработчику на С++ не понадобится переходить на другой язык. :-/
  • 0

#26
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений

Если речь идет о классическом С++, то нет, не ошибаетесь. Хотя я не вижу здесь особой проблемы для среднего программиста на С++, а с использованием STL этой проблемы вообще нет.

Не совсем так, если использовать функцию at(), то будет исключение, а если оператор [], то будет то же, что и в случае обычных массивов.

Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java? :mad:

Лехко =) Впрочем как и в любом языке, допускающем динамические массивы, включая С++. Или я чего то не понял?

потому что Java не поддерживает перегрузку операций. Хотя конечно, перегрузка методов, я думаю, программистам на Java хорошо знакома, а без перегрузки операций Java все равно остается полностью объектно-ориентированным языком. Однако в Java придется разработать вместо операции для каждого класса свой метод этого класса. И затем в Java-программе вместо простейшего D = (A + B)*C вам придется написать что-нибудь вроде

D = C.Multiply(A.Add(B)); 
и еще разобраться, выполняет ли здесь оператор присваивания = на самом деле то, что подразумевал программист? Скорее всего, нет. :)

И правильно :eek: Перегрузка порождает больше проблем, чем преимуществ. Она оправдана довольно редко, в случаях например математических операций над векторами или матрицами. Но подобные задачи в индустриальном программировании редки.

С этим я полностью не согласен. Статический метод можно вызывать без создания экземпляра класса, но попробуйте написать в Java простейшую программу, чтобы в ней хотя бы одна функция была глобальной - иначе говоря, чтобы она была определена вне любого класса. Глобальных функций (методов) в Java нет, любые методы (статические и нестатические) обязательно принадлежат своим классам.

Понятия глобальных функций и открытых статических идентичны. Разница лишь в синтаксисе. Можете считать имя класса аналогом пространства имён в С++. То же относится и к константам.


В С++ тоже вообще-то нет. Он создавался как полностью объектно-ориентированый язык - однако все возможности процедурного программирования в стиле C там удалось сохранить, без всякого ущерба для реализации принципов ООП. Это удобно при написании низкоуровневых программ - в отличие от Java, разработчику на С++ не понадобится переходить на другой язык. :-/

Отмечу, что возможности процедурного программирования в стиле С в С++ остались лишь потому, что он должен быть совместим с С.
  • 0

#27
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java? :)

Лехко =) Впрочем как и в любом языке, допускающем динамические массивы, включая С++. Или я чего то не понял?

"Лехко"? Покажите, пожалуйста, как это делается в С++.

И правильно :mad: Перегрузка порождает больше проблем, чем преимуществ. Она оправдана довольно редко, в случаях например математических операций над векторами или матрицами. Но подобные задачи в индустриальном программировании редки.

И какие, по Вашему, проблемы она порождает? Будьте конкретны в своих высказываниях.

Отмечу, что возможности процедурного программирования в стиле С в С++ остались лишь потому, что он должен быть совместим с С.

Так или иначе, в результате это оказалось достоинством С++. Во многих случаях разработчику не придется переходить на другой язык.


P.S. Да, и научитесь, пожалуйста, правильно цитировать.
  • 0

#28
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений

"Лехко"? Покажите, пожалуйста, как это делается в С++.

vector< vector<int> > m;
m.resize(N);
for (unsigned i = 0; i < N; ++i)
	m[i].resize(i + 1);

for (unsigned i = 0; i < N; ++i)
	for (unsigned j = 0; j < i; ++j)
		m[i][j] = i + j;

И какие, по Вашему, проблемы она порождает? Будьте конкретны в своих высказываниях.

Проблемы в том, что зачастую за выражением
a = b + c;
может скрываться пара неявных преобразований, обращения к каким нибудь виртуальным функциям, которые не понятно где описаны, и это всё не бросается в глаза.
Хотя если применять её по назначению, комплексные числа например реализовывать, то всё нормально. Или оператор присваивания (в С++). Но этот механизм нередко используется неправильно, и как следствие, порождает код, который очень тяжело сопровождать. А Джава подобные механизмы старается не использовать, чтобы "не искушать".

Так или иначе, в результате это оказалось достоинством С++. Во многих случаях разработчику не придется переходить на другой язык.

Безусловно. Совместимость с С это очень важная вещь, которая позволяет напрямую использовать все интерфейсы ОС, без промежуточных прослоек.
  • 0

#29
T. Anre

T. Anre

    Data Miner

  • В доску свой
  • 2 327 сообщений


Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java? ;)

Лехко =) Впрочем как и в любом языке, допускающем динамические массивы, включая С++. Или я чего то не понял?

"Лехко"? Покажите, пожалуйста, как это делается в С++.

Скажу, что в JAVA многомерные массивы не обязаны быть прямоугольными. На мой взгляд самым гибким языком в плане работы с массивами является PHP. Самым гибким при работе с матрицами является MatLab.
  • 0

#30
antee

antee
  • В доску свой
  • 1 067 сообщений

Мне намного интереснее получить ответ на свой вопрос: так все же, что хорошего и что плохого в том, что в Java все функции обязаны быть виртуальными?

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

Можно даже создавать "неровные" массивы (например, двумерный массив, каждая строка которого имеет разное количество столбцов). Как насчет этого в Java? wink.gif

А это "неровный" массив (с разной длиной подмассивов)
String[][] неровныйМассив = {{"a","b"},{"a","b","c"}};
;)

программист на Java не может применять процедурное программирование (тогда как в С++ глобальные данные и функции допускаются, и процедурное программирование всегда возможно, хотя С++ при этом полностью объектно-ориентированный язык).

Никто и ничто, даже Java, не может спасти вас от вас самих и от процедурного стиля программирования, если вы не хотите использовать объектных возможностей :spy:

Сообщение отредактировал antee: 08.11.2006, 13:55:39

  • 0

#31
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений


"Лехко"? Покажите, пожалуйста, как это делается в С++.

vector< vector<int> > m;
m.resize(N);
for (unsigned i = 0; i < N; ++i)
	m[i].resize(i + 1);

for (unsigned i = 0; i < N; ++i)
	for (unsigned j = 0; j < i; ++j)
		m[i][j] = i + j;

М-да, это называется "лехко"?
В C# делается так:
int[][] a = new int[3][];
a[0] = new int[4];
a[1] = new int[3];
a[2] = new int[1];
Вот и все, что понадобилось для создания неровного массива. Отметим также, что C# позволяет создавать массивы, не инициализируя их.


И какие, по Вашему, проблемы она порождает? Будьте конкретны в своих высказываниях.

Проблемы в том, что зачастую за выражением
a = b + c;
может скрываться пара неявных преобразований, обращения к каким нибудь виртуальным функциям, которые не понятно где описаны, и это всё не бросается в глаза.
Хотя если применять её по назначению, комплексные числа например реализовывать, то всё нормально. Или оператор присваивания (в С++). Но этот механизм нередко используется неправильно, и как следствие, порождает код, который очень тяжело сопровождать. А Джава подобные механизмы старается не использовать, чтобы "не искушать".

Как будто бы код вроде D = C.Multiply(A.Add(B)) легче сопровождать, чем D = (A + B)*C А ведь реальные, неупрощенные формулы приведут к намного более устрашающему виду. ;) Вот и "не искушает" Джава. Мне представляется все же, что Java иногда слишком уж ограничивает свободу программиста. Хорошо, что в C# по такому пути не пошли.


Так или иначе, в результате это оказалось достоинством С++. Во многих случаях разработчику не придется переходить на другой язык.

Безусловно. Совместимость с С это очень важная вещь, которая позволяет напрямую использовать все интерфейсы ОС, без промежуточных прослоек.

Вот это, на самом деле, не только правильное, но и важное замечание.
  • 0

#32
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений

Скажу, что в JAVA многомерные массивы не обязаны быть прямоугольными. На мой взгляд самым гибким языком в плане работы с массивами является PHP. Самым гибким при работе с матрицами является MatLab.

Покажите, пожалуйста, как создается непрямоугольный ("неровный") массив в Java. Для примера возьмите массив такой же, как в моем ответе для v04bvs. Интересно, намного ли проще получится в Java, чем в С#.
  • 0

#33
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений


Мне намного интереснее получить ответ на свой вопрос: так все же, что хорошего и что плохого в том, что в Java все функции обязаны быть виртуальными?

Статические функции не виртуальны.

Спасибо, но это уже объяснили раньше (см. ответ T. Anre на предыдущей странице). Однако все остальные функции в Java обязаны быть виртуальными, если не ошибаюсь? И ответа на мой вопрос, хорошо это или плохо, пока не дал никто. ;)

Их нельзя переопределить в подклассах, а вызываться они могут с уровня класса или его объекта в зависимости от видимости.

С уровня класса или его объекта, Вы сказали? Это что, надо создавать объект, чтобы вызвать статическую функцию? ;) Впервые вижу такое.

Никто и ничто, даже Java, не может спасти вас от вас самих и от процедурного стиля программирования, если вы не хотите использовать объектных возможностей :D

Интересный у Вас поворот мысли. Меня, оказывается, надо "спасать от процедурного стиля программирования"? :spy: Я всегда хочу использовать объектные возможности, но иногда все же требуется процедурное программирование и прямое обращение к функциям API (см. предыдущие сообщения). Как уже говорилось, Java такой возможности не предоставляет.
  • 0

#34
T. Anre

T. Anre

    Data Miner

  • В доску свой
  • 2 327 сообщений


Скажу, что в JAVA многомерные массивы не обязаны быть прямоугольными. На мой взгляд самым гибким языком в плане работы с массивами является PHP. Самым гибким при работе с матрицами является MatLab.

Покажите, пожалуйста, как создается непрямоугольный ("неровный") массив в Java. Для примера возьмите массив такой же, как в моем ответе для v04bvs. Интересно, намного ли проще получится в Java, чем в С#.


Двумерные непрямоугольные массивы, как в JAVA так и в C#, называются рваными.

Как можно объявлять двумерные массивы в некоторых языках.

//C#
int[][] a = new int[3][];
a[0] = new int[4];
a[1] = new int[3];
a[2] = new int[1];

// JAVA
int[][] a = new int[3][];
a[0] = new int[4];
a[1] = new int[3];
a[2] = new int[1];

// JAVA
int[][] b = {{1,2,3,4}, {1,2,3}, {1}}

//PHP
$a = array(
	array(1,2,3,4),
	array(1,2,3),
	array(1)
);

//JAVASCRIPT
a = {
0:{0:1,1:2,2:3,3:4},
1:{0:1,1:2,2:3},
2:{0:1}
};

Сообщение отредактировал T. Anre: 08.11.2006, 23:05:51

  • 0

#35
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений


vector< vector<int> > m;
m.resize(N);
for (unsigned i = 0; i < N; ++i)
	m[i].resize(i + 1);

for (unsigned i = 0; i < N; ++i)
	for (unsigned j = 0; j < i; ++j)
		m[i][j] = i + j;

М-да, это называется "лехко"?

Да, это называется лехко :spy: А что здесь сложного то?



Проблемы в том, что зачастую за выражением
a = b + c;
может скрываться пара неявных преобразований, обращения к каким нибудь виртуальным функциям, которые не понятно где описаны, и это всё не бросается в глаза.
Хотя если применять её по назначению, комплексные числа например реализовывать, то всё нормально. Или оператор присваивания (в С++). Но этот механизм нередко используется неправильно, и как следствие, порождает код, который очень тяжело сопровождать. А Джава подобные механизмы старается не использовать, чтобы "не искушать".

Как будто бы код вроде D = C.Multiply(A.Add(B)) легче сопровождать, чем D = (A + B)*C А ведь реальные, неупрощенные формулы приведут к намного более устрашающему виду. ;)

Да откуда же они возьмутся, формулы то? Вы же не собираетесь на джаве решать линейные уравнения. Каждой задаче свой инструмент.

Вот и "не искушает" Джава. Мне представляется все же, что Java иногда слишком уж ограничивает свободу программиста. Хорошо, что в C# по такому пути не пошли.

В сущности я с вами согласен. Я люблю свободу, и люблю язык, который мне её даёт. Но не весь код пишу я, вот ведь в чём проблема ;).
  • 0

#36
T. Anre

T. Anre

    Data Miner

  • В доску свой
  • 2 327 сообщений

Да, это называется лехко ;) А что здесь сложного то?

Тут дело не в сложности, а в неудобстве, нечитабельности, громоздкости.

Да откуда же они возьмутся, формулы то? Вы же не собираетесь на джаве решать линейные уравнения. Каждой задаче свой инструмент.

На Java пишутся игры, моделируются физические процессы и тд и тп. Так что можно с уверенностью сказать, что при программировании на Java ,частенько, приходится иметь дело с формулами.


Вот и "не искушает" Джава. Мне представляется все же, что Java иногда слишком уж ограничивает свободу программиста. Хорошо, что в C# по такому пути не пошли.

В сущности я с вами согласен. Я люблю свободу, и люблю язык, который мне её даёт. Но не весь код пишу я, вот ведь в чём проблема :spy:.

В любых отношениях главное... границы (с) к-ф Милашка (Кэмерон Диаз)

Сообщение отредактировал T. Anre: 08.11.2006, 23:47:22

  • 0

#37
Visual1

Visual1
  • В доску свой
  • 1 198 сообщений



vector< vector<int> > m;
m.resize(N);
for (unsigned i = 0; i < N; ++i)
	m[i].resize(i + 1);

for (unsigned i = 0; i < N; ++i)
	for (unsigned j = 0; j < i; ++j)
		m[i][j] = i + j;

М-да, это называется "лехко"?

Да, это называется лехко ;) А что здесь сложного то?

Может и правда, ничего особо сложного... после серьезного изучения шаблонов, однако. ;) А как бы у вас выглядел на С++ приведенный у меня выше пример очень простого непрямоугольного массива на C#? Что, там тоже без двойного цикла обойтись нельзя? :spy:
И вообще, насчет громоздкости, нечитабельности присоединяюсь к мнению T. Anre.

Да откуда же они возьмутся, формулы то? Вы же не собираетесь на джаве решать линейные уравнения. Каждой задаче свой инструмент.

Дело, конечно, не в том, откуда возьмутся формулы, и не в линейных уравнениях. Дело в перегрузке операций, которая в C# есть, а в Java - нет. Вы уже говорили об этом:

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

Мне представляется, что применение перегрузки операций все же оправдано намного чаще, а область этого применения - намного шире:
- не только векторы, но и другие математические объекты (координаты, матрицы, тензоры), а также в программах математического или физического моделирования - там обязательно будут классы, представляющие моделируемые объекты;
- графические программы: они очень широко распространены, а без экранных и оконных координат обойтись там совершенно невозможно;
- программы обработки и анализа текста: там могут быть классы, представляющие собой предложения, абзацы и т.д. Может потребоваться, например, более сложная версия конкатенации строк.
- финансовые программы (учитывая важность и объемы таких программ, в C# даже был введен специальный денежный тип decimal, так что без перегрузки операций для работы с таким типом обходиться будет очень трудно, если только вообще возможно).
В любом случае, никто ведь никого не заставляет использовать перегрузку операций, не так ли?Полноценность ООП без нее тоже не нарушается. В общем, по выбору программиста. Но у программиста на С++ и на С# такой выбор есть, а у Java-программиста - нет.

Сообщение отредактировал Visual1: 09.11.2006, 01:29:14

  • 0

#38
Kalenval

Kalenval
  • Гость
  • 11 сообщений

Доброго времени суток, Уважаемые!
Хочу пойти на курсы JAVA, но не могу найти достойную контору у нас в Алмате. Подскажите пожалуйста, может кто-нить проходил курсы и может посоветовать куда пойти учиться, желательно с телефончиками и адресами.

Заранее премного благодарен...

к Sun -овцам надо обращатся
  • 0

#39
v04bvs

v04bvs
  • В доску свой
  • 2 062 сообщений

Тут дело не в сложности, а в неудобстве, нечитабельности, громоздкости.

Ну не знаю. У меня проблем с чтеним этого кода нет. Вам виднее конечно.

Может и правда, ничего особо сложного... после серьезного изучения шаблонов, однако. ;) А как бы у вас выглядел на С++ приведенный у меня выше пример очень простого непрямоугольного массива на C#? Что, там тоже без двойного цикла обойтись нельзя? :spy:
И вообще, насчет громоздкости, нечитабельности присоединяюсь к мнению T. Anre.


vector< vector<int> > a(3);
a[0].resize(4);
a[1].resize(3);
a[2].resize(2);

Насчёт шаблонов - да, их знать надо, без них на С++ программировать тяжело.
Кстати, на всякий случай скажу, что вышеприведённый код является всего лишь примером использования библиотеки STL. Если говорить про полный аналог динамического массива в языке, то это можно записать так:

int **a = new (int*)[3];
a[0] = new int[4];
a[1] = new int[3];
a[2] = new int[1];
Другое дело, что освобождать память в этом случае надо будет самостоятельно, да и к тому же приведённый код не является безопасным, по отношению к исключениям, поэтому предпочтительней использовать 1-й вариант.
  • 0

#40
antee

antee
  • В доску свой
  • 1 067 сообщений

...
Спасибо, но это уже объяснили раньше (см. ответ T. Anre на предыдущей странице). Однако все остальные функции в Java обязаны быть виртуальными, если не ошибаюсь? И ответа на мой вопрос, хорошо это или плохо, пока не дал никто. ;)

Visual1, в чем проблема-то? Хочешь виртуальную или не виртуальную - всё это есть в java, для области применения которой этого более чем достаточно. Или это самоцель какая-то : чтобы часть других функций можно было делать не виртуальными? :-)
Ответ на вопрос: Для java это хорошо , тк является неотъемлемой частью её последовательной объектной концепции, позволяющий делать качественный дизайн реализации бизнес логики не отвклекаясь на технические детали. Если использовать java платформу по назначению - такой вопрос вряд ли возникнет, по крайней мере мой опыт это подтверждает.


Их нельзя переопределить в подклассах, а вызываться они могут с уровня класса или его объекта в зависимости от видимости.

С уровня класса или его объекта, Вы сказали? Это что, надо создавать объект, чтобы вызвать статическую функцию? ;) Впервые вижу такое.

Еще раз перечитал своё высказывание - вроде понятно должно быть. :D
Имел ввиду следующее:
class StaticExample {
public void static staticMethod {
System.out.println("Static method");
}
}
Вызывать можно двумя способами:
StaticExample.staticMethod(); - рекомендуемое использование
new StaticExample().staticMethod();



Никто и ничто, даже Java, не может спасти вас от вас самих и от процедурного стиля программирования, если вы не хотите использовать объектных возможностей :-/

Интересный у Вас поворот мысли. Меня, оказывается, надо "спасать от процедурного стиля программирования"? :spy: Я всегда хочу использовать объектные возможности, но иногда все же требуется процедурное программирование и прямое обращение к функциям API (см. предыдущие сообщения)

Никто вас не ограничит написание метода на целую страницу в процедурном стиле.... Пишите, если нравится... ;)

Сообщение отредактировал antee: 09.11.2006, 12:37:51

  • 0


Количество пользователей, читающих эту тему: 0

пользователей: 0, неизвестных прохожих: 0, скрытых пользователей: 0

Размещение рекламы на сайте     Предложения о сотрудничестве     Служба поддержки пользователей

© 2011-2022 vse.kz. При любом использовании материалов Форума ссылка на vse.kz обязательна.