JavaRush /Java блогу /Random-KY /Суроо-жооп: Жыйынтыктоочу класста абстракттуу методдорду ...

Суроо-жооп: Жыйынтыктоочу класста абстракттуу методдорду аныктоого болобу?

Группада жарыяланган
Бул кызыктуу жана маанилүү суроо менин окурмандарымдын бирине Java иштеп чыгуучу кызматына телефон аркылуу маектешүү учурунда берилди. Ал Java тorнде абстракттуу класс түзүүfinal мүмкүн эмес экенин билсе да , суроонун формулировкасы аны чаташтырды. Жооп жөнөкөй: жок, final-класста абстракттуу методдор болушу мүмкүн эмес. Неге? Себеби Java тorнин классында абстракттуу методду жарыялаганыңызда бул класс автоматтык түрдө абстракттуу болуп калат жана finalJava тorнде абстракттуу класс жасай албайсыз. Бул Java классында абстракттуу методдор finalболушу мүмкүн эмес дегенди билдирет.
Суроо-жооп: Жыйынтыктоочу класста абстракттуу методдорду аныктоого болобу?  - 1
Көптөгөн Java иштеп чыгуучулары бул суроого жооп берип жатканда формулировкасынан улам чаташышат. Суроо берген адам жалпы түшүнүк менен тааныш болсо да, ал класс андагы абстракттуу методду жарыялагандан кийин абстракттуу болуп калаарын жана finalJavaда абстракттуу класс жасай албай турганын түшүнбөй калышы мүмкүн. Бул пункт бул суроону кеңири таралган жана көп берилүүчү суроодон бөлүп турат: Javaда классты бир эле учурда абстракттуу жана жыйынтыктоочу деп жарыялоо мүмкүнбү? final-класста абстракттуу методду жарыялоо мүмкүн эмес экенин көрсөтүү үчүн бир мисал codeду карап көрөлү . Бизге абстракттуу методу бар класс Hello.javaбар . public finalHelloprint()
public final class Hello {
  public abstract void print();
}
Бул codeду IDEге териңиз, сиз төмөнкү ката кабарын аласыз, алар Helloабстрактуу класс болушу керек деп айтышат, андыктан абстракттуу ыкмалар анда жарыяланышы мүмкүн.
Суроо-жооп: Жыйынтыктоочу класста абстракттуу методдорду аныктоого болобу?  - 2
Суроо-жооп: Жыйынтыктоочу класста абстракттуу методдорду аныктоого болобу?  - 3
Эгер сиз бул codeду Блокнотко терип, буйрук сабынан javac утorтасын колдонуп компиляция кылсаңыз, ошол эле нерсе болот. Java спецификацияларына ылайык, класстын ичинде абстракттуу методду жарыялаганыңыздан кийин, ал класс абстракттуу класска айланат жана finalJavaда абстракттуу класс жасай албагандыктан, компилятор ката жаратат. Бул Java тorндеги жогорку деңгээлдеги класстарга да, уяланган класстарга да тиешелүү. Сиз абстракттуу методду уяланган -класста жарыяласаңыз да final, ката бирдей болот. Дагы бир байланыштуу суроо: Javaдагы абстракттуу класста статикалык методдор болушу мүмкүнбү? Жооп: ооба, алар болот, абстракттуу класста статикалык методду жарыялоодо эч кандай көйгөй жок, анткени статикалык методду колдонуу үчүн класстын инстанциясын түзүүнүн кереги жок, аларды класстын атын колдонуу менен жөн эле чакырса болот. Төмөндө көрсөтүлгөндөй, Java тorнде статикалык болгон класстын Helloметодун кошуу үчүн мисалыбызды өзгөртө алабыз :main()
public abstract class Hello {
  public abstract void print();
  public static void main(String args[]) {
     // Howой-то code
  }
}
Көрүнүп тургандай, компиляция катасы жок. Бул code көйгөйсүз түзүлөт, анткени Javaда сиз абстракттуу класста статикалык ыкманы толугу менен коопсуз жарыялай аласыз. Кыскача корутундулар -класста абстракттуу методду жарыялоо мүмкүн эмес final. Анткени сиз муну жасагандан кийин, класс Java спецификацияларына ылайык автоматтык түрдө абстракттуу болуп калат. Жана finalJavaдагы -класс абстракттуу боло албагандыктан, бул кабыл алынbyte жана компилятор ката кетирип, муну жасоого тыюу салат. Бирок сиз статикалык ыкмаларды жыйынтыктоочу класстарда да, абстракттуу класстарда да жарыялай аласыз, муну менен эч кандай көйгөйлөр жок.
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION