Объектке Багытталган Программалоого (ООП) киришүү
Java объектиге багытталган тил, андыктан анда "класс" жана "объект" сыяктуу түшүнүктөр негизги ролду ойнойт. Ар кандай Java программасын өз ара аракеттенүүчү объекттердин жыйындысы катары кароого болот.
Объекттин шаблону же сүрөттөлүшү класс болуп саналат, ал эми объект ошол класстын мисалын билдирет. Сиз ошондой эле төмөнкү окшоштуктарды тарта аласыз. Баарыбызда адам жөнүндө кандайдыр бир түшүнүк бар - эки колу, эки буту, башы, тулкусу ж.б. Кээ бир шаблон бар - бул шаблон класс деп атоого болот. Чынында бар адам (чындыгында бул класстын мисалы) бул класстын объектиси болуп саналат.
Класс class ачкыч сөзү менен аныкталат:
class Person{
}
Бул учурда класс Персон деп аталат. Класстын аталышынан кийин тармал кашаалар коюлат, алардын арасына класстын денеси – башкача айтканда анын талаалары жана ыкмалары жайгаштырылат.
Ар кандай объект эки негизги мүнөздөмөлөргө ээ болушу мүмкүн: абал - объект сактаган кээ бир маалыматтар жана жүрүм-турум - объект аткара турган аракеттер.
Класста объекттин абалын сактоо үчүн талаалар же класс өзгөрмөлөрү колдонулат. Методдор класстагы объекттин жүрүм-турумун аныктоо үчүн колдонулат. Мисалы, бир адамды билдирген Person классы төмөнкү аныктамага ээ болушу мүмкүн:
class Person{
String name; // имя
int age; // возраст
void displayInfo(){
System.out.printf("Name: %s \tAge: %d\n", name, age);
}
}
Person классы эки талааны аныктайт: ысым адамдын атын билдирет, ал эми жашы адамдын жашын билдирет. Ал эми displayInfo ыкмасы да аныкталган, ал эч нерсе кайтарбайт жана бул маалыматты жөн гана консолго басып чыгарат.
Эми бул классты колдонолу. Бул үчүн, биз төмөнкү программаны аныктайт:
public class Program{
public static void main(String[] args) {
Person tom;
}
}
class Person{
String name; // имя
int age; // возраст
void displayInfo(){
System.out.printf("Name: %s \tAge: %d\n", name, age);
}
}
Эреже катары, класстар ар кандай файлдарда аныкталат. Бул учурда, жөнөкөйлүк үчүн, биз бир файлда эки классты аныктайбыз. Белгилей кетчү нерсе, бул учурда бир гана класстын коомдук модификатору болушу мүмкүн (бул учурда, Программа классы), ал эми код файлынын өзү ушул класстын аты менен аталууга тийиш, башкача айтканда, бул учурда файл чакырылышы керек. Program.java.
Класс жаңы типти билдирет, ошондуктан биз ошол типти билдирген өзгөрмөлөрдү аныктай алабыз. Ошентип, бул жерде негизги методдо персон классын билдирген Том өзгөрмөсү аныкталат. Бирок азыр бул өзгөрмө эч кандай объектти көрсөтпөйт жана демейки боюнча ал null маанисине ээ. Жалпысынан алганда, биз аны азырынча колдоно албайбыз, андыктан алгач Person классынын объектин түзүшүбүз керек.
Конструкторлор
Кадимки методдордон тышкары класстар конструктор деп аталган атайын методдорду аныктай алышат. Берилген класстын жаңы объектиси түзүлгөндө конструкторлор чакырылат. Конструкторлор объекттин инициализациясын аткарышат.
Эгерде класста конструктор аныкталбаса, анда ал класс үчүн автоматтык түрдө параметрсиз конструктор түзүлөт.
Жогоруда аныкталган Person классында эч кандай конструктор жок. Демек, ал үчүн автоматтык түрдө демейки конструктор түзүлөт, аны биз Person объектин түзүү үчүн колдоно алабыз. Атап айтканда, бир объект түзөлү:
public class Program{
public static void main(String[] args) {
Person tom = new Person(); // создание объекта
tom.displayInfo();
// изменяем имя и возраст
tom.name = "Tom";
tom.age = 34;
tom.displayInfo();
}
}
class Person{
String name; // имя
int age; // возраст
void displayInfo(){
System.out.printf("Name: %s \tAge: %d\n", name, age);
}
}
New Person() туюнтмасы Person объектин түзүү үчүн колдонулат. Жаңы оператор Person объекти үчүн эстутумду бөлөт. Анан демейки конструктор чакырылат, ал эч кандай параметрлерди албайт. Натыйжада, бул туюнтманы аткаргандан кийин, эстутумда Person объектинин бардык маалыматтары сактала турган бөлүм бөлүнөт. Жана өзгөрмө Том түзүлгөн объектке шилтеме алат.
Эгерде конструктор объекттин өзгөрмөлөрүнүн маанилерин инициализациялабаса, анда алар өздөрүнүн демейки маанилерин алышат. Өзгөрмөлөрдүн сандык түрлөрү үчүн бул 0 саны, ал эми сап жана класстар үчүн бул нөл (башкача айтканда, маанинин жоктугу).
Объектти түзгөндөн кийин, биз персонал объектинин өзгөрмөлөрүнө tom өзгөрмө аркылуу кире алабыз жана алардын баалуулуктарын кое алабыз же ала алабыз, мисалы, tom.name = "Tom".
Натыйжада, биз консолдо көрөбүз:
Name: null Age: 0
Name: Tom Age: 34
Эгер объектти түзүүдө кандайдыр бир логика аткарылышы керек болсо, мисалы класс талаалары кандайдыр бир белгилүү маанилерди алса, анда класста өзүңүздүн конструкторлоруңузду аныктай аласыз. Мисалы:
public class Program{
public static void main(String[] args) {
Person bob = new Person(); // вызов первого конструктора без параметров
bob.displayInfo();
Person tom = new Person("Tom"); // вызов второго конструктора с одним параметром
tom.displayInfo();
Person sam = new Person("Sam", 25); // вызов третьего конструктора с двумя параметрами
sam.displayInfo();
}
}
class Person{
String name; // имя
int age; // возраст
Person()
{
name = "Undefined";
age = 18;
}
Person(String n)
{
name = n;
age = 18;
}
Person(String n, int a)
{
name = n;
age = a;
}
void displayInfo(){
System.out.printf("Name: %s \tAge: %d\n", name, age);
}
}
Класс азыр үч конструкторду аныктайт, алардын ар бири башка сандагы параметрлерди алып, класс талааларынын маанилерин белгилейт.
Программанын консолдук натыйжасы:
Name: Undefined Age: 18
Name: Tom Age: 18
Name: Sam Age: 25
ачкыч бул
this ачкыч сөзү класстын учурдагы инстанциясына шилтемени билдирет. Бул ачкыч сөз аркылуу биз өзгөрмөлөргө, объекттин ыкмаларына кире алабыз, ошондой эле анын конструкторлорун чакыра алабыз. Мисалы:
public class Program{
public static void main(String[] args) {
Person undef = new Person();
undef.displayInfo();
Person tom = new Person("Tom");
tom.displayInfo();
Person sam = new Person("Sam", 25);
sam.displayInfo();
}
}
class Person{
String name; // имя
int age; // возраст
Person()
{
this("Undefined", 18);
}
Person(String name)
{
this(name, 18);
}
Person(String name, int age)
{
this.name = name;
this.age = age;
}
void displayInfo(){
System.out.printf("Name: %s \tAge: %d\n", name, age);
}
}
Үчүнчү конструктордо параметрлер класс талаалары менен бирдей аталат. Жана талааларды жана параметрлерди чектөө үчүн this ачкыч сөз колдонулат:
this.name = name;
Ошентип, бул учурда, биз аталыш параметринин мааниси аталыш талаасына дайындалганын көрсөтөбүз.
Мындан тышкары, бизде окшош аракеттерди аткарган үч конструктор бар: аты-жөнү жана жашы талааларын коюу. Кайталанбашы үчүн, класстын конструкторлорунун бирине чакыруу жана анын параметрлери үчүн керектүү маанилерди берүү үчүн колдонсоңуз болот:
Person(String name)
{
this(name, 18);
}
Натыйжада, программанын натыйжасы мурунку мисалдагыдай болот.
Инициализаторлор
Конструктордон тышкары, объекттин баштапкы инициализациясы объекттин инициализатору аркылуу жүргүзүлүшү мүмкүн. Инициализатор ар бир конструктордун алдында аткарылат. Башкача айтканда, биз бардык конструкторлор үчүн жалпы кодду инициализаторго кое алабыз:
public class Program{
public static void main(String[] args) {
Person undef = new Person();
undef.displayInfo();
Person tom = new Person("Tom");
tom.displayInfo();
}
}
class Person{
String name; // имя
int age; // возраст
/*начало блока инициализатора*/
{
name = "Undefined";
age = 18;
}
/*конец блока инициализатора*/
Person(){
}
Person(String name){
this.name = name;
}
Person(String name, int age){
this.name = name;
this.age = age;
}
void displayInfo(){
System.out.printf("Name: %s \tAge: %d\n", name, age);
}
}
Консолго чыгаруу:
Name: Undefined Age: 18
Name: Tom Age: 18