Приведение числовых типов




 

В предыдущем разделе мы видели, что при необходимости значения типа int ав­томатически преобразовываются в значения типа double. С другой стороны, есть не­сколько очевидных ситуаций, когда число типа double рассматривается как целое. Преобразования чисел в языке Java возможны, однако, разумеется, при этом может происходить потеря информации. Такие преобразования называются приведением типа (cast).

Синтаксически приведение типа задается парой скобок, внутри которых
указывается желательный тип, а затем — имя переменной. Например,
double х = 9.997;
int nx = (int)x;

Теперь в результате приведения значения с плавающей точкой к целому типу пере­менная nх равна 9, поскольку при этом дробная часть числа отбрасывается.

Если нужно округлить число с плавающей точкой до ближайшего целого числа (что во многих случаях является намного более полезным), используется метод
Math.round.
double x = 9.997;
int nx = (int) Math. round (x);

 

Теперь переменная nx равна 10. При вызове метода round по-прежнему нужно выполнять приведение поскольку возвращаемое им значение имеет тип long, и присвоить его переменной типа int можно лишь с помощью явного приведения.

 

При попытке привести число одного типа к другому результат может выйти за пре­делы допустимого диапазона. В этом случае результат будет усечен.

Например, вы­ражение (byte) 300 равно 44. Поэтому рекомендуется явно проверять заранее, бу­дет ли результат лежать в допустимом диапазоне после приведения типов.

Приведение между булевским и целыми типами невозможно. Это предотвращает появление ошибок. В редких случаях для того, чтобы привести булевское значе­ние к числовому типу, можно использовать условное выражение
b? 1: 0.

№11Классы Java

class Point { int х, у;

Point(int х, int у) {

this.x = х;

this. y = y;

}

double distance(int х, int у) {

int dx = this.x - х;

int dy = this.у - у;

return Math.sqrt(dx*dx + dy*dy);

}

double distance(Point p) {

return distance(p.x, p.y);

} }

class PointDist {

public static void main(String args[]) {

Point p1 = new Point(0, 0);

Point p2 = new Point(30, 40);

System.out.println("p1 = " + pi.x + ", " + p1.y);

System.out.println("p2 = " + p2.x + ", " + p2.y);

System.out.println("p1.distance(p2) = " + p1.distance(p2));

System.out.println("p1.distance(60, 80) = " + p1.distance(60, 80));

} }

 

№12 Конструкторы Java

class Point {
int х, у;
Point(int х, int у) {
this.x = x;
this.y = y;
}
}
class PointCreate {
public static void main(String args[]) {
Point p = new Point(10,20);
System.out.println("x = " + p.x + " у = " + p.y);
}}

№13 Методы в Java

Метод — это именованный обособленный блок кода.
С методом можно выполнить три операции. Объявить — описать, что такой метод есть, однако не расписывать его содержимое, т.е. тело; определить — описать метод с его структурой, т.е. с его телом; вызвать, т.е. запустить этот метод на выполнение.
Объявление метода состоит из двух частей: заголовка метода и его тела.
В заголовке метода указываются его модификаторы, имя метода и в скобках его параметры (аргументы). Тело метода располагается между двумя фигурными скобками и является блоком кода.

Рассмотрим следующие модификаторы.

• Модификаторы доступа — они уже подробно разбирались.
• Модификаторы strictpf, static — они также уже рассматривались.
• Abstract. Он предусматривает только объявление метода. Метод должен быть определен в классах-наследниках (подробнее об этом — в разделе "Наследование").
• Final. Методы не могут переопределяться в классах-наследниках (об этом подробнее см. в том же разделе).
• Native. Если у метода есть такой модификатор, то данный метод написан на другом языке программирования (например, на языке С++).
• Sinchronized— этот модификатор означает, что данный метод защищен от разрушения данных при попытке использования этих данных несколькими методами сразу.

Создадим теперь простой метод и вызовем его (листинг 4.5).

Листинг 4.5.
Создание и вызов простого метода

 

У каждого метода в скобках можно помещать аргументы, или параметры. С помощью аргументов можно передать какие-либо значения методу, над которыми он будет работать. Если передавать методу ссылку (на объект, переменную и т.д.), то значение каких- либо свойств объекта могут измениться. Приведем пример использования методов с аргументами (листинг 4.6).

Листинг 4.6.
Пример использования методов с аргументами

 

Заметим, что при задании ссылки в качестве аргумента значение свойств объекта меняется. Почему так? Дело в том, что передается ссылке, которая находится в аргументе метода, не ссылка как таковая, а сам объект и, следовательно, ссылка, являющаяся аргументом, выступает полноправной ссылкой на объект. И поэтому в методе можно изменять свойства того или иного объекта.

Ранее мы использовали параметр, являющийся массивом объектов String с именем args, который указывается в методе main. Если запускать программу из командной строки, то можно передать в программу несколько значений, которые последовательно будут записываться в элементы этого массива. Если это необходимо, можно получить к ним доступ, указывая соответствующие элементы массива.

Возможно также наличие следующего модификатора типа возвращаемого значения (мы уже указывали модификатор void, означающий то, что метод ничего не возвращает). Метод может возвращать какое-то одно значение. Чтобы метод возвращал значение, нужно указать модификатор типа значения, которое вы собираетесь возвращать, а в конце выполнения метода добавить return с переменной (или значением).

В листинге 4.7 представлен пример использования метода, имеющего модификатор типа возвращаемого значения.

 

Листинг 4.7.
Пример использования метода, имеющего модификатор типа j возвращаемого значения

 

 

Перегруженные методы

Если два и более методов класса имеют одно имя, но их параметры не совпадают, то такие методы называют перегруженными. Примером перегруженных методов являются конструкторы. Пример в листинге 4.8.

Листинг 4.8.
Пример перегруженных методов

№14Классы-шаблоны

Шаблон класса

Параметры шаблона класса указываются в угловых скобках. Класс не может быть потомком класса Throwable. Если в С++ по шаблону класса создается именно новый класс, то в Java типы, созданные по одному шаблону, являются классом этого шаблона. Поэтому тип параметра нельзя использовать для определения статических членов или использовать в статических методах.

 

public class TstTpl<T> {

private T t;

 

public TstTpl(T tt) {

t = tt;

}

 

public void out() {

System.out.println("tplclass="+getClass()+

", param class=" + t.getClass() + ", val="

+ t.toString());

}

 

public static void main(String[] args) {

new TstTpl<Boolean>(true).out();

 

// сгенерированные типы принадлежат одному классу

TstTpl<Integer> a = new TstTpl<Integer>(1);

TstTpl<Double> b = new TstTpl<Double>(3.14);

System.out.println(a.getClass() == b.getClass());

}

}

№ 15 шаблон метода

Аналогичным образом в классе можно определить шаблонный метод.

 

public class TstTplm {

 

static <T1, T2> void outmerge(T1 t1, T2 t2) {

System.out.println(t1.toString() + t2);

}

 

public static void main(String[] args) {

outmerge(new Double(3.14),new Boolean(true));

}

}

№16 Методы с переменным числом параметров

Можно создавать методы с переменным числом параметров. В этом случае используется многоточие.

 

public static double getMaxValue(Object... args) {

// код

}

По сути, создаётся массив типа Object[].

Создадим метод, вычисляющий и возвращающий максимальное из произвольного количества значений.

 

public static double getMaxValue(double... values) {

double largest = Double.MIN_VALUE;

for(double v: values) {

if (v > largest) {

largest = v;

}

}

return largest;

}

№17 Наследование.

Наследование является неотъемлемой частью Java. При использовании наследования вы говорите: Этот новый класс похож на тот старый класс. В коде это пишется как extends, после которого указываете имя базового класса. Тем самым вы получаете доступ ко всем полям и методам базового класса. Используя наследование, можно создать общий класс, которые определяет характеристики, общие для набора связанных элементов. Затем вы можете наследоваться от него и создать новый класс, который будет иметь свои уникальные характеристики. Главный наследуемый класс в Java называют суперклассом. Наследующий класс называют подклассом. Получается, что подкласс - это специализированная версия суперкласса, которая наследует все члены суперкласса и добавляет свои собственные уникальные элементы. К примеру, в Android есть класс View и подкласс TextView.

Чтобы наследовать класс, достаточно вставить имя наследуемого класса с использованием ключевого слова extends:

 

public class MainActivity extends Activity {

 

}

В этом коде мы наследуемся от класса Activity и добавляем свой код, который будет отвечать за наше приложение.

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

В производный класс можно добавлять новые методы.

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

Хотя подкласс включает в себя все члены своего суперкласса, он не может получить доступ к тем членам суперкласса, которые объявлены как private.

Помните, мы создавали класс Box для коробки кота. Давайте наследуемся от этого класса и создадим новый класс, который будет иметь не только размеры коробки, но и вес.

В том же файле Box.java после последней закрывающей скобки добавьте новый код:

 

class HeavyBox extends Box {

int weight; // вес коробки

 

// конструктор

HeavyBox(int w, int h, int d, int m) {

width = w;

height = h;

depth = d;

weight = m; // масса

}

}

Возвращаемся в главную активность и пишем код:

 

HeavyBox box = new HeavyBox(15, 10, 20, 5);

 

int vol = box.getVolume();

 

textInfo.setText("Объём коробки: " + vol + " Вес коробки: " + box.weight);

Обратите внимание, что мы вызываем метод getVolume(), который не прописывали в классе HeavyBox. Однако мы можем его использовать, так как мы наследовались от класса Box и нам доступны все открытые поля и методы. Заодно мы вычисляем вес коробки с помощью новой переменной, которую добавили в подкласс.

При желании вы можете создать множество разных классов на основе одного суперкласса. Например, мы можем создать цветную коробку.

 

class ColorBox extends Box {

int color; // цвет коробки

 

// конструктор

ColorBox(int w, int h, int d, int c) {

width = w;

height = h;

depth = d;

color = c; // цвет

}

}

№18 Полиморфизм

В данной статье мы рассмотрим полиморфизм. Он представляет собой один из краеугольных камней ООП. Суть полиморфизма заключается в том, что вы можете использовать наследников, как родителей. При этом, если в классе-наследнике был переопределен какой — то метод, то вызовется он.
Рассмотрим простой пример. Пусть у нас есть некоторый класс Shape(фигура), в котором есть только один метод рисовать. Очевидно, что в классе Shape он ничего делать не будет, потому что не понятно, что собственно говоря надо отрисовать, какую фигуру:

1 2 3 4 5 public class Shape { public void draw() { //ничего не делаем } }

После этого мы создаем различные классы-наследники: Square (квадрат), Сircle (круг) и Triangle:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class Square extends Shape { public void draw() { System.out.println("Квадрат"); } } public class Сircle extends Shape { public void draw() { System.out.println("Круг"); } } public class Triangle extends Shape { public void draw() { System.out.println("Треугольник"); } }

Как вы могли заметить в наследниках у нас переопределен метод draw.
Теперь увидим, в чем заключается удивительная возможность полиморфизма:

1 2 3 4 5 Shape[] a = new Shape[]{new Shape(), new Triangle(), new Square(), new Сircle()}; for(int i = 0; i < a.length; i++) { a[i].draw(); }

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

№19 Абстрактные классы

Абстрактным называется класс, на основе которого не могут создаваться объекты. При этом наследники класса могут быть не абстрактными, на их основе объекты создавать, соответсвенно, можно.

Для того, чтобы превратить класс в абстрактный перед его именем надо указать модификатор abstract.

Рассмотрим пример абстрактного класса A:

abstract class A {
int p1;
A() {
p1 = 1;
}
void print() {
System.out.println(p1);
}
}
class B extends A {
}
public class Main {
public static void main(String[] args) {
A ob1;
// ошибка: ob1 = new A();
B ob2 = new B(); // будет вызван конструктов по умолчанию из A
ob2.print();
}
}

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

№20 Интерфейсы

Интерфейс это консутрукция языка программирования Java, в рамках которой могут описываться только абстрактные публичные (abstract public) методы и статические константyst свойства (final static). То есть также, как и на основе абстрактных классов, на основе интерфейсов нельзя порождать объекты.

Один интерфейс может быть наследником другого интерфейса.

Классы могут реализовывать интерфейсы (т. е. получать от интерфейса список методов и описывать реализацю каждого из них), притом, что особенно важно, один класс может реализовывать сразу несколько интерфейсов.

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

Пример:

interface Instruments {
final static String key = "До мажор";
public void play();
}
class Drum implements Instruments {
public void play() {
System.out.println("бум бац бац бум бац бац");
}
}
class Guitar implements Instruments {
public void play() {
System.out.println("до ми соль до ре до");
}
}

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

interface Instruments {
static public String key = "До мажор";
void play();
}

Но когда метод play() будет описываться в реализующем интерфейс классе, перед ним всё равно необходимо будет явно указать модификатор public.

№21 Работа со строками

В этой главе обсуждаются средства языка Java для работы со строками. В язы­ках С и C++ отсутствует встроенная поддержка такого объекта, как строка. В них при необхо­димости передается адрес последовательности байтов, содержимое которых трактуется как символы до тех пор, пока не будет встречен нулевой байт, отмечающий конец строки. В пакет java.lang встроен класс, инкапсулирующий структуру данных, соответ­ствующую строке. Этот класс, называемый String, не что иное, как объ­ектное представление неизменяемого символьного массива. В этом классе есть методы, которые позволяют сравнивать строки, осуществлять в них поиск и извлекать определенные символы иподстроки. Класс StringBufferиспользуется тогда, когда строку после создания требу­ется изменять. ВНИМАНИЕ И String, и StringBuffer объявлены final, что означает, что ни от одного из этих классов нельзя производить подклассы. Это было сделано для того, чтобы можно было применить некоторые виды оптимизации по­зволяющие увеличить производительность при выполнении операций обработки строк. Конструкторы Как и в случае любого другого класса, вы можете создавать объекты типа String с помощью оператора new. Для создания пустой строки ис­пользуется конструктор без параметров: String s = new String(): Приведенный ниже фрагмент кода создает объект s типа String иници­ализируя его строкой из трех символов, переданных конструктору в ка­честве параметра в символьном массиве. char chars[] = { 'а', 'b', 'с' }: String s = new String(chars); System.out.println(s): Этот фрагмент кода выводит строку «abc». Итак, у этого конструктора — 3 параметра: String(char chars[], int начальныйИндекс, int числоСимволов); Используем такой способ инициализации в нашем очередном примере: char chars[] = { 'a', 'b', 'с', 'd', 'e', 'f' }: String s = new String(chars,2,3); System.out.println(s); Этот фрагмент выведет «cde».   Специальный синтаксис для работы со строками В Java включено несколько приятных синтаксических дополнений, цель которых — помочь программистам в выполнении операций со строками. В числе таких операций создание объектов типа String слияние нескольких строк и преобразование других типов данных в символьное представление. Создание строк Java включает в себя стандартное сокращение для этой опера­ции — запись в виде литерала, в которой содержимое строки заключа­ется в пару двойных кавычек. Приводимый ниже фрагмент кода экви­валентен одному из предыдущих, в котором строка инициализировалась массивом типа char. String s = "abc"; System.out.println(s); Один из общих методов, используемых с объектами String — метод length, возвращающий число символов в строке. Очередной фрагмент вы­водит число 3, поскольку в используемой в нем строке — 3 символа. String s = "abc"; System.out.println(s.length); В Java интересно то, что для каждой строки-литерала создается свой представитель класса String, так что вы можете вызывать методы этого класса непосредственно со строками-литералами, а не только со ссылоч­ными переменными. Очередной пример также выводит число 3. System.out.println("abc".Length());   Слияние строк Строку String s = «Не is » + age + " years old."; в которой с помощью оператора + три строки объединяются в одну, про­честь и понять безусловно легче, чем ее эквивалент, записанный с яв­ными вызовами тех самых методов, которые неявно были использованы в первом примере: String s = new StringBuffer("He is ").append(age); s.append(" years old.").toString(); По определению каждый объект класса String не может изменять­ся. Нельзя ни вставить новые символы в уже существующую строку, ни поменять в ней одни символы на другие. И добавить одну строку в конец другой тоже нельзя. Поэтому транслятор Java преобразует опера­ции, выглядящие, как модификация объектов String, в операции с род­ственным классом StringBuffer.   ЗАМЕЧАНИЕ Все это может показаться вам необоснованно сложным. А почему нельзя обойтись одним классом String, позволив ему вести себя при­мерно так же, как StringBuffer? Все дело в производительности. Тот факт, что объекты типа String в Java неизменны, позволяет транслято­ру применять к операциям с ними различные способы оптимизации.   Последовательность выполнения операторов Давайте еще раз обратимся к нашему последнему примеру: String s = "Не is " + age + " years old."; В том случае, когда age — не String, а переменная, скажем, типа int, в этой строке кода заключено еще больше магии транслятора. Целое значение переменной int передается совмещенному методу append класса StringBuffer, который преобразует его в текстовый вид и добавляет в конец содержащейся в объекте строки. Вам нужно быть вниматель­ным при совместном использовании целых выражений и слияния строк, в противном случае результат может получиться совсем не тот, который вы ждали. Взгляните на следующую строку: String s = "four: " + 2 + 2; Быть может, вы надеетесь, что в s будет записана строка «four: 4»? Не угадали — с вами сыграла злую шутку последовательность выпол­нения операторов. Так что в результате получа­ется "four: 22". Для того, чтобы первым выполнилось сложение целых чисел, нужно использовать скобки: String s = "four: " + (2 + 2); Преобразование строк В каждом классе String есть метод toString — либо своя собственная реализация, либо вариант по умолчанию, наследуемый от класса Object. Класс в нашем очередном примере замещает наследуемый метод toStrring своим собственным, что позволяет ему выводить значения переменных объекта.   class Point { int х, у; Point(int x, int у) { this.x = х; this.у = у; } public String toString() { return "Point[" + x + ", " + у + "]"; } } class toStringDemo { public static void main(String args[]) { Point p = new Point(10, 20); System.out.println("p = " + p); } }   Ниже приведен результат, полученный при запуске этого примера. С:\> Java toStringDemo p = Point[10, 20] Извлечение символов Для того, чтобы извлечь одиночный символ из строки, вы можете со­слаться непосредственно на индекс символа в строке с помощью метода charAt. Если вы хотите в один прием извлечь несколько символов, можете воспользоваться методом getChars. В приведенном ниже фрагменте показано, как следует извлекать массив символов из объекта типа String.   class getCharsDemo { public static void main(String args[]) { String s = "This is a demo of the getChars method."; int start = 10; int end = 14; char buf[] = new char[end - start]; s.getChars(start, end, buf, 0); System.out.println(buf); } } Обратите внимание — метод getChars не включает в выходной буфер символ с индексом end. Это хорошо видно из вывода нашего примера — выводимая строка состоит из 4 символов. С:\> java getCharsDemo demo   Для удобства работы в String есть еще одна функция — toCharArray, которая возвращает в выходном массиве типа char всю строку. Альтернативная форма того же самого механизма позволяет записать содержимое строки в массив типа byte, при этом значения старших бай­тов в 16-битных символах отбрасываются. Соответствующий метод на­зывается getBytes, и его параметры имеют тот же смысл, что и пара­метры getChars, но с единственной разницей — в качестве третьего параметра надо использовать массив типа byte.   Сравнение Если вы хотите узнать, одинаковы ли две строки, вам следует воспользоваться методом equals класса String. Альтернативная форма этого метода называется equalsIgnoreCase, при ее использовании различие ре­гистров букв в сравнении не учитывается. Ниже приведен пример, иллюстрирующий использование обоих методов:   class equalDemo { public static void main(String args[]) { String s1 = "Hello"; String s2 = "Hello"; String s3 = "Good-bye"; String s4 = "HELLO"; System.out.println(s1 + " equals " + s2 + " -> " + s1.equals(s2)); System.out.println(s1 + " equals " + s3 + " -> " + s1.equals(s3)); System.out.println(s1 + " equals " + s4 + " -> " + s1.equals(s4)); System.out.println(s1 + " equalsIgnoreCase " + s4 + " -> " + s1.equalsIgnoreCase(s4)); } }   Результат запуска этого примера: С:\> java equalsDemo Hello equals Hello -> true Hello equals Good-bye -> false Hello equals HELLO -> false Hello equalsIgnoreCase HELLO -> true   В классе String реализована группа сервисных методов, являющихся специализированными версиями метода equals.Метод regionMatches используется для сравнения подстроки в исходной строке с подстрокой в строке-параметре.Метод startsWith проверяет, начинается ли данная подстрока фрагментом, переданным методу в качестве параметра.Метод endsWith проверяет совпадает ли с параметром конец строки.   Равенство Метод equals и оператор == выполняют две совершенно различных проверки. Если метод equal сравнивает символы внутри строк, то опе­ратор == сравнивает две переменные-ссылки на объекты и проверяет, указывают ли они на разные объекты или на один и тот же. В очеред­ном нашем примере это хорошо видно — содержимое двух строк оди­наково, но, тем не менее, это — различные объекты, так что equals и == дают разные результаты.   class EqualsNotEqualTo { public static void main(String args[]) { String s1 = "Hello"; String s2 = new String(s1); System.out.println(s1 + " equals " + s2 + " -> " + s1.equals(s2)); System.out.println(s1 + " == " + s2 + ", -> " + (s1 == s2)); } }   Вот результат запуска этого примера: C:\> java EqualsNotEqualTo Hello equals Hello -> true Hello == Hello -> false Упорядочение Зачастую бывает недостаточно просто знать, являются ли две строки идентичными. Для приложений, в которых требуется сортировка, нужно знать, какая из двух строк меньше другой. Для ответа на этот вопрос нужно воспользоваться методом compareTo класса String. Если целое значение, возвращенное методом, отрицательно, то строка, с которой был вызван метод, меньше строки-параметра, если положительно — больше. Если же метод compareTo вернул значение 0, строки идентичны. Ниже приведена программа, в которой выполняется пузырьковая сорти­ровка массива строк, а для сравнения строк используется метод compareTo. Эта программа выдает отсортированный в алфавитном порядке список строк.   class SortString { static String arr[] = {"Now", "is", "the", "time", "for", "all", "good", "men", "to", "come", "to", "the", "aid", "of", "their", "country" }; public static void main(String args[]) { for (int j = 0; i < arr.length; j++) { for (int i = j + 1; i < arr.length; i++) { if (arr[i].compareTo(arr[j]) < 0) { String t = arr[j]; arr[j] = arr[i]; arr[i] = t; } } System.out.println(arr[j]); } } }     indexOf и lastIndexOf В класс String включена поддержка поиска определенного символа или подстроки, для этого в нем имеются два метода — indexOf и lastIndexOf. Каждый из этих методов возвращает индекс того символа, который вы хотели найти, либо индекс начала ис­комой подстроки. В любом случае, если поиск оказался неудачным ме­тоды возвращают значение -1. В очередном примере показано, как пользоваться различными вариантами этих методов поиска.   class indexOfDemo { public static void main(String args[]) { String s = "Now is the time for all good men " + "to come to the aid of their country " + "and pay their due taxes."; System.out.println(s); System.out.println("indexOf(t) = " + s.indexOf('f’)); System.out.println("lastlndexOf(t) = " + s.lastlndexOf('f’)); System.out.println("indexOf(the) = " + s.indexOf("the")); System.out.println("lastlndexOf(the) = " + s.lastlndexOf("the")); System.out.println("indexOf(t, 10) = " + s.indexOf('f’, 10)); System.out.println("lastlndexOf(t, 50) = " + s.lastlndexOf('f’, 50)); System.out.println("indexOf(the, 10) = " + s.indexOf("the", 10)); System.out.println("lastlndexOf(the, 50) = " + s.lastlndexOf("the", 50)); } }   Ниже приведен результат работы этой программы. Обратите внимание на то, что индексы в строках начинаются с нуля. С:> java indexOfDemo Now is the time for all good men to come to the aid of their country and pay their due taxes. indexOf(t) = 7 lastlndexOf(t) = 87 indexOf(the) = 7 lastlndexOf(the) = 77 index0f(t, 10) = 11 lastlndex0f(t, 50) = 44 index0f(the, 10) = 44 lastlndex0f(the, 50) = 44 Модификация строк при копировании Поскольку объекты класса String нельзя изменять, всякий раз, когда вам захочется модифицировать строку, придется либо копировать ее в объект типа StringBuffer, либо использовать один из описываемых ниже методов класса String, которые создают новую копию строки, внося в нее ваши изменения. substring Вы можете извлечь подстроку из объекта String, используя метод sub­string. Этот метод создает новую копию символов из того диапазона ин­дексов оригинальной строки, который вы указали при вызове. Можно указать только индекс первого символа нужной подстроки — тогда будут скопированы все символы, начиная с указанного и до конца строки. Также можно указать и начальный, и конечный индексы — при этом в новую строку будут скопированы все символы, начиная с первого ука­занного, и до (но не включая его) символа, заданного конечным индек­сом. "Hello World".substring(6) -> "World" "Hello World".substring(3,8) -> "lo Wo" concat Слияние, или конкатенация строк выполняется с помощью метода concat. Этот метод создает новый объект String, копируя в него содер­жимое исходной строки и добавляя в ее конец строку, указанную в параметре метода. "Hello".concat(" World") -> "Hello World" replace Методу replace в качестве параметров задаются два символа. Все сим­волы, совпадающие с первым, заменяются в новой копии строки на вто­рой символ. "Hello".replace('l', 'w') -> "Hewwo" toLowerCase и toUpperCase Эта пара методов преобразует все символы исходной строки в нижний и верхний регистр, соответственно. "Hello".toLowerCase() -> "hello" "Hello".toUpperCase() -> "HELLO" trim И, наконец, метод trim убирает из исходной строки все ведущие и замыкающие пробелы. “Hello World “.trirn() -> "Hello World" valueOf Если вы имеете дело с каким-либо типом данных и хотите вывести значение этого типа в удобочитаемом виде, сначала придется преобразо­вать это значение в текстовую строку. Для этого существует метод val­ueOf. Такой статический метод определен для любого существующего в Java типа данных (все эти методы совмещены, то есть используют одно и то же имя). Благодаря этому не составляет труда преобразовать в стро­ку значение любого типа. StringBuffer StringBuffer — близнец класса String, предоставляющий многое из того, что обычно требуется при работе со строками. Объекты класса String представляют собой строки фиксированной длины, которые нельзя изме­нять. Объекты типа StringBuffer представляют собой последовательности символов, которые могут расширяться и модифицироваться. Java активно ис­пользует оба класса, но многие программисты предпочитают работать только с объектами типа String, используя оператор +. При этом Java вы­полняет всю необходимую работу со StringBuffer за сценой. Конструкторы Объект StringBuffer можно создать без параметров, при этом в нем будет зарезервировано место для размещения 16 символов без возмож­ности изменения длины строки. Вы также можете передать конструкто­ру целое число, для того чтобы явно задать требуемый размер буфера. И, наконец, вы можете передать конструктору строку, при этом она будет скопирована в объект и дополнительно к этому в нем будет заре­зервировано место еще для 16 символов. Текущую длину StringBuffer можно определить, вызвав метод length, а для определения всего места, зарезервированного под строку в объекте StringBuffer нужно воспользоваться методом capacity. Ниже приведен пример, поясняющий это:   class StringBufferDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("Hello"); System.out.println("buffer = " + sb); System.out.println("length = " + sb.length()); System.out. println("capacity = " + sb.capacity()); } }   Вот вывод этой программы, из которого видно, что в объекте String-Buffer для манипуляций со строкой зарезервировано дополнительное место. С:\> java StringBufferDemo buffer = Hello length = 5 capacity = 21 ensureCapacity Если вы после создания объекта StringBuffer захотите зарезервировать в нем место для определенного количества символов, вы можете для установки размера буфера воспользоваться методом ensureCapacity. Это бывает полезно, когда вы заранее знаете, что вам придется добавлять к буферу много небольших строк. setLength Если вам вдруг понадобится в явном виде установить длину строки в буфере, воспользуйтесь методом setLength. Если вы зададите значение, большее чем длина содержащейся в объекте строки, этот метод заполнит конец новой, расширенной строки символами с кодом нуль. В приводимой чуть дальше программе setCharDemo метод sstLength используется для укорачивания буфера. charAt и setCharAt Одиночный символ может быть извлечен из объекта StringBuffer с помощью метода charAt. Другой метод setCharAtпозволяет записать в заданную позицию строки нужный символ. Использование обоих этих методов проиллюстрировано в примере:   class setCharAtDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("Hello"); System.out.println("buffer before = " + sb); System.out.println("charAt(1) before = " + sb.charAt(1)); sb.setCharAt(1, 'i'); sb.setLength(2); System.out.println("buffer after = " + sb); System.out.println("charAt(1) after = " + sb.charAt(1)); } }   Вот вывод, полученный при запуске этой программы. C:\> java setCharAtDemo buffer before = Hello charAt(1) before = e buffer after = Hi charAt(1) after = i append Метод append класса StringBuffer обычно вызывается неявно при ис­пользовании оператора + в выражениях со строками. Для каждого параметра вызывается метод String.valueOf и его результат до­бавляется к текущему объекту StringBuffer. К тому же при каждом вы­зове метод append возвращает ссылку на объект StringBuffer, с которым он был вызван. Это позволяет выстраивать в цепочку последовательные вызовы метода, как это показано в очередном примере.   class appendDemo { public static void main(String args[]) { String s; int a = 42; StringBuffer sb = new StringBuffer(40); s = sb.append("a = ").append(a).append("!").toString(); System.out.println(s); } }   Вот вывод этого примера: С:\> Java appendDemo а = 42! insert Метод insert идентичен методу append в том смысле, что для каждого возможного типа данных существует своя совмещенная версия этого ме­тода. Правда, в отличие от append, он не добавляет символы, возвра­щаемые методом String.valueOf, в конец объекта StringBuffer, а встав­ляет их в определенное место в буфере, задаваемое первым его параметром. В очередном нашем примере строка "there" вставляется между "hello" и "world!".   class insertDemo { public static void main(String args[]) { StringBuffer sb = new StringBuffer("hello world!"); sb.insert(6,"there "); System.out.println(sb); } } При запуске эта программа выводит следующую строку: С:\> java insertDemo hello there world!

№ 22 Класс File

Класс File может использоваться для создания каталога или дерева каталогов. Также можно узнать свойства файлов (размер, дату последнего изменения, режим чтения/записи), определить к какому типу (файл или каталог) относится объект File, удалить файл. У класса очень много методов, перечислим некоторые.

· getAbsolutePath() - абсолютный путь файла, начиная с корня системы. В Android корневым элементом является символ слеша (/)

· canRead() - доступно для чтения

· canWrite() - доступно для записи

· exists() - файл существует или нет

· getName() - возвращает имя файла

· getParent() - возвращает имя родительского каталога

· getPath() - путь

· lastModified() - дата последнего изменения

· isFile() - объект является файлом, а не каталогом

· isDirectory - объект является каталогом

· isAbsolute() - возвращает true, если файл имеет абсолютный путь

· renameTo(File newPath) - переименовывает файл. В параметре указывается имя нового имени файла. Если переименование прошло неудачно, то возвращается false

· delete() - удаляет файл. Также можно удалить пустой каталог

import java.io.File;

class DirList {

public static void main(String args[]) {

String dirname = "/java"; // имя каталога

File f1 = new File(dirname);

if (f1.isDirectory()) { // является ли f1 каталогом

System.out.println("Directory of ' + dirname);

String s[] = f1.list();

for (int i=0; i < s.length; i++) {

File f = new File(dirname + "/" + s[i]);

if (f.isDirectory()) { // является ли f каталогом System.out.println(s[i] + " is a directory"):

} else {

System.out.println(s[i] + " is a file");

} } } else {

System.out.println(dirname + " is not a directory");

} }

}

№ 24 Сериализация

class parent implements Serializable {
int parentVersion = 10;
}

class contain implements Serializable{
int containVersion = 11;
}
public class SerialTest extends parent implements Serializable {
int version = 66;
contain con = new contain();

public int getVersion() {
return version;
}
public static void main(String args[]) throws IOException {
FileOutputStream fos = new FileOutputStream("temp.out");
ObjectOutputStream oos = new ObjectOutputStream(fos);
SerialTest st = new SerialTest();
oos.writeObject(st);
oos.flush();
oos.close();
}
}

№26Коллекции. Списки.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2018-01-08 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: