Назад Зміст Вперед

5.3. Оголошення та створення рядкових об’єктів. Оператор new. Літерал null

Оголошення та створення рядкових об’єктів

Оголошення змінної і присвоєння їй рядка відбувається наступним чином:
String str="Це рядок";
Для того щоб створити рядок, необхідно взяти літери в подвійні лапки: "це рядок". Також можна створити пустий рядок "". Якщо необхідно використати спецсимволи, то застосовують зворотню косу (backslash) "\". Наприклад, помістити в рядок внутрішні подвійні лапки можна таким чином "\" - це лапка". Аналогічно для одинарних лапок, недрукованих символів, тощо. Найчастіше \ застосовується для символу нового рядка:
System.out.println("Це перший рядок тексту, \nа це другий текстовий рядок.");
Таким чином, рядок (string) може містити текст з кількома текстовими рядками (в англ. застосовують термін multyline string — багатолінійний рядокбагаторядковий рядок або ж багаторядкова стрічка). Проте власне клас String не дуже підходить для зберігання великих об'ємів текстових даних та маніпуляцій з ними. Для цього краще застосовувати класи StringBuilder або ж StringBuffer.
В java об'єкти класу String не можна змінювати. На перший погляд — це додає проблем при роботі, але насправді це не так. Не можна змінювати сам рядок в пам'яті комп'ютера, але змінній, яка посилається на певний рядок, можна призначити інший рядок.
String str="Це";
String str2="рядок";
String str3="555";
str=str3; //так можна
str=str+" "+str2;   //і так можна
Дію обмеження ви відчуєте, лише коли захочете, наприклад, замінити букву "е" на якусь іншу, або змінити її регістр. В інших мовах - це можна зробити без проблем. В java потрібно утворити новий рядок. Скопіювавши, наприклад, букву "Ц" і додавши до неї "Е". Рядок, на який вже не посилається жодна змінна, буде видалений з пам'яті комп'ютера автоматичним прибиральником сміття java.
В разі, якщо ж все ж таки необхідна маніпуляція з рядком напряму, то для таких цілей існують споріднені із String класи. Зокрема, StringBuffer — корисний, при роботі з великими об'ємами текстових даних, читання з файлу і т.п.
Щоб здійснити такі дії як пошук, заміна і т.п. в класі String існує чималий набір методів. Так, щоб дізнатися довжину рядка можна скористатися методом length():
String str="Це рядок";
int strLength=str.length();
int str2Length="Це рядок".length(); //можна і так
Як бачимо виклик методів відбувається як при роботі із класами, з використанням оператору «.» (крапка): «об'єкт.метод()» або «об'єктна_змінна.метод()».
Для того, щоб одержати частину рядка (підрядок) з іншого більшого рядка можна скористатися методом substring(pos1, pos2) класу String.
Наприклад:
String greeting = "Hello";
String s=greeting.substring(0,3); //скопіювати з greeting символи з 0 до 3, тобто 0, 1 та 2 – “Hel”
В результаті було скопійовано перших три символи. Символи в рядку нумеруються починаючи з нуля. Можна розрахувати довжину отриманого рядка: pos2-pos1. В даному випадку 3-0=3;
Як вже згадувалось ми, не можемо змінювати рядки. Тому, якщо ми, наприклад, захочемо змінити рядок Hello на Help без застосування додаткової змінної, можна скористатися методом substring() та оператором конкатенації «+»:
greeting = greeting.substring(0, 3) + "p!";
В результаті в greeting=“Help!”. Таким чином, ми не змінюємо сам рядок, а присвоюємо змінній інший рядок.
Часто постає необхідність явного приведення типу String до інших типів і навпаки. Наприклад, ви вводите з клавіатури певне число, воно буде у вигляді рядка символів, а для проведення обчислень його потрібно привести або до типу int, якщо це цілочисельне число, або ж до float чи double, якщо дробове. Для таких випадків слугує ряд статичних методів valueOf(), які наявні в класі String, а також в класах, які реалізовують числові типи Float, Double та ін.
Наступна програма вимагає введення числа з клавіатури і виводить результат множення введеного числа та 36:
import java.util.Scanner;
public class TestValueOf {
     
     public static void main ( String[] args ){
      int intNumber=36;  
      
      System.out.print("Введіть число: ");
     //зчитуємо число з клавіатури   
      Scanner in = new Scanner(System.in);
      String doubleStr=in.next();
      System.out.println("Ви ввели: "+doubleStr);
      //Ціла і дробова частина повинна бути через крапку
      //шукаємо чи не ввели через кому
      int index=doubleStr.indexOf(",");

      if (index>=0) {
          System.out.println("Кома у позиції: "+index);         
          doubleStr=doubleStr.replace(',', '.'); //замінити кому на крапку
      } 

      //Перетворюємо int число у рядок тексту
      String strNumber=String.valueOf(intNumber);
      
      //Приєднуємо число до рядка через метод concat (хоча можна і оператором "+")
      String strOut="*".concat(strNumber)+"=";
     
      //Перетворюємо введений рядок тексту у число
      double number=Double.valueOf(doubleStr);
      number =number*intNumber; //множимо введене число на 36
       
      System.out.println(doubleStr+strOut+number);
     
     }
}
Результат виконання:
Введіть число: 555,5
Ви ввели: 555,5
Кома у позиції: 3
555.5*36=19998.0

Оператор new. Літерал null

Оператор new динамічно виділяє оперативну пам'ять для об'єкта. Загальна форма цього оператора має наступний вигляд:
змінна_класу = new ім'я_класу ();
де змінна_класу позначає змінну створюваного класу, а ім'я_класу - конкретне ім'я класу, екземпляр якого виходить. Ім'я класу, за яким слідують круглі дужки, позначає конструктор даного класу. Конструктор визначає дії, що виконуються при створенні об'єкта класу. Конструктори є важливою частиною всіх класів і володіють безліччю важливих властивостей. У більшості класів, використовуваних в реальних програмах, явно оголошуються свої конструктори в межах визначення класу. Але якщо ні один з явних конструкторів не вказаний, то в Java буде автоматично надано конструктор за замовчуванням.

Null-літерал, пусте значення — особливий тип літерала, який залежно від мови програмування, відноситься до посилального або об'єктного типу. Єдине допустиме значення цього типу літералів — «null», тобто це означає, що посилання нікуди не веде, або об'єкт відсутній.

.