2015-09-05 8 views
4

У меня естьРазница между одинарными кавычками и двойными кавычками в java?

  1. System.out.println(2+" "+3);

  2. System.out.println(2+' '+3);

Первый из них оттисков 2 3, а вторая печать 37 Может ли ребята объяснить, почему он печатает 37 ???

+0

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

+0

char и int - разные представления по значению. –

ответ

1

Первый преобразует все в строку для вас. Второй - преобразование в целое. Десятичный код для пробела равен 32. Если вы хотите, чтобы 2 и 3 были строкой, используйте кавычки.

3

' '= 32 в ascii.

a:) System.out.println(2+" "+3); // string concatenation 

b:) System.out.println(2+' '+3); // 2+ 32(32 ascii valur for space)+3 so 37 
0

Это потому, что вы печатаете целые значения 2+ ' ' +3 и переведет ' ' его как char а не string, который просто преобразует б) частично это значения ASCII, которые приводят к 2 + ASCII value of Space + 3 и конечный результат будет be 37, поскольку значение ASCII для space равно 32.

0

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

3

Цитирование Спецификация языка Java для Additive Operators:

Если тип либо операнда + оператора String, то операция конкатенации.

В противном случае, тип каждого из операндов оператора + должен быть типом, который является обратимым (§5.1.8) до примитивного числового типа

For Numeric Types:

Binary числовое расширение выполняется над операндами (§5.6.2)

Binary Numeric Promotion:

[...] В противном случае оба операнда преобразуются в тип int.

Так, 2+" "+3 является 2 + " ", который является конкатенация, и String + 3 также конкатенация, следовательно 2 + " " + 3 является "2" + " " + "3", что означает "2 3".

2+' '+3 является 2 + ' ', а пространство буквальным является char, поэтому он преобразуется в int (32), и это 2 + 32 + 337.


Если литералы были переменными, это было бы на самом деле быть таким, где присваивание переменным используются только для иллюстрации типа промежуточного результата:

// String concatenation 
String s = new StringBuilder().append(2).append(" ").append(3).toString(); 
System.out.println(s); 

// Numeric addition 
int n = 2 + (int)' ' + 3; 
System.out.println(n); 

Оба append() и println() перегружены, поэтому они не все одинаковы.

Поскольку они являются константами, а не переменные, компилятор сделает это во время компиляции, и вы действительно получите это (попробуйте разборке .class файл, чтобы увидеть для себя):

System.out.println("2 3"); 
System.out.println(37); 
0

Concatenation как вот почти одна ситуация, когда Java настолько терпима. В другом контексте с char '' и String "" показывает true: существуют разные типы.

0

Если выходной аргумент для System.out.println явно равен java.lang.String, java автоматически преобразует любые типы данных и объекты, которые он задает в качестве выходных аргументов, в java.lang.String.

В первом примере, System.out.println(2+" "+3);, что Java делает это сканирование через выходные аргументы и находит int (2), двойные кавычки " ", который указывает на массив символов в двойных кавычках должны интерпретироваться как String и другой int (3). Java принимает строку String " " как подсказку о том, что все остальное в аргументе следует рассматривать как строки. Так что фактически происходит в том, что линия System.out.println(2+" "+3); рассматривается, как если бы вы написали

System.out.println(Integer.toString(2)+" "+Integer.toString(3)); 

В вашем втором примере System.out.println(2+' '+3); происходит тот же процесс, но вместо того, чтобы найти двойные кавычки, ява находит ' ' - пробела в окружении по одной кавычки, которая сообщает java, что она работает с примитивным типом данных char - и вот почему java рассматривает это как операцию добавления: all java primitive data types are numbers - поэтому java принимает этот намек и интерпретирует выходные аргументы как int (2), оператор сложения (+), a char (символ пробела) - то же самое, что и без знака short, дополнение оператора (+) и другого int (3). Числовое значение символа 32, так что за преобразованием сцены обрабатывает ваше заявление, как вы написали

System.out.println(Integer.toString(2+32+3)); 

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

System.out.println("The answer is "+(3+" "+2)); 
    System.out.println("The answer is "+(3+2)); 
    System.out.println("The answer is "+(3+' '+2)); 

или даже

System.out.println('a' + 'b' + 'c'); 
+0

На самом деле первым println является 'System.out.println (new StringBuilder(). Append (2) .append (" ") .append (3) .toString()) ;, а второй -' System.out. println (2 + (int) '' + 3); ', хотя на самом деле компилятор сделает это во время компиляции. – Andreas

+0

«все примитивные типы данных java - это числа», за исключением булевых. – Andreas

+0

@ Andreas, ну тогда молитесь, почему бы вам не объяснить для класса, как JVM DOES лечит логическое? – user5292387

Смежные вопросы