Классы и объекты
Классы в Java содержат переменные-члены класса, а также методы и конструкторы. Все функции определяются внутри классов и называются методами; невозможно создать метод, не являющийся методом класса или объявить метод вне класса; спецификаторы доступа public, private, protected воздействуют только на то, перед чем они стоят; элементы по умолчанию доступны для классов из данного пакета. Объявление класса имеет вид:
[спецификаторы] class имя_класса [extends суперкласс] [implements список_интерфейсов]
{/*определение класса*/}
Спецификатор доступа класса может быть public (класс доступен объектам данного пакета и вне пакета), final (класс не может иметь подклассов), abstract (класс содержит абстрактные методы, объекты такого класса могут создавать только подклассы). По умолчанию спецификатор устанавливается в friendly (класс доступен в данном пакете). Данное слово при объявлении вообще не используется и не является ключевым словом языка, мы его используем для обозначения.
/* пример # 5 : простой пример класса : Subject.java */
class Subject {
public String name;
private int age;
public Subject() {//конструктор
name = "NoName";
age = 0;
}
public Subject(String n) {//конструктор
name = n;
}
public void setAge(int a) {//метод
age = a;
}
Void show() { //метод
System.out.println("Имя: " + name + ", Возраст: " + age);
}
}
Класс Subject содержит два поля name и age, помеченные как public и private. Значение поля age можно изменять только при помощи методов, например, setAge(). Поле name доступно и напрямую через объект класса Subject. Доступ к методам и public полям данного класса осуществляется только после создания объекта данного класса.
/* пример # 6 : объявление объекта, доступ к полям и методам объекта : SubjectDemo.java */
public class SubjectDemo {
public static void main(String[] args) {
Subject ob = new Subject("Балаганов");
ob.name = "Шура Балаганов";
//ob.age = 19;// поле недоступно
ob.setAge(19);
ob.show();
}
}
Компиляция и выполнение данного кода приведут к выводу на консоль следующей информации:
Имя: Шура Балаганов, Возраст: 19
Классы из примеров 5 и 6 можно сохранять перед компиляцией в одном файле SubjectDemo.java, причем имя этому файлу дается по имени public класса, то есть SubjectDemo.
Объект класса создается за два шага. Сначала объявляется ссылка на объект класса. Затем с помощью оператора new создается экземпляр объекта, например:
String str; //объявление ссылки
str = new String(); //создание объекта
Однако эти два действия обычно объединяют в одно:
String s = new String();/*объявление ссылки и создание объекта*/
Оператор new вызывает конструктор, поэтому в круглых скобках могут стоять аргументы, передаваемые конструктору. Операция присваивания для объектов означает, что две ссылки будут указывать на один и тот же участок памяти.
Операции сравнения ссылок не имеют особого смысла. Для сравнения значений объектов необходимо использовать соответствующие методы, например equals(). Этот метод наследуется в каждый класс из суперкласса Object, который лежит в корне дерева иерархии классов. x.equals(y) возвращает true, если x и y ссылаются на один и тот же объект. Рассмотрим пример:
/* пример # 7 : сравнение строк и объектов : ComparingStrings.java */
public class ComparingStrings {
public static void main(String[] args) {
String s1, s2;
s1 = "abc";
s2 = s1; // переменная ссылается на ту же строку
System.out.println("сравнение ссылок " + (s1 == s2)); //true
s1 += 'd';//создание нового объекта добавлением символа
//s1-="a";//ошибка, вычитать строки нельзя
System.out.println("сравнение ссылок " + (s1 == s2)); //false
s2 = new String(s1);//создание нового объекта копированием
System.out.println("сравнение ссылок " + (s1 == s2)); //false
System.out.println("сравнение значений " + s1.equals(s2)); //true
}
}
Объекты можно преобразовывать друг к другу с помощью соответствующих методов и конструкторов. В следующем примере с консоли (из потока System.in) считываются три цифровые строки, преобразуются в объекты класса Integer с помощью метода Integer.valueOf(), а затем объекты класса Integer преобразуются в целые числа типа int с помощью метода intValue() этого же класса.
/* пример # 8 : чтение строк из консоли и преобразование их к целым числам : ConsoleStringInt.java */
import java.io.*;
public class ConsoleStringInt {
public static void main(String[] args) {
//буферизация входного потока
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
//объявление массива строк
String masStr[] = new String[3];
//объявление массива целых чисел
int masInt[] = new int[3];
try {
System.out.print("введите целое число и нажмите Enter ->");
for (int i = 0; i < 3; i++) {
//чтение строки, содержащее целое число
masStr[i] = br.readLine();
//преобразование строки к целому числу
masInt[i] = Integer.valueOf(masStr[i]).intValue();
}
System.out.print("массив: ");
for (int i = 0; i < 3; i++) {
System.out.print(masInt[i] + "; ");
}
//обработка ошибки чтения с консоли
} catch (IOException e) {
System.out.print("ошибка ввода " + e);
//обработка ошибки при неправильном формате целого числа
} catch (NumberFormatException e) {
System.out.print("невозможно преобразовать строку в числовой формат " + e);
}
}
}
В качестве примера введем в ответ на запрос в консоль некоторые целые числа и получим следующий результат:
введите целое число и нажмите Enter ->
345
5
48
массив: 345; 5; 48;
При вводе символов, не являющихся цифрами, на экран будет выдано сообщение об ошибке преобразования их к целому числу.
Задание:
Составьте программу, которая преобразует дату, месяц и год Вашего рождения, введенные в разных строках в целые числа.
