Салом! Шумо аллакай бо навъҳои ибтидоӣ ошно ҳастед ва бо онҳо бисёр кор кардаед.
Примитивҳо дар барномасозӣ ва махсусан дар Java, бартариҳои зиёд доранд: онҳо хотираи камро ишғол мекунанд ва ба ин васила самаранокии барномаро зиёд мекунанд ва ба диапазони арзишҳо ба таври возеҳ тақсим мешаванд. Аммо, дар раванди омӯзиши Java, мо на як бор такрор кардем, ба мисли мантра, "
дар Java ҳама чиз an object аст ." Аммо ибтидоӣ радди мустақими ин калимаҳост. Онҳо an object нестанд. Пас, принсипи «ҳама чиз an object аст» дурӯғ аст? На дарвоқеъ. Дар Java, ҳар як навъи ибтидоӣ бародари дугоники худро дорад,
синфи печанда (
Wrapper
). бастабандӣ чист?
Папеч як синфи махсусест, ки арзиши ибтидоиро дар дохor худ нигоҳ медорад. Аммо азбаски ин синф аст, он метавонад мисолҳои худро эҷод кунад. Онҳо арзишҳои ибтидоии заруриро дар дохor он нигоҳ медоранд, дар ҳоле ки an objectҳои воқеӣ мебошанд. Номҳои синфҳои печанда ба номҳои ибтидоии мувофиқ хеле монанданд ё бо онҳо комилан мувофиқанд. Аз ин рӯ, ба ёд овардани онҳо хеле осон хоҳад буд.
Синфҳои Wrapper барои намудҳои маълумоти ибтидоӣ |
Намудҳои маълумоти ибтидоӣ |
Синфҳои бастабандӣ |
int |
Бутун |
кӯтоҳ |
Кӯтоҳ |
дароз |
дароз |
byte |
Байт |
шино кардан |
шино кардан |
дучанд |
Дучандон |
char |
Характер |
булӣ |
Булӣ |
Объектҳои синфи Wrapper мисли ҳама гуна дигар сохта мешаванд:
public static void main(String[] args) {
Integer i = new Integer(682);
Double d = new Double(2.33);
Boolean b = new Boolean(false);
}
Синфҳои бастабандӣ ба шумо имкон медиҳанд, ки нуқсонҳои навъҳои ибтидоиро кам кунед. Аз ҳама равшантар он аст, ки
ибтидоӣ усулҳо надоранд . Масалан, онҳо метод надоранд
toString()
, бинобар ин шумо наметавонед, масалан, рақамро
int
ба сатр табдил диҳед. Аммо бо синфи бастабандӣ
Integer
ин осон аст.
public static void main(String[] args) {
Integer i = new Integer(432);
String s = i.toString();
}
Бо тағирёбии баръакс низ мушкилот вуҷуд хоҳад дошт. Фарз мекунем, ки мо сатр дорем, ки мо аниқ медонем, ки рақамро дар бар мегирад. Аммо, дар мавриди навъи ибтидоӣ,
int
мо ин ададро аз сатр гирифта наметавонем ва онро, воқеан, ба адад табдил диҳем. Аммо ба шарофати дарсҳои бастабандӣ, мо ҳоло ин имконият дорем.
public static void main(String[] args) {
String s = "1166628";
Integer i = Integer.parseInt(s);
System.out.println(i);
}
Натиҷа: 1166628 Мо рақамро аз сатр бомуваффақият дарёфт кардем ва онро ба тағирёбандаи истинод таъин кардем
Integer i
. Дар омади гап, дар бораи пайвандҳо. Шумо аллакай медонед, ки параметрҳо ба усулҳо бо роҳҳои гуногун интиқол дода мешаванд: ибтидоӣ аз рӯи арзиш ва an objectҳо бо истинод интиқол дода мешаванд. Шумо метавонед ин донишро ҳангоми сохтани усулҳои худ истифода баред: агар усули шумо, масалан, бо рақамҳои касрӣ кор кунад, аммо ба шумо мантиқи интиқол бо истинод лозим аст, шумо метавонед ба
Double/Float
ҷои
double/float
. Илова бар ин, ба ғайр аз усулҳо, синфҳои печанда дорои майдонҳои статикӣ мебошанд, ки барои истифода хеле қулай мебошанд. Масалан, тасаввур кунед, ки шумо ҳоло бо вазифае рӯ ба рӯ мешавед:
шумораи максималии имконпазирро дар консол чоп кунед int
ва сипас шумораи ҳадди ақали имконпазирро чоп кунед. Чунин ба назар мерасад, ки вазифа оддӣ аст, аммо ба ҳар ҳол, шумо онро бе Google иҷро карда наметавонед. Ва синфҳои бастабандӣ ба шумо имкон медиҳанд, ки "мушкилоти ҳамарӯза" -и зеринро ҳал кунед:
public class Main {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
}
}
Чунин майдонҳо ба шумо имкон медиҳанд, ки аз корҳои ҷиддӣ парешон нашавед. Ногуфта намонад, ки дар ҷараёни чопи рақами
2147483647 (ин маҳз MAX_VALUE аст) нодуруст навиштани он тааҷҷубовар нест :) Илова бар ин, дар яке аз лексияҳои қаблӣ мо аллакай диққатро ба он ҷалб карда будем, ки
an objectҳои синфҳои печонидашуда. тағйирнопазиранд .
public static void main(String[] args) {
Integer a = new Integer(0);
Integer b = new Integer(0);
b = a;
a = 1;
System.out.println(b);
}
Натиҷа: 0 Объекте, ки истинод аввал ба он ишора карда буд,
а
ҳолати худро тағир надодааст, вагарна арзиш
b
низ тағир меёфт. Тавре ки бо
String
, ба ҷои тағир додани ҳолати an objectи печанда, дар хотира an objectи комилан нав сохта мешавад. Чаро офарандагони Java дар ниҳоят тасмим гирифтанд, ки намудҳои ибтидоиро дар забон нигоҳ доранд? Азбаски ҳама чиз бояд an object бошад ва мо аллакай синфҳои печанда дорем, ки онҳоро барои ифодаи ҳама чизҳои ибтидоӣ истифода бурдан мумкин аст, чаро онҳоро танҳо дар забон гузоред ва ибтидоиро нест кунед? Ҷавоб оддӣ аст - иҷроиш. Навъҳои ибтидоиро ибтидоӣ меноманд, зеро онҳо аз бисёр хусусиятҳои «вазнин»-и an objectҳо маҳруманд. Бале, an object дорои усулҳои зиёди мувофиқ аст, аммо шумо на ҳамеша ба онҳо ниёз доред. Баъзан ба шумо танҳо рақами 33 ё 2.62 ё арзиши
true
/ лозим аст
false
. Дар ҳолатҳое, ки ҳама бартариҳои an objectҳо номувофиқанд ва барои кор кардани барнома лозим нестанд, примитивҳо кори беҳтареро иҷро мекунанд.
Бастабандии худкор/худкушоии худкор
Яке аз хусусиятҳои примитивҳо ва синфҳои печонидани онҳо дар Java autoboxing/autounboxing мебошад.Биёед
ин мафҳумро дарк кунем. Тавре ки шумо ва ман қаблан фаҳмидем, Java забони ба an object нигаронидашуда мебошад. Ин маънои онро дорад, ки ҳама барномаҳои дар Java навишташуда аз an objectҳо иборатанд. Примитивҳо an object нестанд. Аммо, ба тағирёбандаи синфи печанда метавонад арзиши навъи ибтидоӣ таъин карда шавад. Ин раванд
autoboxing номида мешавад
. Ба ҳамин тариқ, ба тағирёбандаи навъи ибтидоӣ метавонад ба an objectи синфи печанда таъин карда шавад.
Ин раванд autounboxing номида мешавад . Барои намуна:
public class Main {
public static void main(String[] args) {
int x = 7;
Integer y = 111;
x = y;
y = x * 123;
}
}
Дар сатри 5 мо ба ибтидоии x арзиши y -ро таъин мекунем, ки an objectи синфи печанда мебошад
Integer
. Тавре ки шумо мебинед, барои ин ягон амали иловагӣ лозим нест:
компилятор инро медонад int
ва Integer
дар асл ҳамон чизест . Ин ба таври худкор кушодан аст. Ҳамин чиз бо autoboxing дар сатри 6 рӯй медиҳад: an objectи y ба осонӣ арзиши ибтидоӣ таъин карда мешавад (x*123). Ин як мисоли бастабандии автоматӣ мебошад. Ин аст, ки калимаи "авто" илова карда шудааст:
барои таъин кардани истинодҳои ибтидоӣ ба an objectҳои синфҳои сарпӯши онҳо (ва баръакс) ба шумо ҳеҷ кор кардан лозим нест, ҳама чиз ба таври худкор сурат мегирад . Қулай, дуруст? :) Боз як қулайии хеле бузурги автоматӣ/автоматӣ кушодан дар кори усулҳо зоҳир мешавад. Гап дар он аст, ки
параметрҳои усул инчунин ба худкорбандӣ ва худкушӣ дучор мешаванд . Ва, масалан, агар яке аз онҳо ду an objectро ҳамчун вуруд қабул кунад
Integer
, мо метавонем ба осонӣ ибтидоии оддиро дар он ҷо гузаронем
int
!
public class Main {
public static void main(String[] args) {
printNumber(7);
}
public static void printNumber(Integer i) {
System.out.println("You entered a number" + i);
}
}
Натиҷа: Шумо рақами 7-ро ворид кардед. Он баръакс кор мекунад:
public class Main {
public static void main(String[] args) {
printNumber(new Integer(632));
}
public static void printNumber(int i) {
System.out.println("You entered a number" + i);
}
}
Як нуктаи муҳиме, ки бояд дар хотир дошт:
autoboxing ва unboxing барои массивҳо кор намекунад !
public class Main {
public static void main(String[] args) {
int[] i = {1,2,3,4,5};
printArray(i);
}
public static void printArray(Integer[] arr) {
System.out.println(Arrays.toString(arr));
}
}
Кӯшиши интиқоли массиви ибтидоӣ ба усуле, ки массиви an objectҳоро ҳамчун вуруд қабул мекунад, боиси хатогии компиляция мегардад. Дар охир, биёед бори дигар ба таври мухтасар примитивҳо ва печонидани
Примитивҳоро муқоиса кунем:
Сарпӯшҳо:
- Онҳо ба шумо имкон медиҳанд, ки принсипи "ҳама чиз an object аст" -ро вайрон накунед, то рақамҳо, рамзҳо ва арзишҳои мантиқии ҳақиқӣ/дурӯғ аз ин мафҳум берун нашаванд.
- Қобorяти кор бо ин арзишҳоро тавассути пешниҳоди усулҳо ва майдонҳои мувофиқ васеъ кунед
- Зарур аст, вақте ки ягон усул метавонад танҳо бо an objectҳо кор кунад
GO TO FULL VERSION