JavaRush /Java блогу /Random-KY /Бул жана Javaдагы супер ачкыч сөздөрдүн ортосундагы айырм...
grishin
Деңгээл
Харьков

Бул жана Javaдагы супер ачкыч сөздөрдүн ортосундагы айырма

Группада жарыяланган
thisжана superтиешелүүлүгүнө жараша класстын жана анын суперклассынын учурдагы инстанциясын билдирген Javaдагы эки өзгөчө ачкыч сөздөр. Java программисттери көбүнчө бул сөздөрдү чаташтырышат жана Java Core интервьюларында көп суралган өзгөчө касиеттери жөнүндө анча бorшпейт. Мисалы, дароо эле ойго келген бир-эки суроолор thisжана , Java тorндеги superачкыч сөзгө башка маани берүү мүмкүнбү ? жана ачкыч сөздөр менен Java thisортосунда кандай айырма бар . Билбейм? Ооба, мен бул жерде жооп бербейм - бул макаланын аягында тапса болот. Ошентип, мен башында айткандай, Java менен негизги айырмачылык - класстын учурдагы инстанциясы, ал эми ата-эне класстын учурдагы үлгүсү билдирет. Бул жерде өзгөрмөлөрдү колдонуунун бир мисалы жана - сиз буга чейин биринин конструкторлорун экинчисинен чакыруунун мисалдарын көргөнсүз, деп аталган. чынжырдагы конструкторлорду чакырып, бул ачкыч сөздөрдү жана колдонуу аркылуу мүмкүн болот . Класстын ичинде анын аргументсиз конструкторун чакыруу үчүн колдонулат , ал эми аргументсиз конструкторду чакыруу үчүн колдонулат, же ал ошондой эле ата-энелер классынын демейки конструктору деп аталат. Айтмакчы, ушундай жол менен аргументсиз конструкторду гана эмес, ага тиешелүү параметрлерди берүү менен каалаган башка конструкторду да чакыра аласыз. Бул колдонуунун мисалын жакында көрөбүз . Ошондой эле Javaда алар класс инстанциясынын жана анын ата-энесинин өзгөрмөлөрүнө жетүү үчүн колдонулат. Чынында, аларга жана префикстерисиз кирүүгө болот , бирок учурдагы блокто мындай өзгөрмөлөр башка өзгөрмөлөр менен дал келбесе гана, б.а. эгерде ал бирдей аталыштагы локалдык өзгөрмөлөрдү камтыбаса, антпесе префикстүү аттарды колдонууга туура келет, бирок бул маанилүү эмес, анткени бул формада алар ого бетер окумдуу. Бул ыкманын классикалык мисалы - аны инстанция өзгөрмөсү менен бирдей аталыштагы параметрди кабыл алган конструктордун ичинде колдонуу . Кийинчерээк макалада жана ортосунда дагы кандай айырмачылыктар бар экенин билебиз жана аларды колдонуунун кээ бир мисалдарын карап чыгабыз. thissuperБул жана Javaдагы супер ачкыч сөздөрдүн ортосундагы айырма - 1thissuperthissuperthissuperthissuperthis()super()thissuperthissupersuperthisthissuperthis

Бул жана супер кандай окшош

thisжана ачкыч сөздөрдүн ортосундагы айырмачылыктарды карап чыгуудан мурун super, алардын айрым окшоштуктарын карап көрөлү:
  1. this, жана экөө тең superстатикалык эмес өзгөрмөлөр, ошондуктан аларды статикалык контекстте колдонууга болбойт, демек аларды негизги методдо колдонууга болбойт. Бул компиляция убактысынын катасына алып келет "статикалык эмес өзгөрмөгө thisстатикалык контексттен шилтеме жасоо мүмкүн эмес". Эгер сиз негизги ыкмада ачкыч сөздү колдонсоңуз, ошол эле нерсе болот super.

  2. this, жана конструкторлордун superичинде башка конструкторлорду чынжырча чакыруу үчүн колдонсо болот, мисалы, this() жана super() конструкторду мурастоочу жана ата-эне класстарынын аргументтерисиз чакырат.
Төмөндөгү мисалда биз адегенде В классындагы аргументи жок конструктордон түрдөгү бир параметрди кабыл алган ошол эле В классындагы конструкторго чакырууну өткөрөбүз String, ал өз кезегинде super("")суперкласстан бир аргументтүү конструкторду чакырат.
class A{

    A(){
        System.out.println("Конструктор без аргументов класса A");
    }

    A(String args){
        System.out.println("Конструктор с одним аргументом класса A");
    }
}

class B extends A{

   B(){
        this(""); // вызов конструктора с одним аргументом класса B
        System.out.println("Конструктор без аргументов класса B");
    }

   B(String args){
        super(""); // вызов конструктора с одним аргументом класса A
        System.out.println("Конструктор с одним аргументом класса B");
    }
}

// Тест-класс и вывод
public class Test {

    public static void main(String args[]) {
       B b = new B();
    }

}
Чыгуу: А классынын бир аргументтүү конструктору В классынын бир аргументтүү конструктору В классынын аргументи жок конструктор
  1. Конструктордун ичинде this, жана superэң башында бардык башка туюнтмалардан жогору болушу керек, антпесе компилятор ката билдирүүсүн чыгарат. Ушундан улам бир конструктор this(), жана экөөнү тең камтый алbyte super().

Супер менен мунун айырмасы

Эми биз ачкыч сөздөрдү кантип колдонууну билебиз superжана thisалар эмне үчүн керек экенин түшүнөбүз. Бирок бул ачкыч сөздөрдү колдонуунун мен айтпаган дагы бир варианты бар - ички класстарда, алардын жардамы менен Outer notation формасын колдонуу менен сырткы класска кайрылуу абдан ыңгайлуу. thisанын учурдагы мисалы үчүн жана тышкы. super- ата-энеси үчүн. Сырткы класстын аталышы менен алмаштырууну унутпаңыз. thisЭми ачкыч сөздөрдүн ортосундагы негизги айырмачылыктарды кыскача тизмелеп көрөлүsuper
  1. өзгөрмө ал thisколдонулган класстын учурдагы инстанциясын билдирет, ал эми ал superата-эне класстын учурдагы инстанциясын билдирет.

  2. Ар бир конструктор, башка конструкторлорго ачык чалуулар болбогондо, super()анын ата-эне классынын аргументсиз конструкторун кыйыр түрдө чакырат, бирок сизде ар дайым башка конструкторду this(), же менен ачык чакыруу мүмкүнчүлүгү бар super().
thisБул, балким, ачкыч сөздөр менен superJava ортосундагы айырмачылыктар жана алардын программаларда кандайча колдонулушу жөнүндө айтса болот . Көрүнүп тургандай, алардын негизги максаты - бир конструкторду экинчисинен чакыруу жана учурдагы класста жана анын ата-эне классында жарыяланган инстанция өзгөрмөлөрүнө кайрылуу. Бул кадимки өзгөрмөлөр эмес экенин унутпаңыз, эми - биринчи абзацта сураган менин суроомо жооп. Жок, өзгөрмөгө thisжаңы маани берилбейт, анткени ал акыркы деп жарыяланган. Муну IDEде жасоого аракет кылсаңыз болот - сиз компиляция катасын аласыз "сиз өзгөрмөгө жаңы маани бере албайсыз this- ал акыркы деп жарыяланды." Оригиналдуу макала бул жерде .
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION