JavaRush /Java блогу /Random-KY /Java'да параметрлерди өткөрүү
vincent_vega
Деңгээл
Gainesville

Java'да параметрлерди өткөрүү

Группада жарыяланган
Javaдагы өзгөрмө - бул анын ичинде мааниси бар контейнер. Демек, өзгөрмө "өтүү" деген эмнени билдирет? Ал эми примитивдүү жана маалымдама маалымат түрлөрүнүн ортосунда кандай айырма бар.
Java'да параметрлерди өткөрүү - 1
Буга кийинчерээк жетебиз. Алгач жөнөкөй тапшырмадан баштайлы. Бул code эмне кылат:
int х = 3;
int у = х;
1-сапта int түрүндөгү x өзгөрмө түзүлүп, 3 мааниси ыйгарылган. 2-сапта int түрүндөгү y өзгөрмө түзүлүп, x өзгөрмөнүн мааниси ыйгарылган . Келечекте, x өзгөрмөсү y эч кандай таасир этпейт . Java x (3) маанисин көчүрөт жана көчүрүлгөндөрдү y га жайгаштырат . Бул параметр мааниси боюнча өтүп жатат. Сиз бир өзгөрмөнү башкасына жазбайсыз. Маани көчүрүлүп, жаңы өзгөрмөгө дайындалат. Expression y = x; " X -ке y жазуу" дегенди билдирбейт . Бул " x ичиндеги маанини көчүрүп , ошол көчүрмөнү y га жаз " дегенди билдирет. Эгер кийинчерээк мен y өзгөртсөм :
у = 34;
Бул x таасир этеби ? Албетте жок. x дагы эле 3 маанисине ээ. Эгер мен кийинчерээк x өзгөртсөм :
х = 90;
Бул сизге кандай таасир этет ? Эч качан. Алар тапшырма аткарылгандан кийин эч кандай байланышы жок (маани КӨЧҮРҮҮ). Шилтеме түрлөрү жөнүндө эмне айтууга болот? Алар кантип иштешет? Анчалык кыйын эмес, чындыгында эреже бирдей. Шилтемелер дал ушундай кылат - сиз шилтеменин көчүрмөсүн аласыз. Ошентип, мен айтсам:
Cat A = new Cat ();
Cat B = A;
А шилтемеси В шилтемесине көчүрүлгөн. Бул an objectке тиешеси жок - сизде дагы эле бир гана an object бар. Бирок азыр сизде бир эле Cat an objectин башкарган эки башка шилтеме бар . Эми параметрлерди методдорго берүүнү карап көрөлү. Java параметрлерди маани боюнча өткөрөт. Ар дайым. Бул "бааны көчүрүү жана көчүрмөнү өткөрүп берүү" дегенди билдирет. Примитивдүү түрлөр үчүн бул оңой:
int х = 5;
doStuff (х); / / Передать копию х (meaning 5) в метод doStuff
doStuff ыкмасы төмөнкүдөй көрүнөт:
void doStuff (int у) {

   / / Действия с 'y'
}
x маанисинин көчүрмөсү , б.а. 5, doStuff() ыкмасына өткөрүлүп берилет . doStuff() методунун y деп аталган өзүнүн өзгөрмөсү бар . y өзгөрмө жаңы, башка өзгөрмө болуп саналат. Методго өтүүдө x ичинде болгон нерсенин көчүрмөсү менен . Мындан ары у жана х бири-бирине эч кандай таасир этпейт. Сиз у өзгөрткөнүңүздө , сиз хга таасир этпейсиз .
void doStuff (int у) {

   у = 27; / / Это не влияет на 'х'
}
Жана тескерисинче - эгерде сиз x өзгөртсөңүз, у өзгөрбөйсүз . Бул учурда x жасаган жалгыз нерсе - анын маанисин көчүрүп, аны doStuff() ыкмасына өткөрүп берүү . Шилтемелер менен "баалуу өтүү" кантип иштейт? Өтө көп адамдар: "Java примитивдүү типтерди мааниге, ал эми an objectтерге шилтеме аркылуу өтөт" деп айтышат. Бул алар айткандай эмес. Java баардык нерсенин мааниси боюнча өтөт. Примитивдер менен сиз мазмундун көчүрмөсүн аласыз. Шилтемелер менен сиз мазмундун көчүрмөсүн аласыз. Бирок шилтеменин мазмуну кандай? Алыстан башкаруу. Объектти башкаруу/жетүү үчүн жабдуулар. Объектке шилтемени методго өткөрүп бергенде, шилтеменин көчүрмөсүн өткөрүп жатасыз. Алыстан башкаруу клону. Объект дагы эле өзү түзүлгөн үймөктө отуруп, пультту кимдир бирөө колдонушун күтүп турат. Объект аны башкаруу үчүн канча пульттун «программаланганы» кызыктырbyte. Бул жөнүндө кам көрүүчү жалгыз адамдар таштанды жыйноочу жана сиз, программист. Ошентип, сиз айтканда:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   / / Использование B
}
Бир гана Cat an objectи бар . Бирок азыр эки алыстан башкаруу (шилтеме) бир эле Cat an objectине кире алат . Ошентип, эми B Cat an objectисине эмне кылбасын, A көрсөткөн Catга таасир этет , бирок A мазмунуна таасир этпейт ! Сиз Catти жаңы B шилтемеси аркылуу өзгөртө аласыз (тикеден-түз Aдан көчүрүлгөн), бирок A өзгөртө албайсыз. Бул эмнени билдирет? Сиз A шилтеме кылган an objectти өзгөртө аласыз , бирок A шилтемесин өзгөртө албайсыз - аны башка an objectке же null багыттоо . Демек, эгер сиз B шилтемесин өзгөртсөңүз ( B шилтеме кылган чыныгы Cat an objectи эмес, шилтеменин өзүнүн мааниси) A маанисин өзгөртпөйсүз . Жана тескерисинче. Ошондуктан:
Cat A = new Cat ();
doStuff (А);

void doStuff (Cat B) {

   B = new Cat (); / / Не повлияет на ссылку A
}
Бул жөн гана B башка an objectти көрсөтөт дегенди билдирет . А дагы деле бактылуу. Ошентип, менден кийин кайталаңыз: Java бардыгын баалуулук менен өткөрөт. (Макул, дагы бир жолу... сезим менен.) Java баарын баалуулук менен өткөрөт. Примитивдик типтер үчүн сиз учурдагы маанинин көчүрмөсүн өткөрөсүз, an object шилтемелери үчүн шилтеменин көчүрмөсүн өткөрөсүз (дистанттык башкаруу). Сиз an objectти эч качан өткөрбөйсүз. Бардык an objectтер үймөктө сакталат. Ар дайым. Эми бир чыны кофе демдеп, code жазыңыз! Оригиналдуу макала.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION