Тутор: классы в Java
Почти все в Java - классы и объекты.
Чтобы объединить какие-то компоненты (например возраст, вес и имя) в одну сущность (человека например) - удобно завести новый тип. В случае явы это класс.
В первую очередь в классе есть поля - это переменные, которые являются составными каждого объекта данного класса. И методы - функции данного объекта
class Human {
int age; // поле типа int с именем age
float weight; // поле типа float с именем weight
String name; // поле типа String с именем name
public String ask(String question) { // метод ask: String в начале - тип возвращаемого результата, ask - название метода, String question - аргумент вызова метода
// через ключевое слово this можно явно добраться до всех полей и методов объекта, в котором мы находимся сейчас (т.е. у кого был вызывал метод ask)
String myName = this.name;
// ключевое слово return - возвращает значение справа от return результатом функции
return "Я (" + myName + ") не понял вопрос: " + question;
}
}
Чтобы создать конкретного человека - нужно создать объект класса Human. Т.е. инстанциировать/сконструировать его через ключевое слово new:
Human human = new Human();
System.out.println("Возраст: " + human.age);
System.out.println("Вес: " + human.weight);
System.out.println("Имя: " + human.name);
Замечание:
Обращаемся мы к полям объекта через точку, т.е. сначала пишется название переменной (объекта) к которой хочется обратиться (в нашем случае human
), затем точка (получается human.
), а затем то что мы хотим из этого объекта взять - это может быть поле (например human.age
) или вызов метода (например human.ask("Hello!")
).
Заметим, что после такого конструирования значения полей нас навряд ли устраивают. А нам бы хотелось чтобы в них лежали какие-то осмысленные значения, т.е. нам хотелось бы инициализировать объект, т.е. инициализировать все поля данного новосозданного объекта.
Для этого в классе можно объявить так называемый конструктор, который занимается инициализированием (конструированием) сущности на момент ее создания, т.е. заполняет какими-то значениями все поля объекта. Для этого ему очевидно нужно знать, какие значения верны для новосозданного человека - они передаются ему через аргументы ровно так же, как передаются и аргументы в функции:
class Human {
int age; // поле
float weight; // поле
String name; // поле
public Human(int age, float weight, String name) { // конструктор
this.age = age;
this.weight = weight;
this.name = name;
}
public String ask(String question) { // метод ask
String myName = this.name;
return "Я (" + myName + ") не понял вопрос: " + question;
}
}
Определение конструктора отличается от методов двумя нюансами:
- его название всегда совпадает с классом в котором он оъявлен и объекты которого он инициализирует
- перед ним не пишется возвращаемый тип, т.к. он всегда совпадает с классом объекты которого конструктор создает