JavaRush /Java блогу /Random-KY /Ороо, таңгактоо жана таңгактоо

Ороо, таңгактоо жана таңгактоо

Группада жарыяланган
Салам! Сиз примитивдүү типтер менен мурунтан эле таанышсыз жана алар менен көп иштегенсиз. Ороо, таңгактоо жана таңгактоо - 1Программалоодогу примитивдердин, өзгөчө Java тorнин көптөгөн артыкчылыктары бар: алар эстутумду аз ээлейт, ошону менен программанын эффективдүүлүгүн жогорулатат жана маанилердин диапазондоруна так бөлүнөт. Бирок, Java тorн үйрөнүү процессинде биз мантра сыяктуу бир нече жолу кайталаганбыз, " Javaда бардыгы an object болуп саналат ." Бирок примитивдер бул сөздөрдү түздөн-түз жокко чыгаруу болуп саналат. Алар an object эмес. Демек, «бардыгы an object» деген принцип жалганбы? Жок эле. Java тorнде ар бир примитивдүү типтин өзүнүн эгиз бир тууганы, орогуч классы ( Wrapper) бар. Ороо деген эмне? Ороочу – бул примитивдин маанисин өзүнүн ичинде сактаган атайын класс. Бирок бул класс болгондуктан, ал өзүнүн инстанцияларын түзө алат. Алар чыныгы an objectилер болуп, керектүү примитивдүү баалуулуктарды ичинде сакташат. Ороо класстарынын аттары тиешелүү примитивдердин атына абдан окшош же алар менен толук дал келет. Ошондуктан, аларды эстеп калуу абдан жеңил болот.
Примитивдик берorштер үчүн Wrapper класстары
Примитивдик берorштердин түрлөрү Wrapper класстары
int бүтүн сан
кыска Кыска
узун Long
byte Байт
сүзүү Float
кош Double
char Каарман
логикалык логикалык
Wrapper классынын an objectтери башкалар сыяктуу эле түзүлөт:
public static void main(String[] args) {

   Integer i = new Integer(682);

   Double d = new Double(2.33);

   Boolean b = new Boolean(false);
}
Ороо класстары примитивдүү типтеги кемчorктерди азайтууга мүмкүндүк берет. Эң айкын нерсе - примитивдердин методдору жок . Мисалы, аларда метод жок , андыктан, мисалы, санды сапка 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 Биз саптан ийгorктүү санды чыгарып алдык жана аны шилтеме өзгөрмөсүнө дайындадык Integer i. Баса, шилтемелер жөнүндө. Методдорго параметрлер ар кандай жолдор менен берилээрин билесиз: примитивдер маани боюнча, ал эми an objectтер шилтеме аркылуу берилет. Double/FloatСиз бул бorмди өзүңүздүн методдоруңузду түзүүдө колдоно аласыз: эгерде сиздин методуңуз иштесе, мисалы, бөлчөк сандар менен, бирок шилтеме аркылуу өтүү логикасы керек болсо, анын ордуна параметрди методго өткөрсөңүз болот 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 Шилтеме башында көрсөткөн an object аөзүнүн абалын өзгөрткөн жок, антпесе маани bда өзгөрмөк. сыяктуу эле String, орогуч an objectинин абалын өзгөртүүнүн ордуна, эс тутумда таптакыр жаңы an object түзүлөт. Эмне үчүн Java түзүүчүлөрү акыры тилде примитивдүү типтерди сактоону чечишкен? Бардык нерсе an object болушу керек жана бизде примитивдер туюндурган нерселердин бардыгын туюндуруу үчүн колдонула турган орогуч класстарыбыз бар болгондуктан, аларды тилде калтырып, примитивдерди алып салууга эмне үчүн болбосун? Жооп жөнөкөй - аткаруу. Примитивдик типтер примитивдүү деп аталат, анткени аларда an objectтердин көптөгөн “оор” белгилери жок. Ооба, an objectтин көптөгөн ыңгайлуу ыкмалары бар, бирок аларга дайыма эле керек эмес. trueКээде сизге 33 саны же 2.62 же / мааниси керек болот false. Объекттердин бардык артыкчылыктары маанилүү болбогон жана программанын иштеши үчүн зарыл болбогон жагдайларда примитивдер бир топ жакшыраак иштешет.

Автоматтык таңгактоо/автоматтык ачуу

Java тorндеги примитивдердин жана алардын орогуч класстарынын өзгөчөлүктөрүнүн бири автобокс/автоунбокс. Ороо, таңгактоо жана таңгактоо - 2 Келгиле, бул түшүнүктү түшүнүп көрөлү. Сиз экөөбүз мурда үйрөнгөнүбүздөй, Java an objectиге багытталган тил. Бул Java тorнде жазылган бардык программалар an objectтерден турат дегенди билдирет. Примитивдер an object эмес. Бирок, орогуч класстын өзгөрмөсүнө примитивдүү типтеги маани берorши мүмкүн. Бул процесс автобокс деп аталат . Ошол сыяктуу эле, примитивдүү типтеги өзгөрмөгө орогуч классынын an objectисин ыйгарса болот. Бул процесс autounboxing деп аталат . Мисалы:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // auto unpacking
       y = x * 123; // autopacking
   }
}
5-сапта биз x примитивине y маанисин ыйгарабыз, ал орогуч классынын an objectиси болуп саналат Integer. Көрүнүп тургандай, бул үчүн эч кандай кошумча аракеттердин кереги жок: компилятор муну билет intжана Integerчындыгында бир эле нерсе . Бул автоматтык түрдө таңгактан чыгаруу. Ушундай эле нерсе 6-саптагы автобокс менен болот: y an objectисине примитивдердин мааниси оңой ыйгарылат (x*123). Бул autopacking мисалы болуп саналат. Мына ушундан улам “авто” деген сөз кошулат: алардын оруу класстарынын an objectтерине примитивдүү шилтемелерди ыйгаруу үчүн (жана тескерисинче) эч нерсе кылуунун кереги жок, баары автоматтык түрдө болот . Ыңгайлуу, туурабы? :) Автоматтык таңгактоо/авто таңгактан чыгаруунун дагы бир абдан чоң ыңгайлуулугу ыкмалардын иштешинде көрүнөт. Чындыгында, ыкманын параметрлери автоматтык таңгактоого жана автоматтык түрдө ачууга да дуушар болот . Жана, мисалы, алардын бири эки an objectти киргизүү катары кабыл алса Integer, биз ал жакка жөнөкөй примитивдерди оңой эле өткөрүп алабыз int!
public class Main {
   public static void main(String[] args) {

       printNumber(7);//regular int, even without a variable
   }

   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);
   }
}
Маанилүү нерсени эстен чыгарбоо керек: автобокс жана кутудан чыгаруу массивдер үчүн иштебейт !
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);//error, won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
Объекттердин массивдерин киргизүү катары кабыл алган методго примитивдердин массивдерин өткөрүү аракети компиляция катасын пайда кылат. Акыр-аягы, келгиле, примитивдерди жана примитивдерди орогучтарды дагы бир жолу кыскача салыштырып көрөлү:
  • аткаруу артыкчылыгы бар
Ороочулар:
  • Алар "бардыгы an object" принцибин бузбоого мүмкүндүк берет, ошондуктан сандар, символдор жана логикалык баалуулуктар чыныгы/жалган бул түшүнүктөн чыгып кетпеши үчүн
  • Ыңгайлуу ыкмаларды жана талааларды берүү менен бул баалуулуктар менен иштөө мүмкүнчүлүгүн кеңейтиңиз
  • Кандайдыр бир ыкма an objectилер менен гана иштей алган учурда зарыл
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION