Java - Как ссылка foo.charAt (i) является ссылкой? - PullRequest
4 голосов
/ 05 февраля 2012

Я новичок в Java, но понимаю C ++.

string foo;

Когда я делаю if (foo.charAt (i) == 'a')

Каким образом «a» является ссылкой?

А как враги foo.ChaAt ('a') возвращают ссылку? Когда я отлаживаю, это выглядит как «а»?

Это указатели? Я просто слишком пьян?

Как бы они выглядели, если бы возвращали значения?

Ответы [ 6 ]

4 голосов
/ 05 февраля 2012

Звучит так, будто ты стал жертвой какой-то дезинформации.Метод String.charAt() возвращает значение char по значению.Это не возвращает ссылку любого вида;здесь нет указателей.

2 голосов
/ 05 февраля 2012

Несмотря на то, что может быть немного алкоголя, я постараюсь дать вам быстрое базовое введение в Java!;)

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

  • В Java есть Objects и примитивные типы данных.byte, short, int, long, float, double, boolean, char являются единственными примитивами;все остальное в объекте (массивы - это тоже объекты)
  • Переменная в Java может содержать либо точное значение примитивного типа данных, либо значение, которое сообщает JVM, как добраться до объекта (обратите внимание, что я простомог бы сказать ссылку, но я этого не сделал, потому что так лучше)
  • Строка в Java - это объект (особый, потому что он неизменный и много говорят о пуле строк)и интернирование), которое поддерживается массивом символов
  • foo.charAt(i) возвращает символ (примитивный тип данных) с заданным нулевым индексом i!
  • 'a' ischar!Вот и все ...
  • Оператор == сравнивает переменные.Переменные могут снова иметь примитив или тип объекта.В вашем случае (примитивы) он сравнивает 2 символа и возвращает либо true, либо false, если они имеют одинаковое значение.Вы также можете сравнить различные типы примитивов вместе с одним и тем же оператором, но это становится немного сложнее из-за их разных размеров.Вы также можете сравнить переменные объектов (ссылки) с этим, но обратите внимание, что в этом случае вы сравниваете 2 значения, которые сообщают JVM, как добраться до объектов.(IE Вы можете только определить, попадают ли две переменные в один и тот же объект, один и тот же объект!)

Для получения дополнительной информации о передаче по ссылке (которая вообще не существует в Java)Вы можете посмотреть на этот вопрос

Дайте мне знать, если вам нужны какие-либо другие разъяснения

2 голосов
/ 05 февраля 2012

Предположение: foo имеет тип String

Каким образом возврат foo.charAt (i) является ссылкой?

Это не ссылка. это примитивный тип: char

Проверьте документ на Java для charAt

См. Тип возврата: это char. char не является ссылочным типом.

В Java у вас есть ссылочный тип и примитивный тип .

2 голосов
/ 05 февраля 2012

В Java все, кроме примитивных типов, является ссылками.String не считается примитивным типом, но char является.Итак, AFAIK 'a' в вашем примере не является ссылкой.

Однако Java поддерживает autoboxing , поэтому, если вы попытаетесь использовать 'a' в качестве объекта, он, вероятно, будет работать нормально, как если бы это была ссылка.

Обновление : здесь могут помочь некоторые примеры:

char a = 'a';
char b = 'a';
System.out.println(a == b); // true
String c = "a";
String d = "a";
System.out.println(c == d); // Dunno; may be true if the compiler created a single object for c and d, otherwise it's false
String e = new String("a");
String f = new String("a");
System.out.println(e == f); // false
1 голос
/ 05 февраля 2012

'a' не будет ссылкой. foo.charAt(index) вернет char примитив, поэтому вы можете безопасно использовать ==. В противном случае вам придется использовать foo.charAt(index).equals(bar).

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

charAt не возвращает ссылку на объект, он возвращает char тип примитива. Когда вы используете == для сравнения двух символов на равенство, вы сравниваете их значения , а не их ссылки (в Java мы не говорим о указателях ).

...