class OuterClass {
...
static class StaticNestedClass {
...
}
class InnerClass {
...
}
}
Маҳз ин синфҳо лона номида мешаванд. Онҳо ба 2 намуд тақсим мешаванд:
- Синфҳои лонаҳои ғайристатикӣ - синфҳои лонаҳои ғайристатикӣ. Онҳоро ба таври дигар синфҳои дохилӣ низ меноманд.
- Синфҳои лонаҳои статикӣ - синфҳои лонаҳои статикӣ.
- синфи маҳаллӣ
- синфи беном
public class Bicycle {
private String model;
private int weight;
public Bicycle(String model, int weight) {
this.model = model;
this.weight = weight;
}
public void start() {
System.out.println("Go!");
}
public class HandleBar {
public void right() {
System.out.println("Steering wheel to the right!");
}
public void left() {
System.out.println("Steering wheel to the left!");
}
}
public class Seat {
public void up() {
System.out.println("The seat is up!");
}
public void down() {
System.out.println("The seat is down!");
}
}
}
Дар ин ҷо мо синф дорем Bicycle
- велосипед. Он дорои 2 майдон ва 1 усул - start()
. Фарқи он аз синфи муқаррарӣ дар он аст, ки он ду синф дорад, ки рамзи он дар дохor он навишта шудааст Bicycle
- инҳо синфҳо HandleBar
(руль) ва Seat
(курсӣ) мебошанд. Инҳо синфҳои мукаммал мебошанд: чунон ки шумо мебинед, ҳар кадоми онҳо усулҳои худро доранд. Дар ин лаҳза, шумо шояд саволе дошта бошед: чаро мо як синфро дар дохor дигар гузоштем? Чаро онҳоро дохилӣ месозанд? Хуб, биёед бигӯем, ки барои руль ва курсӣ дар барнома синфҳои алоҳида лозиманд. Аммо ба шумо лозим нест, ки онҳоро лона кунед! Шумо метавонед дарсҳои муқаррарӣ кунед. Масалан, ба ин монанд:
public class HandleBar {
public void right() {
System.out.println("Steering wheel to the right!");
}
public void left() {
System.out.println("Steering wheel left");
}
}
public class Seat {
public void up() {
System.out.println("The seat is up!");
}
public void down() {
System.out.println("The seat is down!");
}
}
Саволи хеле хуб! Албатта, мо ягон маҳдудияти техникӣ надорем - мо метавонем инро бо ин роҳ анҷом диҳем. Ин бештар дар бораи дуруст тарҳрезии синфҳо аз нуқтаи назари як барномаи мушаххас ва ба маънои он барнома аст. Синфҳои дохилӣ дарсҳо барои нишон додани як an objectи муайян дар барномае мебошанд, ки бо an objectи дигар робитаи ногусастанӣ доранд. Руль, курсӣ, педальҳо ҷузъҳои велосипед мебошанд. Аз дучарха чудо шуда, маъное надоранд. Агар мо ҳамаи ин синфҳоро синфҳои ҷамъиятӣ ҷудо кунем, барномаи мо метавонад, масалан, рамзи зеринро дошта бошад:
public class Main {
public static void main(String[] args) {
HandleBar handleBar = new HandleBar();
handleBar.right();
}
}
Уммм... Маънои ин codeро шарх додан хам душвор аст. Мо як дастаки аҷиби дучарха дорем (чаро он лозим аст? Росташро гӯям. Ва ин руль ба тарафи рост... худ аз худ, бе велосипед... аз чй сабаб бошад. Мо мохияти рульро аз мохияти велосипед чудо карда, мантики барномаи худро гум кардем. Бо истифода аз синфи дохилӣ, code комилан фарқ мекунад:
public class Main {
public static void main(String[] args) {
Bicycle peugeot = new Bicycle("Peugeot", 120);
Bicycle.HandleBar handleBar = peugeot.new HandleBar();
Bicycle.Seat seat = peugeot.new Seat();
seat.up();
peugeot.start();
handleBar.left();
handleBar.right();
}
}
Натиҷаи консол:
Сиденье поднято выше!
Поехали!
Руль влево!
Руль вправо!
Он чизе ки ногаҳон рӯй дод, маъно дошт! :) Мо an objectи велосипед сохтаем. Мо ду «субъект»-и он — руль ва курсиро офаридаем. Мо курсиро барои роҳат баланд кардем - ва рафтем: мо меғелем ва ба он ҷое ки бояд биравем! :) Усулҳое, ки ба мо лозиманд, дар an objectҳои зарурӣ даъват карда мешаванд. Ҳама чиз оддӣ ва қулай аст. Дар ин мисол, таъкид кардани рутба ва курсӣ инкапсуляцияро беҳтар мекунад (мо маълумотро дар бораи қисмҳои велосипед дар дохor синфи мувофиқ пинҳон мекунем) ва ба мо имкон медиҳад, ки абстраксияи муфассалтар эҷод кунем. Акнун биёед ба вазъияти дигар назар андозем. Фарз мекунем, ки мо мехоҳем барномаеро эҷод кунем, ки мағозаи велосипед ва қисмҳои онро модел кунад. Дар ин вазъият халли пештараи мо барбод меравад. Дар доираи як мағозаи қисмҳо, ҳар як қисми алоҳидаи велосипед ҳатто ба ғайр аз моҳияти дучарха маъно дорад. Масалан, ба мо усулҳо, ба монанди "фурӯши педальҳо ба харидор", "харидани курсии нав" ва ғайра лозиманд. Дар ин чо синфхои дохorро истифода бурдан хато мебуд — хар як кисми алохидаи велосипед дар доираи барномаи нави мо маънои худро дорад: вай аз мохияти велосипед чудо аст ва ба он хеч вобаста нест. Ин аст он чизе, ки шумо бояд ба он диққат диҳед, агар шумо дар ҳайрат бошед, ки оё шумо бояд синфҳои дохorро истифода баред ё ҳамаи an objectҳоро ба синфҳои алоҳида ҷудо кунед. Барномасозии ба an object нигаронидашуда бузург аст, зеро он моделсозии an objectҳои воқеиро осон мекунад. Ин аст он чизест, ки шумо метавонед ҳамчун роҳнамо ҳангоми қарор дар бораи истифодаи синфҳои дохилӣ истифода баред. Дар мағозаи воқеӣ қисмҳо аз велосипедҳо ҷудо карда мешаванд - ин муқаррарӣ аст. Ин маънои онро дорад, ки ин ҳангоми таҳияи барнома дуруст хоҳад буд. Хуб, мо "фалсафа" -ро ҷудо кардем :) Акнун биёед бо хусусиятҳои муҳими "техникии" синфҳои дохилӣ шинос шавем. Ин аст он чизе ки шумо бешубҳа бояд дар хотир доред ва дарк кунед:
-
Объекти синфи ботинӣ бидуни an objectи синфи "берунӣ" вуҷуд дошта наметавонад.
Ин мантиқист: барои ҳамин мо онро синфҳои
Seat
дохилӣ сохтемHandleBar
, то рулу курсиҳои бесоҳиб дар барномаи мо дар ин ҷо ва он ҷо пайдо нашаванд.Ин code тартиб дода намешавад:
public static void main(String[] args) { HandleBar handleBar = new HandleBar(); }
Хусусияти муҳими зерин аз ин бармеояд:
-
Объекти синфи дохилӣ ба тағирёбандаҳои синфи "берунӣ" дастрасӣ дорад.
Масалан, биёед
Bicycle
як тағирёбандаро ба синфи худ илова кунемint seatPostDiameter
- диаметри сутуни нишаст.Сипас дар синфи дохилӣ
Seat
мо метавонем усулеро эҷод кунемgetSeatParam()
, ки ба мо параметри курсиро нақл кунад:public class Bicycle { private String model; private int weight; private int seatPostDiameter; public Bicycle(String model, int weight, int seatPostDiameter) { this.model = model; this.weight = weight; this.seatPostDiameter = seatPostDiameter; } public void start() { System.out.println("Go!"); } public class Seat { public void up() { System.out.println("The seat is up!"); } public void down() { System.out.println("The seat is down!"); } public void getSeatParam() { System.out.println("Seat parameter: seatpost diameter = " + Bicycle.this.seatPostDiameter); } } }
Ва ҳоло мо метавонем ин маълумотро дар барномаи худ дастрас кунем:
public class Main { public static void main(String[] args) { Bicycle bicycle = new Bicycle("Peugeot", 120, 40); Bicycle.Seat seat = bicycle.new Seat(); seat.getSeatParam(); } }
Натиҷаи консол:
Параметр сиденья: диаметр подседельного штыря = 40
Диққат диҳед:тағирёбандаи нав бо сахттарин тағирдиҳанда - эълон карда мешавад
private
. Ва то ҳол синфи дохилӣ дастрасӣ дорад! -
Объекти синфи дохorро дар усули статикии синфи "берунӣ" сохтан мумкин нест.
Ин бо хусусиятҳои тарҳрезии синфҳои дохилӣ шарҳ дода мешавад. Синфи дохилӣ метавонад конструкторҳо бо параметрҳо ё танҳо созандаи пешфарз дошта бошад. Аммо новобаста аз ин, вақте ки мо an objectи синфи ботиниро эҷод мекунем, истинод ба an objectи синфи "берунӣ" оромона ба он мегузарад. Охир, мавчуд будани чунин an object шарти хатмист. Дар акси ҳол, мо наметавонем an objectҳои синфи дохorро эҷод кунем.
Аммо агар усули синфи беруна статикӣ бошад, пас an objectи синфи берунӣ метавонад умуман вуҷуд надошта бошад! Ин маънои онро дорад, ки мантиқи синфҳои ботинӣ шикаста мешавад. Дар чунин вазъият, компилятор хато мекунад:
public static Seat createSeat() { //Bicycle.this cannot be referenced from a static context return new Seat(); }
-
Синфи дохилӣ наметавонад дорои тағирёбандаҳо ва усулҳои статикӣ бошад.
Мантиқ дар ин ҷо як аст: усулҳо ва тағирёбандаҳои статикӣ метавонанд вуҷуд дошта бошанд ва ҳатто агар an object вуҷуд надошта бошад.
Аммо бе an objectи синфи "берунӣ" мо ба синфи дохилӣ дастрасӣ нахоҳем дошт.
Як зиддияти возеҳ! Аз ин рӯ, мавҷудияти тағирёбандаҳо ва усулҳои статикӣ дар синфҳои дохилӣ манъ аст.
Компилятор ҳангоми кӯшиши сохтани онҳо хатогӣ содир мекунад:
public class Bicycle { private int weight; public class Seat { //inner class cannot have static declarations public static void getSeatParam() { System.out.println("Seat parameter: seatpost diameter = " + Bicycle.this.seatPostDiameter); } } }
-
Ҳангоми сохтани an objectи синфи дохилӣ, тағирдиҳандаи дастрасии он нақши муҳим мебозад.
Синфи дохorро метавон бо тағирдиҳандаҳои дастрасии стандартӣ -
public
,private
,protected
ваpackage private
.Чаро муҳим аст?
Ин ба он таъсир мерасонад, ки дар барномаи мо мо метавонем синфи дохorро эҷод кунем.
Агар синфи мо
Seat
ҳамчун , эълон карда шавадpublic
, мо метавонем an objectҳои онро дар ҳама гуна синфи дигар созем. Ягона талабот ин аст, ки an objectи синфи "берунӣ" низ бояд вуҷуд дошта бошад.Дар омади гап, мо инро аллакай дар ин ҷо анҷом додаем:
public class Main { public static void main(String[] args) { Bicycle peugeot = new Bicycle("Peugeot", 120); Bicycle.HandleBar handleBar = peugeot.new HandleBar(); Bicycle.Seat seat = peugeot.new Seat(); seat.up(); peugeot.start(); handleBar.left(); handleBar.right(); } }
Мо ба осонӣ ба синфи дохилӣ
HandleBar
азMain
.Агар мо синфи дохorро ҳамчун , эълон кунем
private
, мо танҳо ба сохтани an objectҳо дар дохor синфи "берунӣ" дастрасӣ пайдо мекунем.Seat
Мо дигар наметавонем an objectеро аз берун эҷод кунем :private class Seat { //methods } public class Main { public static void main(String[] args) { Bicycle bicycle = new Bicycle("Peugeot", 120, 40); //Bicycle.Seat has a private access in 'Bicycle' Bicycle.Seat seat = bicycle.new Seat(); } }
Шумо эҳтимолан мантиқро фаҳмед :)
-
Тағирдиҳандаҳои дастрасӣ барои синфҳои дохилӣ ҳамон тавре ки барои тағирёбандаҳои муқаррарӣ кор мекунанд.
Тағирдиҳанда
protected
дастрасӣ ба тағирёбандаи синфро дар синфҳои насли он ва дар синфҳое, ки дар як баста ҳастанд, таъмин мекунад.Ҳамин чиз
protected
барои синфҳои дохилӣ кор мекунад. Объектҳоиprotected
синфҳои дохилӣ метавонанд эҷод карда шаванд:- дар дохor синфи "берунӣ";
- дар синфҳои насли он;
- дар он синфҳое, ки дар як баста ҳастанд.
Агар синфи дохилӣ тағирдиҳандаи дастрасӣ надошта бошад (
package private
), an objectҳои синфи ботиниро эҷод кардан мумкин аст- дар дохor синфи "берунӣ";
- дар синфҳое, ки дар як баста ҳастанд.
Шумо муддати тӯлонӣ бо тағирдиҳандаҳо шинос ҳастед, бинобар ин дар ин ҷо ягон мушкилот вуҷуд нахоҳад дошт.
GO TO FULL VERSION