java-lekcii-2016-01-17 / presentation-oct-24
.docxКлассы и объекты
Объект – программная сущность, объединяющая состояние (поля, переменные) и поведение (методы, функции).
Класс – шаблон, по которому создаются объекты.
В 99% случаев каждый класс должен создаваться в отдельном файле.
Модификаторы видимости
Private – виден только этому классу
Package-private – виден всем классам в этом пакете (используется по умолчанию)
Protected – виден этому классу и всем потомкам
Public – виден всем классам
Классы могут быть только package-private или public. Поля и методы могут иметь любой модификатор.
Пример класса
package ru.mami; // Название пакета, к которому относится класс
public class User { // Объявление класса с именем User и видимостью public
private String name; // Поле (переменная) класса. Видна из всех методов.
/**
* Конструктор, используется для создания класса. Не имеет возвращаемого
* значения (всегда возвращает созданный объект класса).
* Название должно соответствовать названию класса. В остальном работает
* как обычный метод (может иметь входные параметры и т.п.)
*
* Если у класса только один конструктор и он ничего не делает (как в
* данном случае), прописывать его не обязательно, т.к. он будет создан
* автоматически.
*/
public User() {
}
// Метод для получения значения переменной (public, виден извне)
public String getName() {
return name;
}
// Метод для задания значения переменной (public, виден извне)
public void setName(String name) {
this.name = name;
}
}
Использование класса
package ru.mami;
public final class Main {
public static void main(String[] args) {
// Создание класса с использованием конструктора
User mike = new User();
// Использование методов класса
mike.setName("Mike");
System.out.println(mike.getName()); // Mike
mike.setName("Bill");
System.out.println(mike.getName()); // Bill
}
}
Пример класса со статичными методами
package ru.mami; // Название пакета, к которому относится класс
public class User { // Объявление класса с именем User и видимостью public
private String name; // Поле (переменная) класса. Видна из всех методов.
/**
* Конструктор, используется для создания класса. Не имеет возвращаемого
* значения (всегда возвращает созданный объект класса). Название должно
* соответствовать названию класса. В остальном работает как обычный метод
* (может иметь входные параметры и т.п.)
*
* Если у класса только один конструктор и он ничего не делает (как в данном
* случае), прописывать его не обязательно, т.к. он будет создан
* автоматически.
*/
public User() {
}
// Метод для получения значения переменной (public, виден извне)
public String getName() {
return name;
}
// Метод для задания значения переменной (public, виден извне)
public void setName(String name) {
this.name = name;
}
/**
* Статичные методы не могут использовать поля, принадлежащие объектам
* класса (в данном случае main), и из-за этого могут быть вызваны без
* создания объекта.
*
* Данный метод проверяет, может ли строка являться именем.
*/
public static boolean isName(String text) {
// Имя должно содержать как минимум три буквы
if (text.length() < 3) {
return false;
}
// Имя должно начинаться с большой буквы
char firstChar = text.charAt(0);
if (!Character.isLetter(firstChar)
|| !Character.isUpperCase(firstChar)) {
return false;
}
// Все остальные буквы должны быть маленькими
for (int i = 1; i < text.length(); ++i) {
char currentChar = text.charAt(i);
if (!Character.isLetter(currentChar)
|| Character.isUpperCase(currentChar)) {
return false;
}
}
// Если выполнение метода дошло до этой точки, строка может быть именем
return true;
}
}
Пример использования класса со статичными методами
package ru.mami;
public final class Main {
public static void main(String[] args) {
// Методы вызваны через имя класса (без создания объекта)
System.out.println(User.isName("Mike")); // true
System.out.println(User.isName("dog")); // false
}
}
Пример использования класса с нестандартным конструктором
package ru.mami;
public class User {
// Слово final означает, что значение переменной может быть задано только
// один раз и только в конструкторе. После этого значение не может быть
// изменено.
private final String name;
/**
* Конструктор, принимающий параметр. Так как в классе присутствует
* конструктор, стандартный конструктор без параметров автоматически не
* создается
*/
public User(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Пример использования класса с нестандартным конструктором
package ru.mami;
public final class Main {
public static void main(String[] args) {
// User mike = new User(); // Ошибка: такого конструктора не существует
User mike = new User("Mike");
System.out.println(mike.getName()); // Mike
}
}
Пример класса с несколькими конструкторами
package ru.mami;
public class User {
private String name;
public User() {
}
public User(String name) {
this.name = name;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
Пример использования класса с несколькими конструкторами
package ru.mami;
public final class Main {
public static void main(String[] args) {
User mike = new User();
mike.setName("Mike");
System.out.println(mike.getName());
User bill = new User("Bill");
System.out.println(bill.getName());
}
}
Упражнения
-
Создать класс User с полями для имени, фамилии и адреса (тип String). Добавить методы для получения и задания значений каждого из них.
-
Добавить конструктор, который задает все значения. Оставить возможность создать объект класса с использованием стандартного конструктора.
-
Добавить метод, возвращающий полное имя (имя + фамилия)
-
Убрать возможность создания объекта без указания имени и фамилии и сделать их неизменяемыми. Адрес оставить необязательным.
-
Создать класс Address с полями для города, улицы, номера дома и номера квартиры. Значение полей может изменяться.
-
Использовать класс Address в классе User для хранения информации об адресе.