Что такое перегрузка операторов и отличается ли она от полиморфизма? - PullRequest
3 голосов
/ 08 февраля 2012

Я программирую на Java и пытаюсь точно понять, что такое перегрузка операторов. Я все еще немного озадачен.

Оператор может иметь разные значения в зависимости от того, какой класс его использует? Я читал, что это «Полиморфизм имени».

Java, по-видимому, не поддерживает его, и, похоже, вокруг этого много споров. Должен ли я беспокоиться об этом?

В качестве последнего вопроса в задании учитель заявил, что в задании используется перегрузка операторов, он в основном программист на C ++, но нам разрешено писать это задание на Java. так как Java не поддерживает перегрузку, есть ли что-то, что я должен опасаться?

Ответы [ 5 ]

9 голосов
/ 08 февраля 2012

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

Java действительно не поддерживает это, но в любой ситуации, когда что-то подобное может быть полезным, вы можете легко обойти это в Java.

единственным перегруженным оператором в Java является арифметический оператор +.При использовании с числами (int, long, double и т. Д.) Он добавляет их, как и следовало ожидать.При использовании с String объектами он объединяет их.Например:

String a = "This is ";
String b = " a String";
String c = a + b;
System.out.print (c);

Это выведет на экран следующее: This is a String.

Это единственная ситуация в Java, в которой можно говорить о перегрузке операторов.

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

PS: В случае объектов Integer, Long, Double и т. Д. Это также будет работать из-за распаковки.

3 голосов
/ 08 февраля 2012

Java не допускает перегрузки операторов. Он использует очень ограниченный вид перегрузки операторов, поскольку + выполняет сложение или объединение в зависимости от контекста.

Если в вашем задании вас попросят реализовать что-то, перегружая операторы, вы не сможете сделать это в Java. Возможно, вам следует спросить учителя, почему он разрешает Java для такого назначения.

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

1 голос
/ 08 февраля 2012

Java, по-видимому, не поддерживает его, и, похоже, вокруг этого много противоречий.

Существует никаких противоречий по этому поводу.Некоторые люди могут не согласиться с этим решением, но Джеймс Гослинг и другие с первого дня решили оставить перегрузку операторов разработчиками классов вне языка.Это вряд ли изменится.

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

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

Стоит ли беспокоиться об этом?

Нет.Ява не взорвется.Вы просто не сможете сделать это для своих классов.Если вы чувствуете, что вам нужно, вам просто нужно написать C ++ или другой язык.

0 голосов
/ 08 февраля 2012

Что касается вашего запроса о разнице между перегрузкой операторов и полиморфизмом. Полиморфизм - это стандартная концепция ООП, когда экземпляр класса может демонстрировать различные характеристики в зависимости от базового типа. Например, в C ++:

class Shape {
...
virtual void draw()=0;
}

class Circle :public Shape {
virtual void draw() {...draw a circle...}
}

class Square:public Shape {
virtual void draw() {...draw a square...}
}

..

Shape *s = new Circle();
s->draw(); // calls Circle::draw();
s=new Square(); // calls Square::draw();

Следовательно, s проявляет полиморфизм.

Это отличается от перегрузки операторов, но вам уже объяснили, что это такое в других ответах.

0 голосов
/ 08 февраля 2012

Можно использовать натуральное a! = B (a не равно b) или a.Equals (b)

b.set(1, 0);
a = b; 
b.set(2, 0);
assert( !a.Equals(b) );

Но java имеет ограниченный набор перегрузок операторов, чем другие языки http://en.wikipedia.org/wiki/Operator_overloading

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...