Киришүү
Белгилүү болгондой, Java an objectиге багытталган программалоо тor болуп саналат. Башкача айтканда, негизги түшүнүк, анткени негиздеринин негизи бардыгы an object болуп саналат деп айтууга болот. Объекттер класстар аркылуу сүрөттөлөт.
Класстар, өз кезегинде, абалы жана жүрүм-туруму бар. Мисалы, банк эсеби эсептеги акчанын суммасы түрүндөгү абалга ээ жана балансты көбөйтүү жана азайтуу жүрүм-турумуна ээ болушу мүмкүн. Javaдагы жүрүм-турум методдор аркылуу ишке ашырылат. Методдорду кантип сүрөттөш керек, Java үйрөнүү саякатыңыздын эң башында киргизилет. Мисалы, Oracle компаниясынын расмий окуу куралында: “
Методдорду аныктоо ”. Бул жерде эки маанилүү аспект бар:
- Ар бир ыкманын кол тамгасы бар. Кол коюу методдун аталышынан жана анын киргизүү параметрлеринен турат;
- Методдор кайтаруу түрүн көрсөтүшү керек;
- Кайтаруу түрү ыкма колунун бир бөлүгү эмес.
Дагы бир жолу, бул Java катуу терилген тил экендигинин кесепети жана компилятор кайсы типтер мүмкүн болушунча кайда колдонуларын алдын ала түшүнгүсү келет. Дагы бир жолу, бизди каталардан коргоо үчүн. Жалпысынан алганда, баары жакшылык үчүн. Бул дагы бир жолу бизге маалыматтар менен иштөө маданиятын үйрөтөт, менимче. Ошентип, ыкмалар үчүн маанинин түрү көрсөтүлөт. Жана ушул эле маанини ыкмалардан кайтаруу үчүн, ачкыч сөз колдонулат
return
.
Java тorндеги ачкыч сөздү кайтаруу билдирүүсү
Билдирүүнүн ачкыч сөзү oracle окуу куралында талкуулангандай "
контролдук агым билдирүүлөрүнөreturn
" тиешелүү . Ошондой эле баалуулуктарды кантип кайтаруу керектиги жөнүндө расмий окуу куралынан окуй аласыз: “
Методдон маанини кайтаруу ”. Компилятор методдон кайтарылган маани метод тарабынан көрсөтүлгөн кайтаруу маани түрүнө дал келишин кылдаттык менен көзөмөлдөйт. Мисал катары tutorialspoint'тен
Online IDE колдонолу. Келгиле, баштапкы мисалды карап көрөлү:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Hello World");
}
}
Көрүнүп тургандай, бул жерде ыкма аткарылат
main
, ал программага кирүү чекити болуп саналат. Коддун саптары жогорудан ылдыйга чейин аткарылат. Биздин
main
ыкма баалуулуктарды кайтара алbyte, антпесе биз ката алабыз: "
Error: Main method must return a value of type void
". Ошондуктан, ыкма жөн гана экранга чыгат. Келгиле, сапты кабыл алууну кабарды кабыл алуунун өзүнчө ыкмасына жылдыралы:
public class HelloWorld {
public static void main(String []args) {
System.out.println(getHelloMessage());
}
public static String getHelloMessage() {
return "Hello World";
}
}
Көрүнүп тургандай, ачкыч сөздү колдонуп,
return
биз кийинчерээк методдо колдонгон кайтаруу маанисин көрсөттүк
println
. Методдун сыпаттамасында (аныктамасында)
getHelloMessage
биз ал бизге кайтарып берерин көрсөттүк
String
. Бул компиляторго методдун аракеттери жарыяланган ыкмага шайкеш келээрин текшерүүгө мүмкүндүк берет. Албетте, методдун аныктамасында көрсөтүлгөн кайтаруу маанисинин түрү codeдон кайтарылган маанинин түрүнөн кененирээк болушу мүмкүн, б.а. Негизгиси, түрлөрү бири-бирине кыскарган. Болбосо биз компиляция убактысынын катасын алабыз: "
error: incompatible types
". Айтмакчы, суроо дароо туулат: Эмне үчүн
return
ал программанын агымын башкаруу операторлоруна тиешелүү? Бирок, анткени бул программанын нормалдуу агымын жогорудан ылдыйга чейин үзгүлтүккө учуратышы мүмкүн. Мисалы:
public class HelloWorld {
public static void main(String []args){
if (args.length == 0) {
return;
}
for (String arg : args) {
System.out.println(arg);
}
}
}
Мисалдан көрүнүп тургандай,
main
биздин java программабыз параметрсиз чакырылса, методдун аткарылышын үзгүлтүккө учуратабыз.
return
Эгер сизде code болсо, ал жеткorксиз болуп каларын эстен чыгарбоо керек . Жана биздин акылдуу компилятор муну байкап, мындай программаны иштетүүгө жол бербейт. Мисалы, бул code түзүлбөйт:
public static void main(String []args) {
System.out.println("1");
return;
System.out.println("2");
}
Муну айланып өтүү үчүн ыплас хакер бар. Мисалы, мүчүлүштүктөрдү оңдоо максатында же башка себептерден улам.
return
Жогорудагы codeду блокко ороп оңдоого болот
if
:
if (2==2) {
return;
}
Ката иштетүүдө билдирүүнү кайтаруу
Бир өтө татаал жагдай бар - биз аны
return
каталарды чечүү менен бирге колдонсок болот. Мен дароо айткым келет, аны блокто колдонуу
return
абдан
catch
, абдан жаман форма, андыктан андан качышыңыз керек. Бирок бизге мисал керек, туурабы? Мына ал:
public class HelloWorld {
public static void main(String []args) {
System.out.println("Value is: " + getIntValue());
}
public static int getIntValue() {
int value = 1;
try {
System.out.println("Something terrible happens");
throw new Exception();
} catch (Exception e) {
System.out.println("Catched value: " + value);
return value;
} finally {
value++;
System.out.println("New value: " + value);
}
}
}
Бир караганда, 2 кайтарылышы керек окшойт, анткени
finally
ал дайыма аткарылат. Бирок жок, маани 1 болот жана өзгөрмөнүн өзгөрүүсү
finally
этибарга алынbyte. Андан тышкары, эгерде ал
value
an objectти камтыса жана биз
finally
десек
value = null
, анда ал
catch
дагы эле an objectке шилтемени кайтарып бермек эмес,
null
. Бирок блоктон
finally
оператор
return
туура иштемек. Мындай белек үчүн кесиптештер сизге ыраазычылык билдирбейт.
void.class
Анан акыры. сыяктуу кызыктай курулуш жазсаңыз болот
void.class
. Көрсө, эмне үчүн жана мааниси эмнеде? Чынында,
Java Reflection API колдонулган ар кандай алHowтарда жана татаал учурларда , бул абдан зарыл болушу мүмкүн. Мисалы, сиз ыкманын кандай түрүн кайтарып берерин текшере аласыз:
import java.lang.reflect.Method;
public class HelloWorld {
public void getVoidValue() {
}
public static void main(String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == void.class);
}
}
}
Бул методдордун чыныгы codeун алмаштыруу зарыл болгон сыноо алHowтарында пайдалуу болушу мүмкүн. Бирок бул үчүн, бул ыкма өзүн кандай түшүнүшү керек (б.а., ал кандай түрлөрүн кайтарат).
main
Жогорудагы codeдон ыкманы ишке ашыруунун экинчи жолу бар :
public static void main (String[] args) {
for (Method method : HelloWorld.class.getDeclaredMethods()) {
System.out.println(method.getReturnType() == Void.TYPE);
}
}
Алардын ортосундагы айырманы бир топ кызыктуу талкуулоону stackoverflow боюнча окууга болот:
java.lang.Void менен void ортосунда кандай айырма бар? #Вячеслав
GO TO FULL VERSION