2015-08-06 2 views
0

Я новичок в Java. Мне интересно, можно ли добавлять несколько методов на один и тот же объект, не создавая новый (в данном случае - String).Как добавить несколько методов на один и тот же объект?

public class DeletAble { 

    public static void main(String[] args) { 
     // Refrain from saving this document 

     String userName = "sdfsd".trim().substring(0,1).toUpperCase().substring(1).toLowerCase(); 
     System.out.println(userName); 

    } 
} 

Компилятор не допускает ошибок, однако ничего не распечатывает. Он работает, если я создаю еще одну String для метода .tolowerCase(). Есть ли способ использовать эти методы, как это, а если нет: почему?

+5

Как вы думаете, что подстрока (0,1) 'делает и почему вы так думаете? Что делает 'substring (1)' do? –

+0

Принимает первую букву и делает ее верхним регистром. «m» -> «M». Почему не нравится? :(Подстрока (1) должна сделать остальную букву в нижнем регистре ... –

+0

@Aminorph Вы можете использовать метод 'charAt()' для получения одного символа –

ответ

1

В Java Строки неизменяемы. Всякий раз, когда вы «изменяете» его, вы на самом деле создаете новый.

public class DeletAble { 

    public static void main(String[] args) { 

     // Your code is esentally shorthand for the following code 
     String userName = "sdfsd"   // Value "sdfsd" 
     userName = userName.substring(0,1) // Value "s" 
     userName = userName.toUpperCase() // Value "S" 
     userName = userName.substring(1) // Value "" 
     userName = userName.toLowerCase() // Value "" 

     // Prints emmpty string "" 
     System.out.println(userName); 
    } 
} 

Я предполагаю, что вы хотите, следующий код

public class DeletAble { 

    public static void main(String[] args) { 

     // Your code is esentally shorthand for the following code 
     String userName = "sdfsd"          // Value "sdfsd" 
     String firstLetter = userName.substring(0,1).toUpperCase();  // Value "S" 
     String rest = userName.substring(1).toLowerCase();    // Value "dfsd" 
     userNmame = firstLetter + rest;         // Value "Sdfsd 

     // Prints emmpty string "Sdfsd" 
     System.out.println(userName); 
    } 
} 
+0

Спасибо! Думаю, я чувствовал, что есть какой-то ярлык. Спасибо, что разобрался. Ура! –

+0

Ну, есть «ярлык», поскольку вы можете связать вызовы, но строка никогда не является модификатором, вам нужно сохранить результат (новую строку) этих преобразований – Dici

3
"sdfsd".trim().substring(0,1) 

Эта деталь возвращает "s".

.toUpperCase() 

возвращает "S"

.substring(1) 

возвращает "". Это не вернитесь к исходной строке, с которой вы начали; это всего лишь substring(1) результата, который у вас был, "S", который является пустой строкой. Это твоя проблема.

Если вы хотите делать разные вещи с разными частями строки, вам придется хранить их в переменной, делать разные вещи с разными частями и снова объединять их. Вы не можете «поддерживать уровень», как вы пытаетесь сделать, если это то, о чем вы просите.

+0

Спасибо! Это было именно то, что мне было интересно. +1 –

0

вы можете сделать именно то, что у вас есть, но это путь, ваша строка:

"sdfsd" -> "sdfsd" -> "s" -> "S" -> "" -> "" 

подстрока (1) получает символ в индексе 1, то, что вы хотите, - это индекс 0.

0

Когда вы размещаете 2 int в методе substring, первый представляет индекс первого символа в String, из которого вы хотите извлечь substring, второй - это индекс, который вы останавливаете, и этот индекс не включен в subsstring. Вы написали .substring(0,1), что означает, что первым символом будет индекс 0 строки, а substring будет показываться (но не включая) индекс 1 оригинальной строки. Это означает, что результат String будет иметь только 1 символ. После этого вы попытались получить .substring(1), что означало бы символ с индексом 1String, но поскольку есть только 1 символ, то нет индекса 1 (только индекс 0). Вот почему ничего не выводилось. Чтобы получить результаты, я предполагаю, что вы изначально хотели попробовать 1-й метод substring: .substring(0,2).

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