JAVA програмчлал
С.Ууганбаяр
JAVA ПРОГРАМЧЛАЛ
/ЭХЛЭН СУРАЛЦАХ/
-1-
С.Ууганбаяр
JAVA програмчлал
Лекц №1
1. Java танилцуулга
1.1. Java гэж юу вэ ?
Java хэлийг 1991 онд “Green” төслийн нэг хэсгээр Sun Microsystems хөгжүүлж
бий болгосон. Энэ төслийн групп нь хэрэглэгчдийн элетрон төхөөрөмжийг
удирдах програм хангамжийг хөгжүүлэхээр ажиллаж байв. Энэ хугацаанд тэд
Start гэж нэрлэгдэх төхөөрөмжийг бүтээсэн бөгөөд түүнийг удирдахаар
төлөвлөж байсан үйлдлийн систем нь С++ дээр бүтээгдэх байв. Гэвч багын нэг
гишүүн James Gosling нь С++-ийн бүтээмжийг төдийлөн өндөр үнэлэхгүй байв.
Тиймээс тэрээр Start-д зориулж шинэ хэлийг бий болгосон. Тэрээр энэ хэлээ
Oak гэж нэрлэсэн, энэ нь түүний offise-ийн гадаа харагдаж байдаг Oak модны
нэрийг хэрэглэсэн хэрэг. Сүүлд нь Oak гэдэг нэр нь зарим өөр хэлэнд
ашиглагддаг болохыг мэдээд Sun энэ хэлийг Java гэж нэрлэсэн.
Java бол платформоос хараат бус объект хандлагат програмчлалын хэл юм.
Програм бичих үедээ та энэ програм эцэст нь хаана ажиллахад үргэлж анхаарч
байдаг. Жишээлбэл, хэрэв програм Windows платформ дээр ажиллах бол та
MFC (Microsoft Foundation Classes)-ийг ашиглана. Хэрэв энэ нь Mac машин бол
Mac OS Toolbox-г ашиглана. Түүнчлэн төгсгөлд нь програмаа хэрэгжүүлэх
/турших/-дээ програмынхаа эх кодыг янз бүрийн процессортой машин бүрд
тохиргоог нь хийж хөрвүүлэх болно, тэгээд энэ нь зайлшгүй програмыг
ажиллах машины процессорт тохируулж зайлшгүй хөрвүүлэх хэрэгтэй болно.
Үнэ хэрэгтээ энэ нь програмууд Internet-д хэрэгжүүлэх боломжгүй болох юм.
Хэрэв бид адилхан сценартай гэж бодвол учир нь та програм тань эцэстээ хаана
татагдаж ажиллахыг мэдэж чадахгүй. Энэ асуудлыг эсэргүүцэхийн тулд Java нь
JVM /Java Virtaal Machine/ гэж нэрлэгдэх in-built механизмтай байдаг. JVM нь
таны програмыг клиентийн машинтай зохицохоор болгодог бөгөөд таны
програм интернет дэх дурын машин дээр ажиллаж чадна.
С++-тай адилгүй нь, Java бол бүхэлдээ объект хандлагат хэл. Java дахь бүх
зүйлс зөвхөн классын дотор бичигдэх ёстой. Классууд дотор бүх зүйлүүдийг
хийж хязгаарласнаар програмууд зарим талаар хатуу чанга болно гэж та бодож
магадгүй, гэвч энэ нь бүрэн дүүрэн эргэлзээгүй програмчлалын хэв маяг юм.
С++-д объект хандлагат ба бүтцийн програмчлалын хэв маягуудыг хослуулан
програмаа бичихэд хангалттай уян хатан байдаг. Гэвч энэ хольсон арга нь тийм
ач холбогдолтой бус юм.
Ингээд зохиомжлогчдийн хувьд бүхэлдээ объект хандлагат аргыг ашиглан
зохиомжлоход хялбар болжээ.
1.2. Java хувилбарууд ба хөгжүүлэлтийн хэрэгслүүд
Өдий хүртэл Java нь ердөө л 3 чухал хувилбараар өөрчлөгдсөн. Java нь эхлээд
Java 1.0 гэж гарч ирсэн, энэ нь одоо хүртэл олонхи brokser-уудын хувьд тохирч
байна. Дараа нь Java 1.1 гарсан, энэ нь сайжруулсан хэрэглэгчийн итеррэйс,
үзэгдэл боловсруулалттай сайжирсан хэл байв. Энэ хүртэл Java олон өөрчлөлт
хийгдсээр эцэст нь Sun сүүлчийн хувилбар “Java 2” гэж нэрлэгдэх Java 1.2.2-г
гаргасан.
-2-
С.Ууганбаяр
JAVA програмчлал
Java нь олон хөгжүүлэлтийн орчинд бичигддэг. Хамгийн хялбархан Java
програм хангамж бол JDK /Java Devolepment Kotekit/ 1.0, 1.1, 1.2 юм. JDK-г
интернет дэх http://java.sun.com/products/jdk сайтаас үнэгүй татаж авч болно.
Java-гийн хувьд олон өөр хөгжүүлэлтийн хэрэгслүүд байдаг: Java Workshop,
Borland Jduilder, Symantec Visul Case, Visual Java /VJ++/, SuperCede г.м
1.3. Java-гийн онцлог
Java нь объект хандлагат байхаас гадна интернет програмчлалын хувьд чухал
онцлогуудаар хангадаг.
Архитектур ба Цөм
Бодит шинжтэй байсан учраас Java гарч ирсэн цагаасаа л өргөн ашиглагдаж
эхэлсэн. Платформ хэлний эсрэг өндөр үр бүтээмжтэй болгон Java өөрийгөө
баталгаажуулж чадсан. Java програмууд нь эх кодод ямар нэгэн өөрчлөлт
хийлгүйгээр интернет дэх ямарч төрлийн клиент машин дээр ажиллаж чадна.
Өмнө хэлснээр энэ бол JVM буюу Java Virtual Machine-д хүрсэн явдал юм. JVM
нь таны програмыг шууд техник хэсгүүдтэй харьцахыг зөвшөөрдөггүй бөгөөд
код ба техник хангамж хоёрын хоорондох интерфэйс байдлаар ажилладаг.
Иймээс Java програм нь клиент тал болдог, энэ нь програмын биелэлтийг
локаль процессорт зохицоход тусалдаг. Доорхи тодорхойлолт бол Java програм
яаж ажилладаг тухай юм.
Java програм нь 2 үе шатанд биелдэг. Java програм хөгжүүлэгчээр
хөрвүүлэгдэж дуусаад интернэт сервер рүү ачаалагдана, дараа нь дахин interpret
хийгдэж тэгээд ажилладаг.
Java програмууд байт код /.class file/ гэж нэрлэгдэх зүйл рүү хөрвүүлэгддэг.
Байт код бол байт хэлбэрийн командуудын дараалал юм. Эдгээр командууд нь
ямар нэгэн машинд зориулагдсан зүйл биш, харин JVM-д зориулан бичигдсэн.
JVM бол виртуаль машинд зориулсан програм юм, ө.х бодит машин биш боловч
үнэндээ бол төстэй орчин юм. Байт код буюу class файл өөрөө ажиллах
боломжгүй ба түүнийг веб хуудсанд суулгадаг. Та веб хуудсаа HTML-ээр
байгуулаад түүний дотроос .class файлыг дуудна. Байт кодыг агуулсан веб
хуудас нь түүнийг веб сайт дээр тавигдсанаар интернэтээр тардаг. Веб хуудсын
клиент талд браузер ашиглан ханддаг. Браузер нь дотроо Java компонентыг
агуулсан байх ёстой, ө.х Java-г зөвшөөрсөн байх ёстой, эсрэг тохиолдолд байт
кодыг HTML текст гэж хүлээн авна. Веб хуудас клиентээр дуудагдах үед Java
програм HTML документ дотор сууж ажиллаж эхэлдэг. Хамгийн эхний алхам
болох хамгаалалтын шалгалт Java код үнэхээр мөн эсвэл биш гэдгийг
тодорхойлохын тулд Java кодыг оруулж ирж байх үед хийгддэг. Дараа нь энэ нь
холбогдоно, эцэст нь тухайн машины архитектур руу орчуулагдана, энэ
хооронд ямар нэг алдаа эсвэл тасралт тохиолдвол тэдгээр нь боловсруулалт
хийгдэх ба програм ажиллана.
-3-
С.Ууганбаяр
JAVA програмчлал
Эх код- - - - - - - Хамгаалалтын
- - - - - - -
Зур 1.1 Аплет яаж ажилладаг вэ.
Хүчтэй
Ихэнхи програмууд гэмтлийн тохиолдлуудад бууж өгдөг, учир нь товлосон
байдал бүрдээгүй шинжүүд нь байхгүй, эсвэл санах ойн зохион байгуулалт
буюу програмын алдаа боловсруулах байдал нь ялгаатай байдлуудад байдаг.
Энэ бол санах ойн зохион байгуулалтын дараа авч үзэх маш чухал зүйл юм.
Заримдаа тодорхой алдааны нөхцөлүүд, “File not found” зэрэг, тулгардаг. Эцэст
нь програм мухардалд ордог!
Эдгээр асуудлууд нь Java-д “garbage collection” ба “ exception handling” гэж
нэрлэгдэх технологиудаар онцгойлон шийдэгдсэн.
“Garbage collection” – “Хог хаягдал цуглуулах”
“Хог цуглуулах” технологид daemon /буг чөтгөр, догшин сахиус/ thread
заагдаагүй объектуудыг чөлөөлж байдаг.
Daemon thread - / систем харьцангуй чөлөөтэй болох үед амьтай болдог thread/
Тиймээс програм зохиогч heap муж дүүрэгийн тухайд зовох хэрэггүй.
“Exception handling” – “алдаа боловсруулах”:
“Exception handling” механизмд массивын доод хязгаарын элементэд хандахыг
оролдох зэрэг програмыг сүйрүүлэхэд хүргэдэг тохиолдлуудыг түүнийг
ажиллаж байх үед нь засаж шийддэг.
Найдвартай, Аюулгүй
Java програм нь интернэтээр зөөвөрлөгдөн хэн нэгний машин дээр ажиллах
чадвартай, гэвч хүлээн авагч ирсэн програмыг ямар нэг сүйтгэх ажиллагаа
хийхгүй гэдэгт яаж үнэмшиж, итгэх вэ? Та үргэлж мэддэг эх сурвалжаас
- - - - - - -
шалгалт
Java
хөрвүүлэгч
00110100
01000100
01000010
(.java файл)
Орчуулалт
01011000
Алдаа
боловсруулалт
Код интернэтээр
зөөвөрлөгдөнө
Байт код
(.class файл)
Биелэх код
Хөгжүүлэлтийн төгсгөл Интернэт Клиент
-4-
С.Ууганбаяр
JAVA програмчлал
мэдээллийг татдаггүй, мөн энэ нь татсан програмуд файл систем рүү хандах,
тодорхой файлуудыг устгаж болно. Тиймээс Java програмыг найдвартай
байлгахын тулд Java нь интернэтээс ирээд браузер дээр ажиллаж байгаа аплет
гэж нэрлэгдэх програмудад локаль системийн файл систем рүү хандахыг
зөвшөөрдөггүй.
Хэдий тийм боловч заагч нь үнэхээр уян хатан, програм бичихэд хүчтэй, Java
нь заагчийг бүрэн ашиглахыг хягаарласан. Энэ нь Java програмуудыг маш
аюулгүй болгоно, энэ нь дур зоргоороо дурын санах ойн байрлалд бичилт хийх
эсвэл системийн нөөцүүдийг онгичих боомжгүй болгоно.
Аплет өөрийн зорьсон газраа ирэхэд түүнийг орчуулахын өмнө хамгаалалтын
шалгалт түүн дээр явагдана. Энэ нь ирсэн Java кодыг үнэхээр Java код мөн
эсэхийг баталгаажуулна. ө.х энэ нь ямар нэгэн вирустай төстэй тодорхойгүй
элементүүдийг агуулах ёсгүй. Та мөн өөрийн Java кодоо илгээхийн өмнө тэмдэг
хийж болох ба хүлээн авагч түүнийг авахын тэмдгийг /шошго, хаяг/ тааруулж
болно. Үүнийг таны кодын цифрэн тэмдэг /digital sign/ гэх ба хэрэв тэмдэг
тохирохгүй бол та хэн нэгэн гуравдагч хүн кодыг онгичсон /hack/ гэж мэдэж
болно.
Энгийн, хялбар
Нэгэн объект хандлагат програмчлалын үндсэн ойлголтууд тодорхой болсон
бол та үр бүтээлтэй Java праграммуудыг маш хялбархан бичиж чадна. Олон
хэлүүд тодорхой тооны онцлогуудаар тодорхой зорилгын хэрэгжүүлэх
боломжуудаар хангадаг. Энэ нь эргээд хэнийг эмх цэгцгүй, сурахад хэцүү
болгодог. Java нь энэ аргыг хэрэглээгүй бөгөөд үндсэн чухал онцлогуудыг
үлдээхийг зорьсон, мөн нийлмэл төвөгтэй байдлуудаас зайлсхийсэн.
Java классын сан дахь классуудын тусламжтайгаар асар их чадал бий болсон.
Distributed
Java объектууд нь интернэт дэх чухал серверүүдээр тархаж чаддаг. Тэдгээр
объектууд нь дурын Java програм дотор агуулагдах, мөн тэдгээр нь түүний
өөрийнх нь компонентууд бол ажиллуулдаг.
Лекц№2
1.4. Java дахь програмын төрлүүд
Java хэл нь үндсэндээ програмын 2 төрөлтэй байдаг, аплет ба програм /
өгүүлэмж/
Аплет бол браузераар интернэтэд ажиллах чадвартай програм юм, өгүүлэмж –д
ийм боломж байхгүй. Браузер нь апплетыг ажиллуулж чадахын тулд өөр дотроо
Java компонентийг агуулсан байх ёстой. Internet Explorer 3.1 ба түүнээс дээшхи
хувилбарууд аплет-г амжилттай ажиллуулж чадна. Энэ хоёрын хоорондох өөр
нэг гол ялгаа бол өгүүлэмж бол локаль файл систем ба нөөцүүд рүү хандаж
-5-
С.Ууганбаяр
JAVA програмчлал
чадна, харин аплет үүнийг хийх хориотой. Програм бол та түүний функцүүдийг
/үүргүүдийг/ маш сайн мэдэж байдаг бүрэн дүүрэн итгэлтэй, мөн та програмаар
хэн тань руу хандсаныг мэддэг. Апплетын хувьд програмыг зохиогч нь хэн
болох тухай мэдэхгүй, эсвэл програм хангалттай аюулгүй эсэх талаар. Үүнийг
толгойдоо хадгалж, аплетууд ирсэн зөвхөн тэр машиныхаа файл систем эсвэл
бусад хэсэг рүү хандах боломж локаль буюу клиент машинуудаас / дэдний
ажиллах/ илүү байдаг.
1.4.1 Өгүүлэмж
Өгүүлэмж ба аплетууд нь Java дахь бүх зүйлтэй адилхан классууд хэлбэрээр
бүхэлдээ бичигддэг. Классын гадна бичигдэх ямар нэгэн зүйл байж болохгүй,
С++-тай адил классын гадна функцүүдийг тодорхойлох г.м зүйлс боломжгүй.
Классыг нэр нь нэрлэх ёсыг дагах ёстой бөгөөд том жижиг үсгүүд ялгаатай.
Өгүүлэмж биелүүлэх үед JVM нь файлын нэртэй ижил нэртэй класс байгаа
эсэхийг хайдаг. Энэ класс нь эхлэх класс /initrating class/ гэж нэрлэгддэг. Pullic
хандалттай класс нь түүнийг гадна харагдана гэдгийг тодорхойлдог, ө.х JVM-д
харагдана. Энэ нь “main” гэж нэрлэгдэх методтой байдаг ба энэ нь compiler-аар
автоматаар хамгийн эхэлж ажиллах метод юм.
Энэ методоос бусад бүх классууд ба тэдний методууд холбогддог.
Өгүүлэмжийн энгийн жишээг үзье.
public class SimpleApp {
public static void main(String args[ ]) {
System.out.println(“Та өөрийн анхны програмаа үүсгэлээ”);
}
}
JDK-д өөрийн гэсэн хөгжүүлэлтийн орчин байдаггүй. Програмууд DOS editor,
notepad дээр бичигдэж болно. Файл нь эхлэн классын нэртэй адилхан нэртэй
.java өргөтгөлтэй хадгалагдах ёстой, дээрхи тохиолдолд энэ нь ‘SimpleApp.java’
байна.
Одоо main() методын тодорхойлолт дахь чухал хэсгүүдийг авч үзье. public
түлхүүр үг нь main() методыг програмын гадна харагдахаар болгодог, ө.х main()
методыг хөрвүүлэгч харах болно. Static түлхүүр үг нь main()–г агуулах классын
хувийг үүсгэлгүйгээр JVM шууд main ( ) метод руу хандаж чадна. void түлхүүр
үг нь main () метод ямар нэгэн утга буцаахгүй гэдгийг заана.
System.ont.println() нь гаралтын стандарт урсгал руу өгөгдөл хэвлэх метод юм.
Энэ нь агуулгыг хэвлэсний дараа шинэ мөрөнд шилжинэ.
Програм дараа нь хөрвүүлэгчээр (javac) хөрвүүлэгдэнэ.
Өмнө path=;c:javabi;c:javalib;c:java2include гэж Java 2-н Java програмуудыг
агуулж байгаа замыг хаах хэрэгтэй.
C:> javac SimplApp.java
Хөрвүүлэлтийн дараа byte кодыг агуулах .class файл үүснэ. Үүнийг дараа нь
C: > java SimpleApp
-6-
С.Ууганбаяр
JAVA програмчлал
1.4.2 Аплет
Програмтай адилхнаар файлын нэртэй адилхан нэртэй класстай аплет-г бичнэ.
Програмтай адилгүй нь main метод байхгүй. Бусад чухал методууд аплет-д
байдаг.
Import java.аплет.*;
Import java.awt.*;
Public class Apple extuds Аплет
{
public veid paint (graphics) {
g.drawstring C” An apple a Day Keeps the Doctor Away”, 50,50);
}
}
Эхний 2 бичиглэл нь аплет-д пакетуудыг багтаах буюу импортлох үүрэгтэй.
Пакет бол тусгай нэрийн дор категорчлогдсон классудын олонлог бөгөөд санд
(librory) хадгалагддаг. Энэ програм java. Пакетыг paint () методыг
ашиглахын тулд, java.аплет-г main классыг Аплет классаас урамшуулахын тулд
include хийж болно. ‘ extends’ түлхүүр үг нь удамшилд хэрэглэгддэг.
Paint (Graphics-д) метод нь аплет-д зураг, текстийг зурахад ашиглагддаг. Энэ нь
аплет-н график колтекстыг автоматаар параметр болгон авдаг. График колтекст
бол ямар нэгэн зүйл зурах бичих муж юм. Тиймээс paint() функц дэх ‘Graphics-
д’ нь аплет-н график колтекстыг өгдөг. Аплет-д текст бичихийн тулд бид
drawString (String text, int posx, int posy) функцийг ашиглана.
Дээрхи аплет нь классын нэртэй адил Аплет.java гэсэн нэртэй хадгалагдаж,
дараах байдлаар хөрвүүлэгдэнэ.
Javac Apple.java
Энэ нь byte кодыг агуулах .class файлыг үүсгэнэ. Энэ нь аплет учраас .class
файл нь HTML документ дотор суулгагдах ба браузерээр ажиллана. Хамгийн
энгийн HTML документ дараах байдалтай бичигдэж болно:
<html>
<head>
<title> “The Аплет is Rumming” </title>
</hend>
<body>
<аплет code=”Apple” heigt=200_width=200>
</аплет>
</html>
1.5. Java хэлний элементүүд
1.5.1 Операторууд
Төрөл Зорилго Тэмдэглэгээ Хэрэглэх байдал
-7-
С.Ууганбаяр
JAVA програмчлал
Арифметик Нэмэх + Int no =1+1
Хасах - Int no =1-1
үржих * Int no =1*1
хуваах / Int no =1/1
үлдэгдэл % Int no =1%1
нэмэгдүүлэх ++ no++ буюу ++no
нийлбэр олгох += no+=4
ялгавар олгох -= no- =4
үржвэр олгох *= no* =4
ногдвор олгох /= no/ =4
үлдэгдэл олгох %= no%=4
хорогдуулах - - no- - буюу - - no
Бит үгүйсгэл ~ ~a
ба & a&b
буюу  ab
xor ^
баруун шилжилт >>
баруун >>>
тэгээр дүүргэх
зүүн шилжилт <<
Хөрвүүлэх Тэнцүү ==
Тэнцүү биш !=
Их >
Бага <
Их буюу тэнцүү >=
Бага буюу тэнцүү <=
1.5.2 Өгөгдлийн төрлүүд
Java-д 8 үндсэн өгөгдлийн байдаг. Эдгээрээс чадал класс, интерфейс, массив
зэрэг өгөгдлийн төрлүүд байдаг. Класс ба интерфейсийн тухай сүүлд гүнзгий
үзнэ.
Өгөгдлийн
төрөл
Урт Хэмжээ Хэрэглэнэ
Byte 8 -128 127
Short 16 -32768 32767
Int 32 -2147483647 2147483647
- 263
263
-1Long 64
Double 64 1.7e – 308 1.7e + 308 Илүү нарийвчлалтай
fleat 32 3.4e – 038 3.4e +038 Бага нарийвчлалтай
char 16 0- ээс 65536 Java нь тэмдэгтийг
дүрслэхэд Unicode –г
ашигладаг. Тэмдэгт нь
кодоор эсвэл тэмдэгтээр
олгогдож болно.
Char choice=1y 1;
Char trop = 27;
-8-
С.Ууганбаяр
JAVA програмчлал
boolean True/false Boolean flag=true;
1.5.3 Бүтцүүд ба илэрхийлэл (Statemant and Expressions )
Бүтэц гэдэг нь тодорхой зориулалттай хэсэг дэх командууд юм. Java дахь зарим
бүтцийн бүтцийг авч үзье.
Dear reply = ‘y’;
Int book –no;
System.ont.println(” resulting statemant g”)
Java дахь бүх бүтцүүд цэгтэй таслалаар (semicolon) төгсдөг. Бүтцүүдийг
бүлэглэхэд нээх, хаах “{}” хаатлтуудыг хэрэглэдэг. Нээх, хаах хаалтуудтай
тодорхойлогдсон бүтцүүдийг олонлогын блок гэж нэрлэдэг.
----------------------------------
{
int count=0;
----------------
----------------
{
count=count+1;
----------------
----------------
}
}
Илэрхийлэл гэдэг нь операторууд ба операидуудаас бүрддэг, эдгээр нь утгыг
гаргадаг.
1.5.4 Хувьсагчид ба утгууд (тогтмолууд) (Variables and Literals)
Хувьсагч бол хамгийн үндсэн хадгалах нэгж юм. Энэ нь дараахь байдлаар
тодорхойлогдоно:
Type identifier=value;
Жишээлбэл, boolean status=true; int heigt=60;
Утгын жишээ, “lilly”, “tulip”, 100, 5179, 79 г.м
1.5.5 Тайлбар
Тайлбар нь хоёр байдлаар бичигддэг: ‘// ’ ба ‘ / * * / ‘. // нь дан мөр тайлбарт
хэрэглэгдэнэ.
Энэ нь хаа ч бичигдэж болох бөгөөд compiler түүний ардаас бичигдсэнийг үл
хэрэгсдэг.
/ * * / нь блок тайлбар оруулахад хэрэглэгддэг. Хэд хэдэн тайлбар хийхэд
хэрэглэнэ.
1.5.6 Хувьсагчийн үйлчлэх хүрээ (Scope)
-9-
С.Ууганбаяр
JAVA програмчлал
Хувьсагчийн үйлчлэх хүрээ нь түүний тодорхойлогдсон блокоор
тодорхойлогддог. Хувьсагч нь түүний тодорхойлогдсон блок болон түүн
доторхи бүх дэд блокуудад харагдана. Дараахь жишээг үзье:
Public class Visibility
{
public Static void main (String args [ ] ) {
block 1 : // энэ бол label
{
int gvar = 100;
block 2:
{
int lvar = 200;
system.out.println (“Глобаль хувьсагч” + gvar);
system.out,println (“Локаль хувьсагч” + lvar);
}
}
gvar=gvar+1;
System.out.println (“Глобаль хувьсагч” + gvar);
Lvar =lvar+1; // алдаа
}
}
}
Тэнд: Java-д өөр блокуудад боловч ижил нэртэй хувьсагчид зарлахыг
зөвшөөрдөггүй.
Жишээлбэл, gvar хувьсагчийг block2 дотор дахин зарлавал алдаа өгнө.
1.6 Програмчлалын элементүүд
Програмчлалын элементүүд нь програмын биелэх дарааллыг удирддаг. Java
дахь програмчлалын элементүүд нь С++ -аас авсан бөгөөд нэмсэн зүйл байхгүй.
1.7 Массив
Массив бол нэгэн ижил нэрийн дор заагдах ижил төрлийн хувьсагчдын бүлэг
юм. Массив нь дурын хэмжээст байж болно. Дараах жишээг үзье.
Public class EnyBenus
{
public static void main (String args [ ])
{
String ebonus[ ] [ ] =new String [2][5];
Ebonus [0][0]= “P.K.Roy” ;
‘
‘
‘
‘
ebonus [1][4]= “5500”;
for (int I=ө; i < 5; I ++)
{
System.out.println (“Emplorgee name:” + ebonus [0] [ i]);
-10-
С.Ууганбаяр
JAVA програмчлал
System.out.println (“Bonus Receved:” + ebonus[1][i]);
}
}
}
Java-д массивтай ажиллах нь бусад хэлэн дэхтэй ижил, гэхдээ массив үүсгэх нь
нэлээд өөр:
Type name[ ] = new type [no.of elements];
Жишээ нь: int item_code [ ] = new int [10];
String week Days [ ]= new String [7];
New түлхүүр үг нь заалт төрлийн хувьсагчдад санах ой хувиарлахад
ашиглагддаг. Java-д тэмдэгттэй ажиллахад ‘String класс’-ийн тусламжтай
хийгддэг. Энэ класс нь зөвхөн тэмдэгт мөр үүсгэхийг зөвшөөрдөггүй, гэхдээ
тэмдэгтийг боловсруулах олон функцүүдтэй.
Хоёр буюу олон хэмжээст массив:
Float twoP_Array[ ] [ ]= new float [5][10];
байдлаар үүсгэдэг. Мөн 2 хэмжээст массивын ялгаатай тооны багануудтайгаар
үүсгэж болдог.
Int list+[ ] [ ] = new int [2][ ];
List[0] = new int [6];
List[1] =new int [15]
Лекц№3
2. Java дахь ОХП
2.1. ОХП-н ухагдахуунууд
Объект хандлага бол програмчлалын технологи дахь шилжилт юм. Одоог
хүртэл програм зохиогчид процедур програмчлалын уламжлалт аргыг хэрэглэж
байна. Процедур програмчлалд програм зохиогч заавруудын дарааллыг
компьютерийн системд өгдөг. Код том хэмжээтэй болоход кодыг процедур ба
функцүүд гэж нэрлэгдэх блокуудад хуваах хэрэгтэйг мэдсэн. Үүнийг бүтцийн
програмчлал гэдэг байв.
Бүтцийн програмчлал нь кодын удирдаж болох хэсгүүдийг байгуулахад
туслана, гэхдээ ижил хугацаанд энэ олон дутагдалтай. Ихэнхи тохиолдолд
функц ба процедурууд тэднээс гадуурхи өгөгдлийг ашиглаж байдаг. Үүний үр
дүнд модулыг шалгахад маш хүнд болдог., модул бүр зөв ажиллаж байгаа
эсэхийг нь мэдэхийн тулд шалгагдаж байдаг, тэр утгыг өөрчилсний дараа
гэмтсэнийг мэдэхийн тулд. Энэ асуудал нь програмын хэмжээг нэмэгдүүлэн
хүндрүүлдэг. Процедур програмчлал дахь өөр нэг асуудал бол өгөдөлд
хоёрдугаарт ач холбогдол өгдөг. Өгөгдөл бол ямар ч програмчлал дахь хамгийн
чухал зүйл. Үнэн хэрэгтээ өгөгдөл бол програм яагаад оршиж байгаагын
анхдагч учир шалтгаан. Гэвч процедур програмчлалд өөр нэг цохон тэмдэглэх
-11-
С.Ууганбаяр
JAVA програмчлал
зүйл бол функц, процедуруудын тусламжтайгаар өгөгдөл яаж удирдагдах вэ
гэдэгт байдаг.
Эдгээр асуудал нь объект хандлагат технологиор шийдэгддэг. Объект хандлагат
технологид өгөгдөл нь анхдагч чухалчлал болдог. Объект хандлагат
технологийн цөм бол объект. Объект бол өгөгдөл ба тэдгээр өгөгдөлтэй
ажилладаг методуудын нэгдэл юм. Үүнийг сайн ойлгохын тулд, ямар нэгэн
бодит амьдралын объектод анхаарлаа хандуул, жишээлбэл үзгийг авч үзье. Үзэг
бол шинж чанар (өнгө, бие, үзгэн эсвэл бөөрөнхий хошуутай г.м) ба ааш
авиртай (үзэг бичдэг) объект юм. Үүнтэй төстэйгээр объект хандлагат
технологид объект нь шинж чанар (өгөдөл)ба ааш авирыг (өгөгдөл дээр
боловсруулалт хийх методууд) агуулж байдаг. Энэ ойлголт нь процедур
програмчлалаас эрс ялгаатай болгодог.
Бид объект хандлагын тухай ярих үед объект, класс, хийсвэрлэл, удамшил,
полимор , битүүмжлэх зэргийг олон ухагдхуунууд бодит толгойд бууна. Бид
объект гэж юу болох тухай ярилцсан, одоо үндсэн ухагдхуунуудыг нэг нэгээр
нь тайлбарлая.
2.1.1 Класс
Класс нь төстэй объектуудбн цуглуулга. Эдгээр объектууд нь ижилхэн
өгөгдлийн бүтэц ба методуудтай байх ёстой
2.1.2 Хийсвэрлэл
Хийсвэрлэл бол програмын үндсэн зорилгоос өөрийн сонирхож байгаа зүйлсээ
илрүүлэх процесс бөгөөд өөрт хамаагүй нарийвчлалуудын гадна орхидог.
Жишээлбэл, Order Processing System-г авч үзье, зүйл бүр нь түүнийг адилтгасан
үл давтагдах дугаартай. Энэ зүйл (item) нь тодорхойлолт, үнэ, тоо ширхэг,
дахин дугаарлах эрэмблэлтэй байна. Бид мөн өөр өнгө, хэмжээс зэрэг
атрибутыг авч болно. Гэхдээ эдгээр атрибутууд ь Order Processing System-д
төдийлөн ач холбогдолгүй, тиймээс бид тэднийг өөрсдийн зохиомжоосоо орхиё.
Энэхүү таарахыг нь үлдээгээд үл таарахыг нь орхиж байгаа процессыг
хийсвэрлэл гэдэг.
2.1.3 Битүүмжлэл
Өмнөх хэлснээр объект нь өгөгдөл ба түүнтэй ажилладаг методуудын нэгдэл
юм. Өгөгдөл ба методуудыг хамтад нь багцалж байгаа энэ аргыг битүүмжлэл
гэдэг.
Order Processing System-с адил хэмжээг дахин авъя. Бид өгөгдлийн тал дээр аль
хэдийн шийдчихсэн, одоо объектын методуудыг олж тогтооё. Методууд нь:
a) Зүйлийн тодорхойлолтуудыг хэвлэх
b) Зүйлийн өгөгдлүүдийг оруулах /хүлээн авах/
c) Тоо хэмжээг өөрчлөх
d) Материалын утгыг хэвлэх
e) Зүйл дахин дугаарлагдах эсэхийг тодорхойлох төвийг хэвлэх.
-12-
С.Ууганбаяр
JAVA програмчлал
Объект
Өгөгдөл Методууд
ItemNo Print Details
Description Accept Details
Rate Change QOH
Quantity on hand Display Value
Reorder Level Reorder Status
Өгөгдөл ба методуудыг хамтад нь багцалж байгаа энэ арга нь битүүмжлэл
бөгөөд энэ нь өгөгдлийн далдлатад хүргэдэг, учир нь гадна талыг интефэйсүүд
төлөөлнө харин дотор атрибутууд далдлагдана.
2.1.4 Удамшил
Удамшил бол шатлан захирах хамаарал дээр тулгуурласан классуудын хооронд
атрибут ба үйлдлүүдийн эзэмшилт юм. Удамшигч нь мөн үндсэн классын бүх
атрибутууд ба зан байдлыг түүний sub-класст бэлэн болгож дахин ашиглаж
төлөвшдөг. Жишээлбэл, бид order Processing System-д Item гэж нэрлэгдэх
объектыг авсан. Компани компьютерийн төхөөрөмж худалддаг гэж бодъё.
Тэгвэл энэ Item нь Printer, Stationery, Floppy disk sub-классуудад тохирно.
Эдгээр бүх sub-классуд нь нийтлэг itemno, description, rate, qurantity on hand,
reorder level атрибуудтай, бид эдгээрийг super класс item-н дор оруулсан.
Printer sub класс нь эдгээр бүх атрибут дээр өөрийн хоёр атрибутыг нэмнэ-
хэвлэлийн төрөл /laserjet эсвэл Inkjet/, минутад хэвлэх хуудасны тоо. Stationory
класс нь мөн Super классын атрибуттуд дээр өөрийн нэг атрибутыг нэмнэ-
хуудсын хэмжээ. Floppy disk класс мөн super классын атрибутууд дээр нэмээд
өөрийн 2 атрибутуудтай-багтаамж ба хэмжээ. Энэ удамшлыг зургаар үзүүлбэл.
Item
Item No
Description
Rate
Quantity on hand
Reorder level
-13-
С.Ууганбаяр
JAVA програмчлал
Printer Stationery Floppy disk
2.1.5 Полиморфизм
Полифермизм бол өөр өөр объектуудтай ялгаатай байх метод эсвэл үйлдлийн
чадвар юм. Жишээлбэл, show функц нь Printer ба Floppydisk классуудын хувьд
ялгаатай байна.
SiteType Capacity
Pages Per Minute Site
2.2 Класс ба объект үүсгэх
Бид одоо объект ханлагат програмтай танил боллоо. Одоо Item class-г үүсгэх
Java програм бичье.
Class Item {
Private int itemno;
Private string description;
Private float rate;
Private int goh;
Private int roe;
Public void display () <
System.out.println (“Item Details”);
Sistem.out.println (“. . . . . .. . . . ”);
Sistem.out.println (“Item number : ” + itemno);
Sistem.out.println (“Description : ” + description);
Sistem.out.println (“Rate : ” + rate );
Sistem.out.println (“Quantityon hand : ” + );
Sistem.out.println (“Reoder level : ” + roe);
Public void change QOH ( int qty, char Status) {
If (Status == ‘A’)
Qch=qch+qty;
Else
If (status = = ‘S’)
Qoh=qoh-qty;
}
public void accep+Details ( int ino, String desc, float rt, int qty, int reorder) {
itemno=ino;
description=desc;
rate=rt;
qoh=qty;
rol=roerder;
}
2.3 Санах ойн менежмент (Memory Management)
-14-
С.Ууганбаяр
JAVA програмчлал
Та Java –д шинэ объект үүсгэхэд пек операторыг ашигладгыг үзсэн. Энэ
оператор нь объектын өгөгдөл бүрт тохирох хэмжээтэй бүхэл санах ойг
хувиарладаг. Java-д санах ойг удирдах нь динамик ба автомат. Энэ нь зүгээр л
объектын шууд заагчийг үүсгэх боломжтой ба сүүлд нь түүнд пек операторын
тусламжтай ой хувиарлана гэсэн үг.
………….
Item I;
…………
…………
I= пеw Item () ;
……….
Одоо классын объектын классуудад ой яаж хувиарлагддагыг үзье. Классын
объект бүр түүний тусдаа атрибутуудынхаа хувьд ой хувиарлагдсан байдаг.
Гэвч нэгэн ижил классын бүх объектууд ижил методуудыг эзэмшинэ. Энэ нь
зүгээр л классын объект пек операторын тусламжтай үүсгэгддэг, ой нь түүний
атрибутуудад хувиарлагддаг боловч методуудад хувиарлагддаггүй гэсэн үг.
Санах ой
Item классын методууд
Assept Details
Display
Change QOH
Item A Item B
Java -д санах ойн удирдлага нь автомат учраас та объектын хэрэглэсэн санах
ойг чөлөөлөх хэрэггүй. Java нь хэрэглэгдэхгүй болсон объектуудыг хайдаг хог
цуглуулагчтай байдаг ба тэдгээр объектуудаар ашиглагдсан ойг буцаан
сэргээдэг.
Олон тохиолдолд объект нь түүнийг устгах үед тодорхой үйлдлүүдийг хийдэг.
Жишээлбэл, програм файл handl, цонхны тэмдэгтийн файл зэрэг объект
устахынхаа өмнө суллах хэрэгтэй болно. Энэ метод нь объект хог
цуглуулагчаар чөлөөлөгдөхийн өмнө дуудагддаг. Finalite() методын
1 2
Nuts & Botts Hammer
23.56 75.89
100 156
23 50
-15-
С.Ууганбаяр
JAVA програмчлал
тодорхойлж буй энэ процессыг finalitation гэж хэлдэг. Finalite() методын
ерөнхий хэлбэр:
Protected void finalite () {
…….
…….
}
Ямар ч гэсэн та нэг зүйлийг тэмдэглэх ёстой. Хэзээ хог цуглуулагч идэвхждэг
мөн Finalite() дуудагддаг болохыг мэдэх боломжгүй. Иймээс та хэзээ Finalite()
дуудагдах, эсвэл дуудагдсаныг хэзээ ч баттай хэлж чадахгүй.
Та пек оператын тусламжтай объектод санах ойг ил тодорхой хувиарладаг, гэвч
түүнийг тодорхойгоор чөлөөлж чадахгүй.
Runtime класс
Runtime класс нь run-time орчныг битүүмжилдэг. Run-time орчин нь аль хэдийн
оршиж байгаа бол та Runtime объектыг үүсгэж чадахгүй. Гэхдээ та getRuntime()
методын тусламжтай идэвхтэт run-time орчны заалтыг авч чадна. Та ил
тодорхой байдлаар gc() методыг ашиглан хог цуглуулагчыг дуудаж болно.
Дараах кодыг хэсэг хог цуглуулагчийг дуудна.
……….
……….
Runtime r=Runtime, getRuntime();
r.gc();
2.4 Төрөл хувиргалт
Java програмд олон удаа нэг төрлийн өгөгдөл утгыг өөр төрлийн утга руу
хөрвүүлдэг. Жнь: int-с float руу, float-c double руу. Casting бол утгыг түүний
анхны төрлөөс өөр төрөлтэй шинэ утга болгох процесс юм. Төрөл хувиргалт нь
үндсэн өгөгдлийн төрлүүд (int8 flout8 boolean г.м) хооронд, эсвэл объектуудын
хооронд (String, Point, Integer г.м) эсвэл үндсэн төрөл ба объектын хооронд
хийгддэг.
2.4.1 Үндсэн өгөгдлийн төрлүүдийн хувиргалт
Энэ нь үндсэн өгөгдлийн төрөлтэй нэг утгыг өөр нэг үндсэн өгөгдлийн
төрөлтэй болгож хувиргах. Гэхдээ boolean утгууд true эсвэл false гэсэн хоёрхон
утга авдаг учраас хувиргалт хийгдэж болохгүй. Хувиргалт нь ихэвчлэн тоон
утгуудад хийгддэг. Энэ тохиолдолд дүр утга нь эх утгаасаа том байх хэрэгтэй,
жнь: int-г long руу. Учир нь бага утга их утга руу хувиргахад их утгад алдаа
гарахгүй. Ийм төрлийн хувиргалт нь автоматаар хийгддэг.
Харин, хэрэв дүр утга нь эхээс том байж чадахгүй бол ил төрөл хувиргалтыг
хийдэг. Ил төрөл хувиргалт нь дараах байдлаар хийгдэнэ.
(data type)value
Дараах кодын хэсэг float утгыг int утга руу хөрвүүлж байна.
……..
int i ;
-16-
С.Ууганбаяр
JAVA програмчлал
float f=6.7;
I=(int)f;
……….
Ямар ч гэсэн энэ тохиолдолд өгөгдөл гэмтэнэ. I хувьсагч нь 6 утгатай байж
болно, зөвхөн бүтэн утга авна. Өөр нэг бүтэн тоог бодит руу хөрвүүлсэн жишээ
үзье.
……….
Int i =1078;
Double d;;
…………
2.4.2 Объектуудын төрөл хувиргалт
Нэг классын объект нь өөр нэг классын объект руу хөрвөж болно. Гэхдээ энэ 2
класс нь хоёул хоорондоо удамшлаар холбогдсон байх ёстой, ө.х нэг класс нь
нөгөөгийн sub класс байх ёстой.
Энд мөн далд эсвэл ил төрөл хувиргалт хийгдэнэ.
Далд хувиргалт нь бага төрлийн объект том төрлийн объект руу хувиргагдаж
байгаа үед явагдана. Энэ нь ил хувиргалтгүйгээр sub классын объект нь super
классын объект болн ашиглагдаж болно гэсэн үг. Учир нь супер классын бүх
атрибут, методууд автоматаар түүний sub классд байдаг.
Хэрэв sub классын объект super класс руу хувиргагдаж байгаа бол ил хувиргалт
явагдана. Энд бодох ёстой нэг зүйл бит-ын хувиргалтын үр дүнд мэдээлэл
гэмтэж болно. Учир нь sub класс бол түүний super классын илүү үүргүүдийг
агуулдаг. Объектыг доорхи байдлаар төрөл хувиргана.
(class name) object
Ж.нь: Item new Item ();
Printer P= new Printer();
I=P; // зөв, далд хувиргалт хийгдэнэ.
P=I; // буруу, ил хувиргалт хэрэгтэй
P=(printer) I;// зөв
2.4.3 Үндсэн төрлөөс объект руу эсвэл объектоос үндсэн төрөл рүү хувиргах
Объектын үндсэн төрөл рүү хувиргах буюу vice – versee нь Java-д
зөвшөөрөгддөггүй. Учир нь ердийн үндсэн төрлүүд нь класстай адилгүй бөгөөд
тэдгээр нь объектоос ялгаатай. Хэдийгээр объектын үндсэн төрөл рүү хувиргах
нь зөвшөөрөгдөөгүй боловч Java үүнийг өөр байдлаар бий болгосон. Java.long
пакет нь үндсэн өгөгдлийн төрлүүдтэй тохирох классуудыг агуулдаг. Жнь:
Integer класс нь int үндсэн төрлийн оронд, үүнтэй төстэйгээр Boolean, Byte8
Character, Long, Void, Double, Float г.м классууд байдаг.
Объектын үндсэн төрөл рүү хувиргахын тулд уг классын методуудыг ашиглаж
болно. Жнь: String объектыг int рүү хувиргах дараах кодыг харъя:
String str = nek String (“4578”);
Int i = Integer.Parse Int (str);
Дээрхи кодод String-н str объектын бүхэл утгыг авахад Integer классын parse Int
методыг ашиглаж болно.
Лекц№4
2.5 Байгуулагчид
-17-
С.Ууганбаяр
JAVA програмчлал
Байгуулагч бол объектын анхан утгуудыг тогтооход ашиглагддаг классын нэг
метод юм. Байгуулагч нь бусад классын методуудтай адилхан зарлагддаг.
Гэхдээ байгуулагч нь буурах утга байдаггүй ба түүний нэр нь классын нэртэй
ижил байдаг. Дараах кодын хэсэг нь Item классын байгуулагчыг тодорхойлж
байна.
Item() 1
Itemno=0;
Description = nek String ();
Rate = 0.0 f;
Goh = 0;
Rol =0;
}
Энэ байгууллага нь дуудагдсан үедээ объектын өгөгдлүүдэд утга онооно.
Байгуулагч дараах байдлаар дуудагддаг:
Item I= new Item ();
Java нь default байгуулагчийг класс болгонд үүсгэдэг. Хэрэв хэрэглэгч
тодорхойлогч бол. Хэрэв хэрэглэгч классын байгуулагч методыг тодорхойлсон
бол энэ нь уг классын объект үүсэх үед дуудагддаг.
2.5.1 Олон байгуулагч үүсгэх
Класс нь олон байгуулагчтай байж болно. Гэвч яагаад класст олон байгуулагч
хэрэгтэй болдог юм бэ? Байгуулагч бол объектын эхний төлвийг байгуулах
арга, объектыг олон замуудаар үүсгэхийг хүсч болно. Програмд дуудагдах
байгуулагч нь объект үүсч байх үед тодорхой болно. Дараах жишээнд Item-ийн
2 байгуулагчыг тодорхойлж, объектууд хэрхэн ялгаатай замаар үүсгэгддэгийг
үзүүдэв.
Class Item {
Private int itemno;
Private String description;
Private float rate;
Private int goh;
Private int rol;
Public void display () {
System. out. println (“Item details”);
System. out. println (“Item details”);
System. out. println (“Item number : ‘’ + itemno);
System. out. println (“Description : ” + description);
System. out. println (“Rate :” + rate);
System. out. println (“Quantity on hand :” + qoh);
System. out. println (“Reoder level :” + rol);
}
public void change QOH (int, qty, char status) {
if (Status == ‘A’)
qoh = qoh + qty;
-18-
С.Ууганбаяр
JAVA програмчлал
else if (status == ‘s’)
qoh=goh – qty;
}
public void accapt Details ( int ino, string dese, float rt, int qty, int reorder);
{ itemno = ino;
description = desc;
rate = rt
qoh = qty;
rol = reorder;
}
Item () { // байгуулагч 1
Itemno = 0;
Deseription =
Rate = 0. 0 f;
Roh = 0;
Roe = 0;
}
Item (string str) { // байгуулагч 2
Itemno = 0
Description = str;
Rate = 0.0 f;
Roh = 0;
Roe = 0;
}
} Item.Java файл
Import Item;
Class Try Item {
Public void (string args [ ] ) {
Item I=new Item (); // байгуулагч 1-г дуудна
i. display;
string d=new string (“Nuts 2 Bolts”);
Item I=new Item (d); // байгуулагч 2-г дуудна
i. display;
/* буруу, классд тохирох байгуулаа тодорхойлогдоогүй */
item k=new Item (1, d);
k.display();
}
} Try Item.java файл
Энд импортлогдож байгаа Item класс нь нэгэн ижил каталогт байх ёстой.
Default байгуулагч объектын өгөгдлүүдийг яаж
Ижил нэртэй боловч ялгаатай тодорхойлолттой 2 функц байвал үүнийг
функцийг дахин тодорхойлолт гэдэг.
2.5 Объектуудыг харьцуулах
Үндсэн өгөгдлийн төрлүүдийг харьцуулахад == (тэнцүү) операторыг ашигладаг.
Доорхи жишээг харъя:
-19-
С.Ууганбаяр
JAVA програмчлал
Class Compint {
Public strtic void main (string args [ ] ) {
Int x= 33;
Int y=33;
If ( x==y)
System.out.println (“Equal”);
Else
System.out.println (“Not Equal”);
Энэ програмын үр дүн нь х, у хоёул тэнцүү учраас “Equal” байна. Одоо Integer
классын объектыг ашиглаж ижил програм бичьев
Class CompInteger {
Public static void main (String args [ ]){
Integer x= new Integer (33);
Integer y= new Integer (33);
If (x==y)
System.out.println (“Equal”);
Else
System.out.println (“ Not Equal”);
}
Энэ програмын үр дүн нь хоёр объект хоёул 33 утгатай байхад “Not Equal”
байна. Учир нь == оператор нь 2 объектыг харьцуулдаг. Харин объектын
утгуудыг харьцуулдаггүй, х бау нь объектууд, тиймээс үр дүн нь “Not Equal”.
Ялгаатай объектуудын хувьд ой хувиргалт
Санах ой
х у
33 33
Дараах байдлаар объектуудыг зарласан үед дээрхи програм нь “Equal” үр дүн
гарна.
Integer y;
y = x;
Учир нь зөвхөн ганц объект 33 гэсэн утгатайгаар үүссэн. у объектод санах ой
хувиарлагдахгүй учир нь энд байгуулагч метод ашиглагдахгүй. Тиймээс у бол
зүгээр л Integer төрлийн объектын заалт, гэвч одоохондоо энэ нь ямар нэг зөв
объект заахгүй байна. у=х –н дараа у нь х-н зааж байгаатай адил объектыг
заана.
Ижил объектыг заах хувьсагчдын санах ой хувиарлалт
Санах ой
х у
-20-
С.Ууганбаяр33
JAVA програмчлал
Ингэхлээр, 2 объект тэдгээрийн утгын хувьд харьцуулагдах үед == операторыг
ашиглаж болохгүй. Хоёр объектод ашиглагдах утгуудыг харьцуулахад equals ()
методыг хэрэглэж болно.
Жнь:
Class CompInteger {
Public static void main (string args [ ]) {
Integer x= new Integer (33);
Integer y= new Integer (33);
If (x.equals (y))
System.out.println (“Equal”);
Else
System.out.println (“ Not Equal”);
2.6 Удамшил
Бид өмнө удамшлын тухай бяцхан оршил хийсэн. Одоо яаж хэрэгжүүлэхийг авч
үзье.
Бид Item классыг 5 атритурт, 3 метод, 2 байгуулагчтай тодорхойлсон. Одоо Item
классын дэд класс Printer-г нэмэлт атрибутуудтайгаар үүсгэе.
Import Item;
Class Printer extends Item {
String type;
Int ppm;
Printer () { // байгуулагч 1
Super () ;
Type ;
Ppm=0;
}
Printer (int ino8 string desc, float rt, int qty, int reorder, string type, int ppm){
Super (ino, desc,rt, qty, reorder); // байгуулагч 2
This.type = type;
-21-
С.Ууганбаяр
JAVA програмчлал
This.ppm = ppm;
}
public void display () {
super.display (); // super классын display методыг дуудах
system.out.println (“Printer-н төрөл : ” + type);
system.out.println (“Минут дахь хуудас : ” + ppm);
Printer.java файл
Import java.lang.*;
Import Printer;
Class Try In herit {
Public static void main (String args [ ]){
Item I=new Item (1, “Mouse”, 500.89f 1200, 200);
i. display ();
Printer p=new Printer (2, “Inkjet Printer”, 10000.75f, 200.35, “6P”, 6);
P. display () ;
}
}
Try Inherit.java файл
Super түлхүүр үг нь super классыг заахад хэрэглэгддэг. Printer классын
байгуулагч 1-д Super () бичиглэл нь Item super классын байгуулагч 2-д super
(ino, desc, rt, qty, reorder) бичиглэл нь Item super классын байгуулагч методыг
(дугаар 1) шууд дуудаж байна. Төстэйгээр Printer классын байгуулагч 2-д super
(ino, desc, rt, qty, reorder) бичиглэл нь Item super классын байгуулагч методыг
(дугаар 2) дуудаж байна. Printer классын display метод супер классын display
методыг дуудагч эхний 5 атрибутыг хэвлээд дараа нь нэмэлт 2 атрибутыг
хэвлэж байна. Энэ нь Sub класс супер класс хоёул ижил нэртэй функцүүдтэй
байж болно гэдгийг харуулж байна. Printer-н байгуулагч 2 нь мөн this түлхүүр
үгийг ашиглаж байна. this түлхүүр үг нь тухайн идэвхтэй объектыг заахад
хэрэглэгддэг. Байгуулагч 2 методын аргументуудын нэг нь объектын
атрибуттай адилхан нэртэй (type) байгааг ашиглаххэрэгтэй. Энэ нь ямар
хувьсагч нь утга өгч, ямар нь утга авч байгаа нь тодорхой байх ёстой. Иймээс
this.type = type бичиглэл өгөгдөж байна.
2.7 Полиморфизм
Өмнө хэлснээр полиморфизм бол ялгаатай объектуудад ялгаатайгаар харш
үйлдэл хийх функцийн чадвар юм. Полиморфизмын 2 төрөл байгаа, static ба
динамик полиморфизм.
Static полиморфизмд дуудагдах функц нь компиляц хийх үед өөрөө мэдэгддэг.
Жнь:
Дараах хоёр тодорхойлолттой 2 функц програмд зарлагдсан байдаг:
Change QOH (int, char)
Change QOH (int)
тэгээд програмд дараах команд өгөгдсөн: Change QOH (30);
-22-
С.Ууганбаяр
JAVA програмчлал
Хоёр дахь функц дуудагдах бөгөөд энэ нь хөрвүүлэлтийн үед өөрөө тодорно.
Хоёрдугаар функц дуудагдах нь энэ тохиолдолд функцэд өгөгдөх аргументын
тоо ба төрлөөр тодорно. Зөвхөн нэг аргумент өгөгдсөн учраас 2 дахь функц
дуудагдана. Хэрэв хоёр аргумент (нэг нь int нөгөө нь char) өгөгдсөн бол эхний
функц дуудагдах байсан. Энэ онцлогыг мөн Функцийн тодорхойлолт буюу
Эрт Холболт гэдэг.
Dynamic полиморизм бол Хожуу холболт гэж мөн нэрлэгддэг. Динамик
полиморизмд дуудагдах функцийн шийдэл нь ажиллаж байх үед шийдэгддэг.
Илүү тодорхой болгохын тулд жишээ авъя.
Бид өмнө Item ба Printer класс файлууд тодорхойлсон. Printer бол Item классын
sub класс. Энэ нь супер классын (Item) заалтыг задлах боломжтой ба тэгээд
ажиллаж байх үед нь хэрэглэгчийн оролтоос хамааруулан Item эсвэл Ptinter
объект тодорхойлогдож болно.
Import Ptinter;
Import java.io.*;
Class Try Poly {
Public static void main (string args [ ]) {
Item I;
Int ch =0;
While ( ch ! = ‘P’ && ch! = ‘N’)
{
System.out.println(“ердийн Item нэмэхэд N, Printer нэмэхэд P
дар”);
Try {
Ch=System.in.read();
}Catch (I 0 Exception e) {
System.out.println (“Error”); }
}
if (ch==’p’)
I=new Println (1, “Laser jet”, 20000f, 100,25. “III plus”, 8);
Else
I=new Item (1, “Mouse Logitech”, 300f, 100, 20);
i. display ();
}
}
Динамик полиморфизмын хэрэгжүүлэх (TryPoly.java)
2.8 Командын мөрийн аргументууд
Командын мөрийн аргументууд бол командын мөрнөөс Java програмд
дамжигдах аргументууд юм.
Java програм нь дараах командыг өгч ажилладаг:
Java { class file name}
Жишээ нь: TryPoly.class файлыг ажиллуулахад java TryPoly
Програмд аргументууд дамжуулахад дараахь команд өгөгдөж болно:
Java TryPoly c1 c2 c3 c4 c5
Энд с1 нь эхний аргумент, с2 нь хоёрдох аргумент г.м. Хоёр аргументын
хооронд заавал сул зай байх ёстойг анхаараарай. Командын мөрөн дээр
аргументыг хүлээн авахын давуу тал нь програм илүү ерөнхий шинжтэй болно.
-23-
С.Ууганбаяр
JAVA програмчлал
TryPoly.java програмд анхаарлаа хандуулъя. Ямар төрлийн объект үүсгэхийг
ажиллаж байх үед асуухын оронд командын мөрнөөс аргументаар дамжуулж
програмд өгье.
Одоо Java яаж командын мөрийн аргументуудыг боловсруулдагыг үзье. Хэрэв
програм командын мөрнөөс аргумент хүлээн авсан бол Java эдгээр
аргументуудыг тэмдэгт мөрийн массивт хадгалан main() функцэд дамжуулдаг.
Дараа нь програм үүнийг хүссэн цагтаа боловсруулж болно. Жишээ нь:
Public class TryMain Arguments {
Public static void main (string [ ] args)
{
int I =0;
for ( I=0; I < args.lugth; I ++) {
System.out.println (“Аргумент ” + (I+1) + “ ; “ + args [i]) ;
}
}
}
Командын мөрийн аргументуудыг хэвлэх.
Одоо TryPoly.java програмыг дээр хэлснээр өөрчилье:
Class TryPoly 1 {
Public static void main (String args [ ]) {
Item :;
If (args. Length !=1) {
System.out.println (“Аргументын тоо буруу ”);
System.exit (0); }
If (args [0]. Equals (“P”)) {
I=new Println (1, “Laserjet”, 20000 f, 100, 25, “III plus”, 8);
i.display () ;
}
else
if (args [0]. Equals (“N”)) {
I=new Item (1, “Mouse logitech”, 300f, 100, 20);
i. display ();
}
else {
System.out.println (“Буруу утга ….”);
System.exit (0);
}
}
}
Лекц №5
3.1 Хандалт ба хандалтын удирдлага
-24-
С.Ууганбаяр
JAVA програмчлал
Өмнө хэлснээр битүүмжлэл нь классын өгөгдөл ба методуудын хамтад нь
нэгтгэж дан бүхэл болгодог. Битүүмжлэл дэх хамгийн чухал зүйл бол класс
дотрхи компонентуудын хамгаалалт юм. Энэ бол классын рүү хандалтыг
чангатгахад маш чухал бөгөөд өгөгдөл буруу ашиглагдахгүй. Ийм шалтгаанаар
хандалт тодорхойлогчид, public, private, protected, өгөгдөл рүү ялгаатай
замаар хандахыг удирдахын тулд тодорхойлогдсон. Хандалт тодорхойлогчид нь
өгөгдлүүдийн харагдах байдалд нөлөөлдөг ба мөн классын гадна методуудын
харагдах байдалд нөлөөлнө. Эдгээр методуудад классын гадна талаас нэг бол
удаанаар эсвэл классын объектыг үүсгэж хандахад Хандалт тодорхойлогчид нь
дан класс эсвэл пакетын түвшинд бүлэг классуудтай ажилладаг. Бид
одоохондоо хандалт хувиргагчдыг нэг класс хэрэглэнэ.
Сүүлд удахгүы пакетын тухай үзнэ.
3.1.1 Default
Ямар нэгэн хандалт хувиргагчтай зарлагдаагүй хувьсагч буюу метод нь ижил
пакет дотроо бусад классуудад бэлэн байна. Нэгэн пакет дахь классууд public
гишүүдтэй адил default хувьсагчдад хандаж чадна.
3.1.2 Public
Public хандалт нь классын гаднаас гишүүн өгөгдөл, функцүүд рүү нээлттэй
хандахыг зөвшөөрдөг.
3.1.3 Privite
Ийм өгөгдөл, функцүүд рүү зөвхөн public гишүүн функцүүдээр дамжин
ханддаг.
3.1.4 Protected
Protected гишүүд нь уг классаас удамшсан классд дотроос хандахыг
зөвшөөрдөг.
3.1.5 Static
Класс дотор хувьсагч static-р тодорхойлогдсон үед түүний зөвхөн нэг хувийг
классын объектуудын гадна үлдээдэг. Энэ нь мөн кодын дурын бусад хэсгээс
хандаж болох глобаль хувьсагч болно.
Static <type name> <variable>;
Хэрэв метод static-р зарлагдсан бол энэ нь классын заалттай хамт хэрэглэгдэх
ба объектод хамаарахгүй оршдог. Static хувьсагчид ба методууд нь классын
хувь үүссэн ч үүсээгүй ч сул чөлөөтэй оршдог. Static метод нь зөвхөн бусад
static метод, хувьсагчдыг чадна, тэд ямар ч тохиолдолд уг эсвэл super-
г зааж чадахгүй.
Static хувьсагч ба методуудаас гадна кодын блок мөн static-р тодорхойлогдож
болно. Түүнийг static блок гэдэг. Энэ блокын онцлог нь класс ачаалагдах үед л
биелдэг кодын бусад хэсэг биелэхээс өмнө. Энэ нь үндсэндээ хийгч дүрэм
байдлаар ажилладаг.
-25-
С.Ууганбаяр
JAVA програмчлал
Class Static_Block
{
Static int a;
Static
{
a=a+10;
}
public static void main (String args [ ])
{
System.out.println (“ a-н утга : ” +a);
}
}
Дээрхи жишээнд main () методоос өмнө static блок биелнэ, ‘a’ хувьсагч эхлээд
ба дараа нь main () метод биелнэ.
3.1.6 Final
Final нь хувьсагч ба методуудтай хамт хэрэглэгдэж болно. Хувьсагч final
байдлаар зарлагдсан үед энэ нь тогтмол байдлаар хэрэглэгддэг, түүний утгыг
өөрчилж чадахгүй. Тогтмол зарлах жишээ:
Final int radias =34
Final float pi =3. 1428f;
Float төрлийн хувьсагчдыг зарлахад ардаас ‘f ’ үсэг тавьж ил
төрөл хувиргалт хийх шаардлагатай байдаг.
Методыг final байдлаар зарлах нь түүнийг байгаагаар нь үлдээхийг хүссэн үед
хэрэглэдэг, ө.х методыг дахин тодорхойлохыг хүсээгүй үед методыг Final
болгосны үр дүнд түүнийг sub класс дарж тодорхойлохоос хамгаалдаг.
3.2 Хийсвэр класс ба методууд
Удамшлын ойлголт нь үндсэндээ классыг гэмтээлгүй дахин байгуулалгүйгээр
түүний боломжийг нэмэгдүүлэхэд хэрэгжүүлдэг. Энэ нь ерөнхийдөө нэг бол
байгаа методуудыг дарж тодорхойлж эсвэл өөр шинийг шинэ хүү классд нэмж
байгаа хэрэг.
Гэхдээ эдгээрээс маш ялгаатай нэгэн тохироо байж болно. Танд үндсэн классд
ердөө байр эзлэн орших метод тааралдаж магадгүй, энэ нь хүү классуудад үл
тохирох бодит хэрэгжүүлэлт юм. Энэ бол run time полиморфизмд хүрэх
шалтгаан юм. Энэ тохиолдолд бид байр эзлэгч методыг суурь классд
абстрактаар тавьж болно., абстрактаар тодорхойлно гэдэг нь уг метод нь ямар
нэг кодтой байж чадахгүй гэсэн утгатай. Абстракт методтой класс нь мөн
абстрактаар тодорхойлогдох ёстой, ийм класс нь хувь үүсгэж чадахгүй гэсэн
утгатай.
Үүнээс гадна, абстракт суурь классаас удамшсан хүү классуд нь энэ методыг
тодорхойгоор дарж тодорхойлох ёстой. Мөн хэрэв энэ нь дарж тодорхойлж
болохгүй бол тэрхүү хүү класс нь өөр нэг хүү класс түүнээс удамшиж
хэрэгжүүлэх хүртэл абстрактаар тодорхойлогдох болно.
-26-
С.Ууганбаяр
JAVA програмчлал
Үйлчлүүлэгч ресторанд төлбөрөө төлж байгаа тохиолдлыг авч үзье. Тэр
төлбөрөө кредит карт, чек, кассаар хийж болно. Нийт төлбөрийг дараах
төлбөрийг тооцоог хийнэ.
• Хэрэв төлбөр кредит картаар хийгдсэн бол түүнийг шалгаад хэрэв хүчинтэй
бол тооцоо хийнэ.
• Хэрэв чек бол чекийн дугаар дахь төлбөрийн дансыг авч тооцоо хийнэ.
• Хэрэв кассар бол төлбөр шууд хийгдэнэ.
Бүх 3 тохиолдлуудын хувьд энгийн төлөх процедур хийхийн оронд get.Payment
() нэртэй ердийн абстракт функц байгуулж энэ функцээ Payment классаас
удамшсан чек төлбөр, кредит төлбөр, класс төлбөр гэсэн ялгаатай 3 классуудад
тус тусад нь хэрэгжүүлнэ.
Abstruct class Payment
{
int file_Number;
String customer_Name;
String customer_Address;
Void accept_ Cust_Details ()
{
…………
…………
}
Payment ()
{
// гишүүн хувьсагчдыг тохирох утгуудаар
}
} abstruct void get_Payment (); // абстракт метод зарлагдана
class CC_Pymt extends Payment
{
void get_Payment ()
{
// кредит картын дугаарыг авах
// банкны нэрийг авах
// нийт төлбөрийг авах
}
}
class Chq_Pymt extends Payment
{
void get_Payment ()
{
// чекийн дугаарыг авах
// төлөгч банк ба төлбөрийг авах
}
}
class Cach_Pymt extends Payment
{
void get Payment ()
{
-27-
С.Ууганбаяр
JAVA програмчлал
// нийт төлбөрийг авах
}
}
public class Restaurant
{
public static void main (string args[ ])
{
payment p.cc=new CC.Pymt ();
p-cc.accept_Cust_Details();
p-cc.get_Payment ();
Payment p.chq=new chq. Pymtc ();
p-chq.accept_Cust_Details ();
p-chq.get_Payment ();
Payment p.cach =new cach_Pymt ();
p-cach.acept_Cust_Details();
p-cach.get_Payment ();
}
}
main ( ) метод дотор Payment суурь классын гурван объект үүссэн байна. Тус
бүр нь төлбөрийн хэлбэрээс хамааран тохирох хүү классыг заасан ба
get.Payment () метод руу хандана.
Лекц № 6
3.3 Интерфэйс
Интерфэйс бол зөвхөн тогтмол ба методуудын prototype- уудаас тогтох классын
нэг тусгай төрөл юм. Энэ нь биегүй метод ба хувьсагчийн хувийг хуулдаггүй.
Интерфэйсийг хэрэгжүүлэх үед та хэрэгжүүлэлтийн мэдээллийн талаар ямар
нэгэн төсөөлөл хийгдэдгүй. Энэ нь интерфэйсийг хэрэгжүүлж байгаа классууд
интерфэйс дэх методуудын үүргийг шийдэх болдог.
Интерфэйсүүд нь практикт Java –гийн нийлмэл удамшлыг орлодог. Хэдийгээр
класс суурь класаас удамшсан боловч энэ нь интерфэйсүүдийг хэрэгжүүлэхийг
зөвшөөрдөг. Интерфэйс нь цэвэр абстракт класстай адилхан. Үүний учир нь,
тэд хэрэгжүүлэлтийг дэлгэрэнгүй мэдэж чадахгүйгээс эрх мэдэл дутуу байдаг.
Гэвч тэдэнд өөр давуу талууд бий.
Энэ нь бүлэг классуудын нийтлэг шинжийг жагсаах боломжтой. Эдгээр
классууд нийтлэг интерфэйсийг хэрэгжүүлж болох үед интерфэйсийн өөрийн
тодорхойлолтоос тэд юу хийх, яаж хийх зэргийн маш тодорхой болгодог.
Тиймээс интерфэйсийг хэрэгжүүлж буй классууд нь зүйлүүдийг судлан тусгай
шинж чанартай болж болно. Жнь: бид radio класс, television гэсэн 2 класс
байгуулъя гэж саная. Эдгээр хоёр классд нийтлэг нэг зүйл байна. Энэ нь дуу.
Тиймээс бид sound control нэртэй интерфэйсийг байгуулъя. Тэгээд үүнийг
дээрхи 2 класс хэрэгжүүлнэ. Цааш нь дуу
ямар чанар байхыг хүсч байгаагаас хамаараад классууд хэрэгжүүлнэ.
-28-
С.Ууганбаяр
JAVA програмчлал
Интерфэйс дэх final ба static хувьсагчид, методууд нь түүнийг хэрэгжүүлэх
классд харагдаж (нээлттэй) байхын тулд public – аар зарлагддаг. Классын
тодорхойлолт нь inplements түлхүүр үгийг хэрэглэнэ. Доор интерфэйс яаж
хэрэглэгдэхийг харуулав.
Interfase < interfase – name >
{
// тогтмолууд
// метод prototypes
{
class <class – name > inplements <interfase - name>
{
// хувьсагчид
// классын методууд
// интерфэйсийн методууд
}
Итерфэйсийг хэрэгжүүлж байгаа класс нь түүн дэх бүх метод prototype- уудыг
дарж тодорхойлох ёстой. Энэ нь ямар нэгэн класс Lettover (өмнөх классаар
дарж тодорхойлогдоогүй методууд) методуудыг дарах хүртэл. Класс нь зөвхөн
дан суурь классаас удамшдаг боловч олон интерфэйсийг хэрэглэж болно. Энэ
тохиолдолд классын тодорхойлолт дараах байдалтай:
Class <class - name> inplements <interfase – name 1>, <interfase – name 2>
{
// хувьсагчид
// классын методууд
// интерфэйс методууд 1
// интерфэйс методууд 2
}
Дараах жишээг авч үзье, ажилчдын цалинг тооцоолох , Товчлоод, цалин нь
дараах хэсгүүдтэй гэж авъя. Үндсэн цалин, ажлын байрны тэтгэлэг, НRA,
татвар шагнал, нэмэгдэл, нийт цалин. Мөн сарын энэ цалин нь шагнал өгөх,
жилийн амралтын шагналыг хэвлэх эсэхийг шалгана. Одоо програмын
зохиомжийн асуудал дээр анхааръя.
2класс байна, худалдагч, менежер кассууд. Энэ хоёр классын хувьд цалин
тооцоолоход зарим нийтлэг шинжүүд байна. Тэдгээр нь HRA, шагнал, нэмэгдэ,
татвар, нийт цалинг тооцоолоход хоёуланд хэрэгтэй методууд. Мөн цалинг
тооцоолох үед эдгээр бүрэлдэхүүнүүдийг тодорхой үзүүлэх хэрэгтэй.
Тиймээс эдгээр методуудын prototype-г тодорхойлсон Calcpay гэж нэрлэгдэх
интерфэйс байгуулъя.
Дараа нь Clerk (худалдагч ) ба Manager (менежер) классууд энэ инэужфэйсийг
хэрэгжүүлнэ.
Хэрэв интерфэйсийн ямар нэг метод классын гадна үлдвэл тэр классын хувьд
цалин тооцоолж чадахгүй, учир нь уг класс абстракт болох бөгөөд абстракт
классын объектын үүсгэж чадахгүй. Мөн худалдагч, менежер кассууд нь
Employes гэсэн ерөнхийлсөн классаас удамшина.
Interfase Calc Pay
{
final status string company_Name = “Supersoft ltd”;
-29-
С.Ууганбаяр
JAVA програмчлал
public int calc_HRA () ;
public float calc_Tax ();
public float calc_Bonus ();
public float calc_Super_Animation ();
public float calc_Gross ();
}
class Employse
{
protected int e_id;
string ename;
protected int basic;
Employse (int meid, String name, int mbasic)
{
e_id = meid;
ename = name;
basic = m basic;
}
}
class Clerk extends Employle implements CalcPay
{
Clerc (int seid, String sname, int sbasic)
{
super (seid, sname, sbasic);
}
public int calc_HRA ()
{
if (basic < 1000)
return (500);
else
return (900);
}
public float calc_Tax ()
{
float ani_sal = basic + calc_HRA () + calc_super_animation();
if (ani_Sal > 60000)
return ((float).10*ani.sal);
else
return 0;
}
public float calc_Bonus()
{
return ((float).08 * basic) ;
}
public float calc_Super.Animation()
{
return (0);
}
public float calc _Gross()
{
return (basic + calc_HRA () + calc_Bonus () – calc_Tax () );
-30-
С.Ууганбаяр
JAVA програмчлал
}
void print.Solary ()
{
System.out.println (“  n ” + Calcpay.companyName);
System.out.println (“ Employse Number :” + e_id)
System.out.println(“EmployseName :” + ename );
System.out.println(“Basicsolary :” + basic);
System.out.println(“HousePentAllowance: ” + calc_HRA());
System.out.println (“Bonus : ” + calc_Bonus() );
System.out.println (“Taxation : ” + calc_Tax () );
System.out.println (“ Cross Solary : ” + calc_Gross () );
System.out.println (“ ………………………………….th “);
}
}
Class Manager extends Employse implements Calc Pay
{
Manager (int seid, String sname, int sbasic)
{
super (seid, sname. sbasic);
}
public int calc_HRA ()
{
if (basic < 6000)
return (3500);
else
return (5500);
}
public float calc_Tax ()
{
float ann_Sol = basic + calc_HRA() + calc_Super_Animation ()
if (ann_sol > 130000)
return ((float).30*ann.sol);
else
return ((float).20*ann.sol);
}
public float calc_Bonus ()
{
return (0);
}
public float calc_super_Annmation ()
{
return ((float).15-basic);
}
public float calc_Gross ()
{
return (basic + calc_HRA () +calc_Super_Annmation () –calc_Tax () );
}
void print_Solary ()
{
System.out.println (“ ” + CalcPay.company Name);
-31-
С.Ууганбаяр
JAVA програмчлал
System.out.println (“ Employse Namber : ” + e_id );
System.out.println (“Employse Name : ” + ename );
System.out.println (“Basic Solary : ” + basic);
System.out.println (“House Rent Allowance : ” +calc_HRA () );
System.out.println (“Taxation : ” + calc_Tax () );
System.out.println (“Superamnation : ” + calc_Super_Amnation ());
System.out.println (“Gross Solary : ” + calc_Gross () );
System.out.println (“……………………………………….n ”);
}
}
public class Payship
{
public static void main (String args [ ] )
{
Clerk c1=new Clerk (3648, “Vinay Sharma” , 800);
c1.print_ Solary ();
Manager m1 =new Manager (2619, “S.K Lal” , 7000);
M1.print_Solary ();
}
}
Интерфэйс нь өөрийн хувийг үүсгэж чадахгүй. Жнь: ifase гэсэн нэртэй
интерфэйс байгаад ‘Ifase ofj 1= new Ifase ()’ гэж хэлж болохгүй. Гэхдээ ‘Ifase
obj1=new Class1’ нь Class 1 Ifase-г хэрэгжүүлсэн класс байх үед зөв болох юм.
Энэ бол runtime полиморфизмийн хамгийн зөв хэрэгжилт юм.
Интерфэйсийн өөр нэг онцлог бий. Дараах жишээг үзье:
Inforfase Ifase
{
public void show ();
}
class A implemens Ifase
{
public void show ()
{
system.out.println (“a”);
}
}
public class B
{
public staic void main (String args [ ])
{
Ifase obj1=new A();
{
public void show ()
{
system.out.println (“c”);
}
}
-32-
С.Ууганбаяр
JAVA програмчлал
obj1.show ();
obj2.show ();
}
}
Дээрх жишээнд Ifase интерфэйс нь show () нэртэй методтой байна. Энэ
интерфэйс дараа нь ‘А’ классаар хэрэгжиж байна, түүний show () методыг дарж
тодорхойлж байна. ‘А’ классд ‘Ifase obj1=newA ()’ бичиглэлийг ашиглан ‘А’
классын объектыг үүсгэж байна. Тэгээд үүнийг интерфэйсээр зааж байна
гэдгийг илэрхийлнэ. Ийм замаар та интерфэйсийн тусламжтай динамик
полимерфизмд хүрнэ.
Дараагийн хэсэгт ‘new Ifase ()’-н ардаас бие бичсэн байна. Дахин хэлэхэд энэ
бичиглэл нь интерфэйсийг хувилаж байгаа бус, гэхдээ энэ интерфэйсийг
хэрэгжүүлэх нэргүй объектыг үүсгээд хаалтан дотор show () методыг дарж
тодорхойлж байна. Хэрэв энэ биеийг авч хаяж цэгтэй таслал тавибал интерфэйс
өөрийн хувийг үүсгэж болохгүй гэсэн алдааны мэдээллийг өгнө.
3.4 Пакет гэж юу вэ? (Package)
Пакет гэдэг нь үндсэндээ классуудыг бүлэглэж нэгтгэсэн нэр юм. Эдгээр
классуд нь тохиромжтой зөв замаар удирдагдана. Энэ нь катологи дотор
хадгалагддагтай бараг адилхан ойлголт юм.
3.4.1 Өөрийн пакет үүсгэх
Пакет үүсгэхийн тулд та пакетэд хамаатай түвшнүүдийг ойлгох хэрэгтэй.
Пакетууд классын гишүүдийн хоорондох үзэгдэх байдлын 4 категорт
хуваагдана.
• Ижил пакет дахь sub классууд
• Ижил пакет дахь sub бус классууд
• Ялгаатай пакет дахь sub классууд
• Sub классууд эсвэл ижил пакет дахь классууд
Энэ хамаарлыг дараах хүснэгтэд үзүүлэв.
private default protected Public
Ижил класс Yes Yes Yes Yes
Ижил пакет
Sub класс No Yes Yes Yes
Ижил пакет
Sub бус класс No Yes Yes Yes
Ондоо пакет
Sub класс No No Yes Yes
Ондоо пакет
Sub бус класс No No no Yes
Ижил классын элементүүдийн бүх хандалтууд байна. ИЖил пакет дахь sub
классуудын хувьд суурь классын зөвхөн private гишүүд л sub классуудад
харагдахгүй. Ижил пакет дахь sub бус классуудын хувьд, классын зөвхөн private
-33-
С.Ууганбаяр
JAVA програмчлал
гишүүд л бусад класст харагдахгүй. Хэрэв та өөр пакет дахь классаас
удамшуулах sub классуудыг үүсгэвэл private ба default гишүүд рүү хандаж
чадахгүй.
Хоёр классын жишээг авъя. Stack класс нь стекийг хэрэгжүүлдэг, Callstack
класс нь Stack классыг дууддаг. Энэ нь дан файлд байж болно, гэхдээ пакет
үүсгэхийн тулд тэдгээрийг тусдаа класс файлууд үүсгэе. Stack класс нь пакет
дотор, CallStack нь ердийн байдлаар. Mypackage нь бидний Stack гэж нэрлэх
пакетын хадгалах каталоги болно. Пакет үүсгэх алхамууд нь:
<drive :javasource filesmypackage> байдалтай бүтцийн каталоги үүсгэнэ. Энэ
тохиолдолд c:javasourcefilesmypackage (бүгд каталогиуд).
Callstack.java эх файл нь c:javasourcefiles каталоги дотор орших ба пакетыг
дуудна.
Stack.java класс файл нь c:javasourcefilesmypackage каталогит байрлана. Класс
файлд файлын нэртэй адил нэртэй, public хандалттай зөвхөн нэг класс байх
ёстой. Үлдсэн бусад классууд private г.м хандлагуудтай байж болно.
Stack.java файлд, хамгийн эхний мөр нь класс ямар пакетад хамаарахыг заах
package оператор байна. Энэ нь дараах байдлаар бичигдэнэ:
Package mypackage;
Энд Stack бол mypackage пакетэд хамаарах пакет (stack.class файлыг хадгалах)
юм. Пакетын зам нь автоматаар каталогын бүтэцтэй ижилээр үүсгэгддэг.
Stack.class файлыг байгуулахын тулд Stack.java-г хөрвүүлнэ. javasourcefiles
каталоги дахь Classtack.java файл руу сэлгэ.
Callstack.java-д импортлох бичлэгийг import.mypackage* байдлаар хий. Одоо
стек public класс нь ашиглагдаж, хуваагдаж болно.
Шинэ пакет нь хараахан Java орчинд харагдахгүй. Үүний тулд, classpath гэж
нэрлэгдэх системийн хувьсагчийг тохируулах хэрэгтэй. Энэ хувьсагчид
стандарт Java классууд мөн пакетуудыг агуулж буй каталогуудыг заадаг.
Үүнийг дараах байдлаар тохируулж болно:
Set classpath=.; c:Javaclasses; c:javasourcefiles
Үүнтэй адилаар, өөр пакетууд хаа нэг газар үүсгэгдэж болох бөгөөд програмдаа
дуудаж болно. Пакетууд дэх гадна харагдах классууд нь public хандалттай байх
ёстой. Default нь public-тэй төстэй байдлаар үйлчилдэг, гэвч пакетын гадна
адилгүй.
Пакет үүсгэх програмыг дор үзүүлэв:
Stack.java
Package mypackage;
Public class Stack
{
private int Stck [ ];
private int Stack_Ptr;
public Stack (int site);
{
Stck=new int [site];
Stack_Ptr=-1;
}
-34-
С.Ууганбаяр
JAVA програмчлал
public void push (int item)
{
if (stack_Ptr==Stck.lenth-1)
system.out.println (“Stack is fule”);
else
Stck [++Stack.Ptr]= item;
}
public int pop ()
{
if (Stack.Ptr <0)
{
system.out.println (“Stack underflow”);
return 0;
}
else
return stck [stack_Ptr--] ;
}
}
CallStack.java
Import mypackage.*;
Public class callstack
{
public static void main (String args [ ])
{
stack s1=new Stack (5);
for (int I=0; I<5; I++)
{
s1.push (i);
}
system.out.Println (“The stack contains”);
for (int I=0; I<5; I++)
{
system.out.println (s1.pop ());
}
}
}
Практик ажил: Оюутны элсэлтийн систем.
Асуудлын тавилт.
-35-
С.Ууганбаяр
JAVA програмчлал
SubjectCourse
Зур. Оюутны элсэлтийн Системийн классын диаграмм
Application Core optional
Applicant
Student
-36-
С.Ууганбаяр
JAVA програмчлал
Энд ОМТ (object Modelling Technique)-н тэмдэглэгээгээр диаграмм байгуулсан,
энд
Классын диаграмм нь систем дэх шаардлагатай классуд, тэдгээрийн хоорондын
хамаарлыг тэмдэглэдэг. Энэ системийг байгуулахын тулд бид тодорхой
байдлаар хялбарчилж үзье:
• Бүх курсын сүүлчийн хугацаа ижил
• Курс болгон дэх оюутны тоо 5 (гэхдээ сүүлд нь ихэсгэж болно)
• Бэлэн курсүүд нь “MDMC”, ”OCO”, ”C++” (өргөтгөж болно)
• Бэлэн хичээлүүд нь “C”, ”C++”, ”OOADS”, ”JAVA”, ”NT”, ”VNIX”, ”VB”,
”VC”, ”ORACLE ”
• 75%-ээс дээш эхний таван оюутан admitted.
Одоо зарим классууд, тэдгээрийн метод, атрибутуудыг тодорхойлъё.
Public class Subject {
String sname;
Subject (String name ){
This.sname=name;
}
}
subject.java код
public class CoreSubject extends Subject {
CoreSubject (String name) {
Super (name);
}
public void setName (String name) {
sname-name;
}
}
CoreSubject.java код. Subject классаас удамшсан
Public class OptSubject extends Subject {
OpmSubject (String name) {
Super (name)
}
public void setName (string name) {
Sname=name;
}
}
OptSubject.java код. Subject классаас удамшсан.
(үргэлжилнэ.)
Одоо классуудыг “college. Student” пакетад багтааж зохион байгуулъя.
Applicant классын методууд:
• Applicant (байгуулагч)
• Apply for course энэ метод нь Applicant классын courseName атрибутад
сонгосон курсын нэрийг онооно.
-37-
С.Ууганбаяр
JAVA програмчлал
• Select Optional Subjects энэ метод нь Applicant классын optional subject
атрибутад сонгосон сонгох хичээлийн нэрийг онооно.
• Get Functions нь шаардлагатай утгуудыг авна.
Класс Course-н методууд:
• Course (байгуулагч)
• Set antrance qualifications элсэх хамгийн бага түвшингийн хувийг тогтоох
• Set maximum students Курс дэх оюутнуудын хамгийн их тоог тогтоох
• Check course availibility Тус курс бэлэн эсэхийг шалгах
• Check entrance qualifications дамжуулсан дүн нь зөв тэнцэх эсэхийг шалгана.
• Set number of students enrolled Элссэн оюутнуудын тоог оноох
• Get number of students enrolled Элссэн оюутнуудын тоог авах
Өгүүлэмж классын методууд:
Receive өгүүлэмж объектын атрибутуудыг дамжуулсан утгуудаар
Approve өгүүлэмж Курс бэлэн эсэхийг шалгаад хэрэв бэлэн бол элсэх шаардлага
хангахыг шалгана, хэрэв зөв бол үнэн, үгүй бол худал утга
Package college. Student;
Import java.util.Date;
Public class Applicant {
String name;
String courseName;
String optSub;
Long result;
String address;
Applicant (String name, String add, Long res) {
This.name=name;
Address=add;
Result=res;
Course Name = name;
Optsub = mull;
}
public void apply forCourse (String selCourse) {
Course Name = selCourse;
}
public void SelectOptSubject (String oSub) {
opt Sub=oSub;
}
public String getCourse () {
return CourseName;
}
public String get OptSub () {
return optSub;
}
public void get AppDet (String sname, String add) {
sname=name;
address= add;
}
-38-
С.Ууганбаяр
JAVA програмчлал
public long getResult () {
return result. Long Value () ;
}
}
Applicant.java код
Package college.student;
Public class Course {
String name;
Static int num of St;
Static int ourr St;
Long qualPere;
CoreSubject cSub [ ];
OptSubject oSub [ ];
Course (String name, CoreSubject cS [ ], OptSubject oS [ ]) {
This.name=name;
CSub=cS;
OSub=oS;
}
public void setEEntranceQual (Long perc) {
qualPerc=perc;
}
public void SetMaxStudents (int uSt) {
numof=uSt;
}
public boolean check Course Avail () {
if ((curSt+1) < numofSt) {
return true;
}
else
return false;
}
public boolean checkEntrance Qual (Long perc) {
if (qualPerc.LongValue () > perc)
return false;
else
return true;
}
public void set CurrSt () {
// оюутан элсэх үед дуудагдана
curr St++;
}
public int getCurrSt() {
// оюутан элсэх үед дуудагдана
return curr St;
}
Course.java код
Package College.student;
-39-
С.Ууганбаяр
JAVA програмчлал
Public class Өгүүлэмж {
Static int apNum;
Applicant aplcnt;
Public void rcvAppl (Applicant a) {
ApNum++;
Aplcnt=a;
}
public boolean appApl(Course c) {
if (c.check CourseAvail () )
if (c. checkEntrancequal (aplcnt.getResult () ) )
return true;
else
return false;
else
return false;
}
}
Өгүүлэмж.java код
Үүнтэй төстэйгээр өмнө тодорхойлогдсон классууд мөн
package college.student;
мөрийг агуулна. Ингэснээр эдгээр классууд College.student пакетын нэг хэсэг
болно. Одоо бид эдгээр бүх классаа ‘College’ каталогын ‘student’ дэд каталогт
байрлуулна.
3.4.3 Зарим Java пакетууд
Програм зохиогч классууд, интерфэйсүүдийг агуулсан пакетуудыг үүсгэдэгтэй
адил Java чухал зорилтуудыг гүйцэтгэх үндсэн пакетуудыг агуулдаг.
JAVA пакет
Long util io applet awt net
Java. Long пакет Security Manager, System, Thrend г.м Java-н суурь классудыг
агуулдаг.
Java.util пакет нь Date г.м утилит классудыг агуулдаг.
Java.io пакет нь оролт/гаралтын үйлдлүүдэд зориулсан классуудыг агуулна.
Java.аплет пакетыг үүсгэх, удирдахад зайлшгүй хэрэгтэй үүргүүдийг бүхий …
-40-
С.Ууганбаяр
JAVA програмчлал
Java.awt : интерфэйс зохиомжлоход зориулсан GUI компонентуудыг агуулна,
Button, Label г.м
Java. Net : алсын сервер рүү холбох зэрэг сүлжээний үйлдлүүдэд зориулсан
классуудыг агуулна.
Лекц №7
Аплет гэж юу вэ?
4.1 Аплет-н тухай.
Аплет бол браузер дээр ажилладаг Java програм юм. Аплет ажиллах браузер нь
Java-н онцлогуудыг дэмжих ёстой. Microsoft IE, Netscape Navigator, Sun-н Hot
Java зэрэг нь хамгийн өргөн тархсан Java-enabled браузерууд юм. Java
програмууд нь нэг бол өгүүлэмж эсвэл аплет буй болдог. Applicatoin эсвэл
аплет-г хэрэгжүүлэх сонголт нь өгөгдсөн асуудлын хувьд бүхэлдээ хөгжүүлэгч
дээр төвлөрдөг. Нэгэн аплет Word wid, web дээр тавигдсан бол түүний хийж
болох зүйлүүдийг хязгаарлан олон хамгаалалт тавьж болно.
4.1.1 Өгүүлэмж –ээс Аплет-ийн ялгагдах нь
1. Аплет нь удамшигчийн (аплет-г үзэж буй хүн) машин дээрхи файлуудыг
дамжуулах, унших, бичих зэрэг үйлдлүүд хийж чадахгүй, хэрэв түүний
ашиглаж байгаа баузер нь хамгаалалтын өндөр хязгаарлалтуудтай бол.
Гэхдээ хамгаалалтын хязгаарлалтууд нь доогуур ба үл таних аплет-уудад
зөвшөөрөл өгсөн үед аплет y, уншигчийн машин дээрхи файлуудыг
ажиллуулж, уншиж, бичиж чадна.
2. Аплет нь ажиллаж байгаа сайтаасаа өөр ямар нэгэн сайттай харилцаж
чадахгүй.
3. Аплет нь уншигчийн машинаас сангууд ба биелэх файлуудыг зэрэг
програмуудыг ачаалж чадахгүй.
4. Аплет нь ажиллахын тулд браузер хэрэгтэй. Тиймээс, энэ нь өгүүлэмж-аас
аплет-г биелүүлэхэд удаан байна. Аплет-д хэрэглэгдэх нийт санах ойн
хэмжээ нь браузерээр шийдэгддэг харин өгүүлэмж-д ийм хязгаарлалт
байхгүй.
4.1.2 Аплет-н амьдралын цикл
Аплет-г яаж үүсгэдэг, яаж ажиллуулдагыг 1-р бүлэгт үзсэн. Аплет нь биелэхийн
тулд HTML бүрхүүлийг шаарддаг. Өгүүлэмж нь main () програмыг агуулдаг.
Аплет-д main () функц байхгүй. Аплет-д ялгаатай хугацаануудад биелж байдаг
хэд хэдэн метод байдаг. Дараах зурагт аплет-н хамгийн чухал 5 методыг
үзүүлэв. – init(), start(), stop (), destroy (), paint (),
Аплет ачаалагдсан
-41-
С.Ууганбаяр
JAVA програмчлал
init
start
Initialization
Аплет санах ойд ачаалагдсан үед init () функц дуудагдана. Энэ функц нь аплет-
н эхлэх шинжүүдийг тогтоодог. Та энд фонт тохируулах, зураг ачаалах,
хувьсагчид ба параметрүүдийн утгуудыг тогтоож болно. Аплет-д өөрийн
хүсч байгаа боломжийг олгохын тулд init () методыг дарж тодорхойлох ёстой.
Public void init () {
// шаардлагатай кодыг бичнэ.
}
Эхлүүлэх
Энэ үе нь аплет ишицилиазлагдсаны дараа эсвэл хэрэглэгч браузер дээр уг
аплет-г агуулсан хуудас руу буцааж ирэх үед тохиолддог. Initialization ба эхлэл
хоёрын хоорондох үндсэн ялгаа бол initialization нь зөвхөн нэг удаа хийгддэг,
харин эхлэл нь аплет-д олон тооны удаа хийгдэнэ.
Энэ шинжийг дээрхи зурагт харуулсан. Та аплет-д өөрийн ажилбаруудыг
оруулахын тулд start () функцийг дарж тодорхойлох хэрэгтэй.
Public void start () {
// шаардагатай кодыг бичнэ.
}
Зогсоох
Stop ( )
Paint ( )
Destray ( )
-42-
С.Ууганбаяр
JAVA програмчлал
Stop () метод нь уг метод руу илээр дуудах үед эсвэл хэрэглэгч аплет-н
ажиллаж байгаа тухайн хуудсыг орхих үед дуудагддаг. Мөн stop () методыг
дарж тодорхойлж болно.
Public void destroy()
<
// шаардлагатай кодыг бичнэ.
}
Устгах
Destroy () метод нь аплет-д ашиглагдсан ой чөлөөлөгдөх эсвэл хэрэглэгч
браузерээс гарах үед дуудагддаг. Мөн destroy () –г дарж тодорхойлж болно.
Public void destroy ()
{
// шаардлагатай кодыг бичнэ.
}
Зурах
Paint () метод нь аплет-д дурын тооны удаа дуудагддаг. Энэ метод нь текст,
график, зураг г.м-г дүрслэх үүрэгтэй. Paint-г дарж тодорхойлж болно. Энэ
функц нь Graphics төрлийн объектыг хүлээн авдаг, тиймээс та аплет- д awt
пакетын Graphics классын импортлох ёстой.
Public void paint (Graphics -д) {
// шаардлагатай кодыг бичнэ.
}
4.1.3 Аплет үүсгэх
Дараахь энгийн аплет-г үзье. Энэ аплет нь фонт объектыг ашиглан тэмдэгт мөр
хэвлэдэг.
Import Java awt.Font
Import Java awt.Color
Import Java awt.Graphics
Public class Try Аплет extends java. Аплет. Аплет {
Font f=new Font (“Garamond”, Font.BOLD+Font. ITALIC, 30);
Public void paint (Graphics g) {
g. set Font (f);
g.set Color (Color.blue);
g. draw String (“My firest Аплет”, 10,40);
}
}
Try Аплет.java
Font.Bold ба Font.ITALIC тогтмолууд нь Font класс дотор g,blue нь Color классд
зарлагдсан тогтмол.
Энэ аплет-г дараах байдлаар HTML файлд суулгая.
<html>
<title> Tosting Аплет </title>
</hend>
<body>
<p> энэ бол анхны аплет
-43-
С.Ууганбаяр
JAVA програмчлал
<br>
<аплет code = “TryАплет.class” width=400 height =200 >
Хэрэв таны браузер Java-г дэмжихгүй бол энэ хэвлэгдэнэ.
</ аплет >
</ body >
</ html >
Мөн түүнчлэн та аплет-г аплетviewer програмыг ашиглан ажиллуулж
болно. Үнэндээ энэ бол өнөөдөр олонхи браузерууд Java 2-н онцлогыг
дэмжихгүй байгаа үед аплетviewer –г ашиглах зөв зам юм. Аплетviewer <html
file name >.
4.1.4 Аплет tag-н атрибутууд
Аплет tag-н зарим чухал атрибутуудыг үзье. CODE tag нь биелэх java аплет
файлын нэрийг авдаг, WIDTN нь аплет-н өргөн, HEIGHT өндөр. Эдгээр
атрибутуудаас гадна өөр чухал атрибутууд <Аплет > tag-д хэрэглэгддэг.
CODEBASE
Энэ нь CODE атрибуттай хамт заагдаж болох заавал байх албагүй атрибут.
CODE атрибут нь аплет-н үндсэн класс файлын нэрийг заадаг бол CODEBASE
нь класс файлын байрлалыг заадаг. CODEBASE заагдаагүй үед аплет-г агуулж
буй HTML файлтай адилхан байрлалд класс файлыг хайдаг. Дараах код нь
үндсэн каталоги дахь Java Files нэртэй folder-с TryАплет.class файлийг
ачаална. <Аплет code = “TryАплет.class” codebase = “ / Java Files” height =
300 width=300 >
< / аплет >
ALIGN
Энэ атрибут нь аплет нь хуудасны бусад хэсгүүдэд яаж цэгцлэгдэхийг заадаг.
ALIGN атрибут нь ALIGN = <value> командаар өгөгдөж тогтоогддог, авч болох
утгууд нь:
LEFT – аплет-г түүнийг заасан текстийн зүүн талд цэгцэлнэ.
RIGHT - аплет-г түүнийг заасан текстийн баруун талд цэгцэлнэ.
TEXTTOP – аплет –н дээд ирмэгийг өндөр текстийн оройтой
чацуулна.
TOP – аплет-н дээд талыг том зүйлүүдийн (текст, зураг, эсвэл өөр
аплет г.м) дээд ирмэгтэй чацуулна.
ABSMIDDLE – аплет-н дунд хэсгийг том зүйлийн дунд хэсэгтэй
чацуулна.
MIDDLE – аплет-н дунд хэсгийг текстийн дунд хэсэгтэй чацуулна.
BASELINE or BOTTOM – аплет-н доод хэсгийг текстийн доод хэсэгт
чацуулна.
ABSBOTTOM – аплет-н доод хэсгийг жижиг зүйлийн шугамтай
чацуулна.
HSPASE ба VSPACE
-44-
С.Ууганбаяр
JAVA програмчлал
Эдгээр атрибутууд нь аплет ба түүнийг хүрээлсэн текстийн хоорондох хэвтээ,
босоо зайг тохируулдаг. Энэ зай нь цэгээр тооцогдоно.
Жнь:
<аплет code = “Trytinyj.class” width=60 heigth=50 hspace=20 vspace=20 >
</аплет >
4.2 Аплет-д параметр дамжуулах
Аплет-г браузер дээр ажиллуулахад класс файлын нэрийг АПЛЕТ tag-н CODE
атрибутад зааж өгдөг. Дараах жишээг авъя. Хэвлэгдэх текстийн хэмжээ нь
өөрчлөгдөнө гэж үзье. Ийм тохиолдолд өөрчлөлтийг java файлд хийж, файл
дахин хөрвүүлэгдэж болно. Энэ нь хэрэв текстийн хэмжээ буюу текст
зохиомжлох үед мэдэгдэж байгаа бол тохиромжтой, гэвч ажиллаж байх үед
өөрчлөлт хийх хийх болвол яах вэ? Энэ байдал нь програмд командын мөрийг
аргументын тусламжтай удирдагддаг. Үүнтэй төстэй, аплет –д параметрүүдийг
HTML файлаас дамжуулж болох бөгөөд эдгээр параметрүүдийг аплет хүлээж
авч болно.
Параметрүүд нь HTML файлаас PARAM tag ашиглан дамжигддаг. PARAM tag
нь <аплет > ба </ аплет > tag-уудын дотор хооронд заагдах ёстой. PARAM tag
нь 2 атрибут авдаг. NAME (параметрийн нэр) ба VALUE (түүний утга). Дараах
HTML код нь TryАплетParam.class аплет руу Site параметрийг 30 утгатайгаар
дамжуулу байна.
<аплет code = “TryАплетParam.class” width=400 height=200 >
<param name = site value =”30” >
</аплет >
Аплет файлд параметрүүд нь getParameter () методыг ашиглан хандаж болно.
Параметрийн утга нь String төрлөөр өгөгдөх ёстой. Дараах програмд хэрэв
параметр заагдсан бол Site –н утгаар, үгүй бол 44 хэмжээтэйгээр текстийн
хэмжээг тогтоож байна.
Importjava.awt.Font;
Importjava.awt.Color;
Importjava.awt.Graphics;
Public class TryАплетParam extends java.аплет.Аплет {
Font f;
Int s;
Public void init () {
String textsite;
Textsite = getParameter () (“site”)
If (textsite == null)
S=44;
Else
S= Integer.parse_Int (textsite);
}
public void paint (Graphics g) {
f=new Font (“Garamond”, Font.BOLD, S);
g.set Font (f);
g.set Color (Color.blue);
g.drow String (“My first Аплет”, 10, 40);
-45-
С.Ууганбаяр
JAVA програмчлал
}
}
Аплет нь мөн програм шиг ажиллаж болдог.
Лекц №8
4.3 Graphics
Бид аплет-н paint методыг үзсэн. Та тэгш өнцөгт, шулуун, дугуй, олон өнцөг,
бусад график объектуудыг мөн зурж болно.
Аплет дэх график объектуудыг координатын систем нь математик координатын
системтэй мөн адилхан. Гэхдээ хэмжих нэгж нь цэг бөгөөд бүх цэгэн утгууд нь
бүхэл тоонууд
0, 0 Х өснө
Дэлгэц буюу Monitor
Y өснө
4.3.1 Шулуун зурах
A (x1, y2), B (x2, y2) цэгүүдийг холбосон шулуун зурахад
g.drawLine (x1, y1, x2, y2)
командыг өгнө.
4.3.2 Тэгш өнцөгт зурах, будах
g.drawRect (10,40,200,100) нь (10, 40) цэг дээр зүүн дээд өнцөг нь байрласан
100 өндөр, 200 өргөнтэй тэгш өнцөгт зурна. FileRect () нь тэгш өнцөгтийг
будахад хэрэглэгддэг.
Дугуйрсан тэгш өнцөгт зурахад drawRoundRect (), file RoundRect () –г
ашиглана.
4.3.3 3D тэгш өнцөгт зурах, будах
Draw 3dRect (), Sill 3dRect ()
g.draw3dRect (10,20,200,100, true) . сүүлчийн утга нь тэгш өнцөгт нь
төвийсөн байх эсэхийг зана.
4.3.4 Олон өнцөгт зурах, будах
-46-
С.Ууганбаяр
JAVA програмчлал
DrawPolygon (), fillPolygon () drowPolygon() нь 2 байдлаар дуудагдаж
болно:
DrawPolygon (int x [ ], int y [ ], int n)
x, y нь массивууд нь x, y , нь оройн тоо
drawPolygon (Polygon p)
Жнь: int x [ ] = { 20, 20, 70, 120 };
Int y [ ] = { 20, 150, 200, 150 };
L=x.length;
Polygon p=new Poligon (x,y,l);
p.addPount (1208 20);
g.arowPolygon (p);
Хоёр дахь методыг ашиглахын давуу тал нь олон өнцөгтийг зурахаас өмнө
addPoint()-г ашиглан оройнуудыг нэг нэгээр нь нэмэх боломжтой.
4.3.5 Тойрог, муруй зурах, будах
Draw Oval (), fillOval (). Дугуй өндөр, өргөн ижил үед тойрог болно.
g.draw (20, 20, 100, 100) нь (20,20) дээрээс эхэлсэн 100 талуудтай тэгш
өнцөгтөд багтааж тойрог зурна.
4.3.6 Нум зурах, будах
Нум нь хагас дугуй юм. Drow Arc (), file Arc () методуудыг ашиглан нум
зурдаг.
g.draw Arc (20,20,100,20,0, -180) нь (20,20) цэгээс 100 өргөн, 20 өндөртэй
тэгш өнцөгтөд 0 өнцгөөс эхлэн цагийн зүүний эсрэг 180о
тойруулж нум зурна.
-47-
С.Ууганбаяр
JAVA програмчлал
4.3.7 Бүгдийг нь хамтад нь бичвэл
Import java. awt.Font;
Import java. awt.Color
Import java. awt.Graphics;
Import java. awt.Polygon;
Public class Drawsmiley extends java.аплет.Аплет {
Public void paint (Graphics g) {
Font f = new Font (“Times Roman”, Font.PLAIN, 30);
SetBackground (Color.pink); // дэвсгэрийг pink болгож байна.
// текст бичих
g.setFont (f);
g.setColor (Color.red);
g.draw string (“smiley”, 80,50);
// текстийг хүрээлсэн дугуйрсан тэгш өнцөгт зурах
g. setColor (Color.block);
g.drawRoundRect (78,24,90,35,20,20);
// нүүрний гадна талыг зурах
g. setColor (Color.yellow);
g.filloval (100,100,200,200);
// нүд зурах
g. setColor (Color.black);
g.filloval (140,140,30,30);
g.filloval (225, 140,30,30);
// хамар зурах
g.drawline (200,180,200,220);
// ам зурах
g.drawArc (170.230,60,20,180,180);
// текст бичих
f=new Font (“TimesRoman”, Font. PLAIN, 24);
-48-
С.Ууганбаяр
JAVA програмчлал
g.setFont (f );
g.setColor (Color.red);
g.drawstring (“Hi !! I’m smiley” , 335, 60);
// текстийг тойруулж муруй зурах
g.setColor (Color.yellow);
g.draw Oval (328, 24,170,50);
// гурвалжин дүрс зурах
int x [ ] = {327,260,340};
int y [ ] = {50,120,70};
int l = x.length;
Polygon p = new Polygon (x,y,l);
g.fill Polygon (p);
}
}
4.4 Шрифт ба өнгө
Бид өмнө бичсэн програмуудад Font ба Color объектуудыг ашиглаж байсан.
Font объект үүсгэхийн тулд шрифтийн нэр, хэв маяг, хэмжээг заах хэрэгтэй.
Шрифтийн хэв маяг нь Font классын BOLD, ITALIC, PLAIN хувьсагчаар
тодорхойлогддогв Өөр хэв маягууд гаргаж авахын тулд эдгээрийг хослуулан
хэрэглэж болно: Font.BOLD+ Font.ITALIC
Font классын методууд:
• get Name () – шрифтийн нэрийг авах
• get Site () - хэмжээ
• get Style () – хэв маяг
• is Bold () – Bold бол үнэн
• is Italic () – Italic бол үнэн
• is Plain () – Plain бол үнэн
4.4.1 Текст зурах
Текст зурах үед зарим энгийн ухагдахуунуудыг мэдэх хэрэгтэй, үүнд baseline,
ascent, descent, loading
• Baseline – энэ нь текст байрлах шугам
• Ascent нь baseline ба тодорхой тэмдэгтийн доод хязгаар хоорондох зайв
Зарим тэмдэгтүүд бусдаасаа илүү ascent-тэй байдаг. Жнь: I нь a-ээс илүү
ascent-тэй.
-49-
С.Ууганбаяр
JAVA програмчлал
• Descent нь baseline –аас доош хэр хэмжээтэй тэмдэгт өргөтгөгдөхийг
тодорхойлно. G. j г.м тэмдэгтүүд descent-тэй байдаг (ө.х доошоо
зурагддаг).
• Hading гэдэг нь эхний мөрийн Descent ба дараагийн мөрийн ascent
хоёрын хоорондох нийт зай.
Мөн тэмдэг эсвэл байтуудыг зурахад draw Chars () ба drawBytes() методуудыг
ашиглаж болно.
Draw Chars (char arr [ ], int offset, int totalnumchars, int x, int y);
Draw Bytes() метод нь эхний аргументаас бусад нь drawChars () – ихтэй ижил.
Эхнийх нь byte массив: draw Bytes (byte arr [ ], int offset, int totalnumbytes, int x,
int y);
4.4.2 FontMetris
Awt пакет дотор идэвхтэй шрифтийн тухай мэдээлэл авахад ашиглаж болох
FontMetris гэж нэрлэгдэх класс байдаг. Энэ мэдээлэлд тодорхой шрифттэй
тэмдэгт мөрийн өндөр, өргөн байж болно. FontMetris нь абстракт класс, тиймээс
энэ нь new операторыг ашиглан хувилагдаж болохгүй. Гэхдээ, өмнө байсан Font
объектоос getFontMetris () методыг ашиглан FontMetris объектыг үүсгэж болно.
Font f= new Font (“TimesRoman”, Font BOLD, 36);
FontMetris fm= get FontMetris (f);
String s= new String (“Testing FontMetris”);
Int h= fm.getHeight ();
Int sw= fm.StringWidht (S);
Энд s объектын өргөнийг StringWidth() метод ашиглан цэгээр тооцоолж байна.
getHeigth методын тусламжтай энэ FontMetrics-н өндрийг олж болно.
Мөн FontMetrics-н зарим чухал методууд:
• Get Ascent()
• Get Leading ()
• Get Height ()
• Ascent +descent+leading space нийлбэр бүхэл тоон утгыг буцаана.
• Get Max Ascent()
• Хамгийн их ascen-г олох
• Get Max Descent ()
Тэмдэгтийн өргөн гэдэг нь тэмдэгтийн эзлэх зай
ба түүний арын сул зайн нийлбэрийн тэмдэг.
Өргөнийг мөн Advance гэдэг. Тэмдэгтийн өргөнтэй холбоотой чухал методууд:
• char Width() нэг тэмдэгтийг аргумент болгон авах ба уг тэмдэгтийн
өргөнийг буцаана.
• GetMax Advance () тодорхой нэг шрифлэгдэх дурын тэмдэгтийн хамгийн
их advance.
• String Width() тэмдэгт мөрийг аргумент болгон авах ба түүний нийт
өргөнийг буцаана
• Char Width () 3 аргумент авдаг: тэмдэгт массив, offset утга, нийт
тэмдэгтийн тоо
• Bytes Width () 3 аргумент авдаг: тэмдэгт массив, offset утга, нийт
тэмдэгтийн тоо
-50-
С.Ууганбаяр
JAVA програмчлал
• Get Widths() шрифт дэх эхний 236 тэмдэгтийн хувьд өргөнүүдийн
массивыг буцаах
4.4.3 Өнгө
Color объект нь олон замаар үүсч болно:
• RGB утгуудыг дүрслэх 0.0-c 1.0 хоорондох бодит тоонуудаар
Color c = new Color (0.01 F, 0F, 1F);
• 0-с 255 хоорондох RGB –г төлөөлөх бүхэл тоонуудаар
Color c = new Color (64,64,64);
• Зөвхөн нэг том бүхэл тоогоорь энд 16-23 бит нь улаань 8-15 нь
ногоон, 0-7 нь цэнхэр өнгийг тодорхойлно.
Color c = new Color (434);
// улаан 1 орцтой, ногоон 1, цэнхэр 178 орцтой өнгийг
тодорхойлно.
Улаан, ногоон, цэнхэр орцуудыг өөрчлөн зааж янз бүрийн өнгүүд үүсгэж болно.
Color класс нь өмнө тодорхойлогдсон өргөн ашиглагддаг өнгүүдтэй байдаг
бөгөөд тэдгээр нь Color классын тогтмолууд байдлаар байдаг. Дараах хүснэгт
Color классын бүх тогтмол, тэдгээрийн RGB орцыг үзүүлэв.
Тогтмолууд Дүрсийн өнгө Улаан Ногоон Цэнхэр
Black Хар 0 0 0
Blue Цэнхэр 0 0 255
0 255 255
Dark Gray Хүнд саарал 64 64 64
Gray Саарал 128 128 128
Green Ногоон 0 255 0
Eight Gray Гэгээтэй саарал 192 192 182
Magenta Magenta 255 0 255
Orange Улбар шар 255 200 0
Pink Ягаан 255 175 175
Red Улаан 255 0 0
White Цагаан 255 255 255
Yellow Шар 255 255 0
4.5 Аплет –д зураг оруулах
Зураг бол ямарч Web програмын нэг чухал хэсэг. Java нь зургийг
боловсруулахад Image классыг ашигладаг. Web дээр байрлалтай хадгалагдсан
зургийг дүрслэхийн тулд та юуны түрүүнд тэр байрлалаас нь зургаа авах ёстой.
Үүний тулд танд тэр байрлалын зам хэрэгтэй болно. Энэ зам бол тэр зургийн
Web хаяг ба Web хаяг Java-д URL (Uniform Resource Locator)-аар дүрслэгдэнэ.
Зурган файлын хаягыг агуулах URL объект үүсгэж болно. Жнь: зураг
http://www.sun.com/images сайт дээр хадгалагдаж байгаа зургийн нэр balloon.gif
бол URL объект дараах байдлаар үүсгэгдэх болно:
URL u1= new URL (http://www.sun.com/images/balloon.gif);
-51-
С.Ууганбаяр
JAVA програмчлал
URL объектыг үүсгэсэн цагт уг байрлал дах зургийг авах Image объект үүсгэж
болно. Аплет классын getImage () метод нь үүний тулд 2 байдлаар хэрэглэгддэг:
• GetImage (URL)
URL төрлийн нэг аргумент авах ба энэ нь Web дэх зурган файлын
байрлал ба нэрийг агуулна.
• Get Image (URL, String)
Эхнийх нь файлын замыг агуулах URL , хоёр дах нь файлын өөрийн нэр
Дараах жишээнд http://www.sun.com/images байрлалаас balloon.gif-г ачаалах код
байна.
URL u1= new URL (http:// new.sun.com/images/balloon.gif );
Image img=getImage (u1);
Эсвэл
URL u1=new URL (http:/www.sun.com/images);
Image img= getImage (u1,”balloon.gif”);
Ерөнхийдөө аплет-тэй холбогдсон зургууд нь аплет ачаалагдсан Web хаягийн
дэд каталоги эсвэл ижил ккаталогит хадгалагдаж байдаг. Тийм тохиолдолд
тухайн аплет-н web хаяг маш чухал болдог. Аплет класс нь тухайн аплет –н вэб
хаягыг буурах 2 методтой болгодог.
GetDocument Base()
Аплет-г агуулсан документын URL –г буцаана. Жнь: та
http://www.sun.com/аплетs –с try аплет.html файлыг ажиллуулж байгаа бол энэ
метод нь http://www.sun.com/аплетs/tryАплет.html вэб хаягыг төлөөлөх URL
буцаана.
Get Code Base ()
Энэ нь аплет-н өөрийн URL-г буцаанав Жнь: Хэрэв та tryАплет.class apple-г
http://www.sun.com/аплетs вэб хаягыг дүрслэх URL-г буцаана.
Одоо дараагийн алхам бол зургийг дүрслэх. Graphics классын drawImage()
метод нь зургийг дүрслэхэд ашиглагддаг. Энэ метод олон янзаар хэрэглэгддэг.
Хамгийн тохиромжтой хэрэглэх замуудыг доор үзүүлэв.
4.5.1 Зургийг түүний эх хэмжээгээр дүрслэх
Энэ тохиолдолд drawImage () метод 4 параметр авна- дүрслэгдэх Image объект,
х,у координат, Image Ob server классын объектын заана. Энэ Image Ob server
объект нь зураг ачаалах үед алдаа гарах буюу зураг ачаалахад удаан хугацаа
орох үед зургийн замыг хадгалж байдаг. Аплет ImageObserver классыг
хэрэгжүүлсэн тохиолдолд 4 дэх параметрт this –г дамжуулж болно.
This түлхүүр үгийн тусламжтай аплет нь зураг ачаалагдаж байх үед түүний
замыг хадгалж чадна. Дэвсгэр өнгийг заавал зааж байх албагүй нэг параметр
мөн х,у координатын дараа тавигдаж болно. Дараах кодын хэсэг нь зургийг
ачаалсны дараа нь түүнийг цэнхэр өнгийн дэвсгэртэйгээр эх хэмжээгээр нь
дүрсэлж байна.
Import java.awt.Image;
Import java.awt. Graphics;
Import java.awt. Color;
-52-
С.Ууганбаяр
JAVA програмчлал
Public class Draw Image exttends java.аплет.Аплет {
Image img;
Public void init() {
Ing=getImage (get Code Base (), “Christinas Troes.gif”);
}
public void paint (Graphics g) {
int w= ing.get Width (this);
int h= ing.getHeight (this);
g.draw Image (img, 200,10 w/2,h/2, Color.blue, this);
4.6 Аплет-д дуу оруулах
Зураг, текст дүрслэх үед зарим тохиолдолд аплет-д зайлшгүй дуу авиа нэмэх
хэрэгтэй болдог. Дуу авиа нэмснээр аплет-н чадварыг нэмэгдүүлдэг. Дээхэн үед
зөвхөн .AU файлууд л аплет-д нэмж болдог байсан, харин Java 3 Plotform- д
.WAV, .AU, .AIFF, .MIDI, .RMF форматтай дууны файлуудыг нэмж болдог. Java
нь AudioClip гэж нэрлэгдэх абстракт классаар хангадаг. Энэ класс нь audio
файлуудыг ачаалах, толуулах, зогсооход ашиглагдах хэд хэдэн методуудтай.
Get AudioClip() метод нь аплет-д авиа файлыг ачаалахад хэрэглэгдэх ба new
AudioClip() метод нь өгүүлэмж-д авиа файлын ачаалахад хэрэглэгддэг. Авиа
файлыг ачаалсны дараа play (), loop(), stop() методуудыг дуу тоглуулах, дууг
давтан үргэлжлүүлэн тоглуулах, шууд тоглохыг зогсооход ашиглаж болно.
Дараах код нь авиа файлыг ачаалж, тоглуулж байна.
Import java.awt.Graphics;
Import java.аплет.Audio clip;
Public class TrySound extends java.аплет.Аплет {
Audio Clip c1;
Public void init (){
C1=get AudioClip(getCodeBase(), “that.hurts.au”);
}
public void start () {
c1.play ();
}
}
4.7 Дэлгэцийн хуулах, цэвэрлэх
Graphics класс нь нэг мужаас нөгөө рүү тэгш өнцөгт мужийг хуулах copyArea()
методоор хангагдана.
Энэ метод нь 6 аргумент авдаг:
• Мужийн эх (x,y) координат
• Эх мужийн өндөр, өргөн
• Хуулахын өмнө шилжүүлж аваачих мужийн хэвтээ, босоо зай цэгээр
Дараах код нь (10,10) байрлал дахь зургийг дүрслээд дараа нь тэр зургийн
хувийг үүсгэж түүнийгээ copyArea() методоор дүрсэлж байна.
Import java.awt.Image;
Import java.awt.Graphics;
-53-
С.Ууганбаяр
JAVA програмчлал
Import java.awt.Color;
Public class CopyImage extends java.аплет.Аплет {
Image iny;
Public void init () {
Ing = getImage (getCodeBase(), “Christmas Trees.gif”);
}
public void paint (Graphics g) {
g.drawImage (ing,10,10, Color.blue,this);
int w=iny.get Width (this);
int h= ing.get Height (this);
g.copyArea (10,10, w, h, w+20,10);
}
Clear Rect () метод нь аплет цонхноос тэгш өнцөгт хэсгийг цэвэрлэхэд
хэрэглэгддэг. Энэ метод 4 аргументтай.
• Цэвэрлэх мужийн эхлэлийг (x,y) координат
• өргөн ба өндөр
g.clearRect (10,10,100,100);
Лекц №9
4.8 Java 2D-г хэрэглэх
Java 2D нь Graphic объектуудыг үүсгэх, удирдах классуудын олонлогоор
хэрэглэгчдийг хангадаг. Graphic объектууд нь awt эх пакетыг ашиглан
үүсгэгдэж, удирдагдаж болно. Гэвч эх awt нь тийм ч хүчтэй биш. Java 2D нь
график үйлдлүүдийг гүйцэтгэхэд маш сайн дэмжлэг үзүүлдэг.
Эх awt-н бүх олонлогоос гадна Java 2D нь мөн:
• Тусгай будах загваруудыг ашигладаг, жнь: уусалт, хээ
• Зурах графикуудын өргөн, загварыг нарийн заадаг.
• Объектуудын ирмэгүүдийг тасралтгүй болгоход Anti-cliasing-г ашигладаг.
Java 2D классууд нь java.awt пакетын боломжуудыг өргөтгөсөн байдаг, тиймээс
та хуучин классуудаа ашиглаж болох бөгөөд өөрийн өмнөх програмаа өөрчлөх
шардлагагүй.
4.8.1 График 2D объект
Өмнөхь paint () метод дахь бүх график үйлдлүүд Graphics объект дээр
хийгддэгтэй адил, бүх Java 2D үйлдлүүд Graphics 2D объект дээр хийгдэнэ.
Graphics 2D бол java.awt пакетын нэг хэсэгв paint() метод дэх Graphics
объектууд Graphics2D объект руу дараах байдлаар хувиргагдаж болно:
public void paint (Graphics g) {
Graphics2D g2D= (Graphics 2D) g;
// кодын байр
}
4.8.2 Java 2D дэх координатын систем
-54-
С.Ууганбаяр
JAVA програмчлал
Өмнө үзсэнээр awt –д дэлгэц нь pivel гэж нэрлэгдэх жижиг цэгүүдэд хуваагддаг.
График үйлдлүүд зөвхөн эдгээр цэгийг ашиглан хийгдэнэ. Энэ зохион
байгуулалт нь дэлгэц буюу монитор дээр сайн зохицно гэвч хэвлэгч дээр
тохирохгүй. Учир нь хэвлэгч бол монитороос илүү нягтралтай байдаг. Дэлгэц
дээр зурсантай ижил зургыг хэвлэгч дээр ижил тооны цэгүүдээр зурвал зураг
жижиг харагдана.
Энэ нь ялгаатай төхөөрөмжүүдийн хувьд зургуудын хэмжээ өөрчлөгдөн
зохицно гэсэн үг. Гэвч програм хөгжүүлэгч эдгээр асуудлуудыг хоёуланг нь
хүсээгүй байж болох юм. Java2D нь энэ асуудлыг төхөөрөмжийн координатаас
хэрэглэгчийн координатыг ялгаж шийдсэн.
Тиймээс хэрэглэгчийн координат дээрх цэг төхөөрөмжийн кординат дээрхээс
эрс ялгаатай. Иймээс Java2D нь хэрэглэгчийн координатын системийг
төхөөрөмжийн к/с рүү хэрхэн хөрвүүлэгдэхийг тодорхойлдог default
хувиргалтыг ашигладг.
Дэлгэцийн ба хэрэглэгчийн системийн хэмжээс адилхан учраас хэрэглэгчийн
координат дэлгэцийн координат руу солигдохгүй. Хэвлэгч дээр координатууд
солигдоно. Default хувиргалт нь хэвлэгчийн нэг inch-д хэрэглэгчийн системийн
72 цэгийг ашигладаг. Энэ нь (72,72) байрлал дээрх цэг нь
Эхлэлээс 1 инчийн баруун тийш, доошоо мөн 1 инч байрлалд хэвлэгдэнэ.
Хэрэглэгчийн систем дэх координатууд нь мөн бодит тоо байж болдог, энэ нь
цэгүүдээр Java2D –д координатуудыг дүрслэх боломжгүй юм.
4.8.3 Текст зурах ба өнгө тохируулах
Текст нь Graphics объектын тохиолдолтой ижил замаар зурагддаг, ө.х
drawString () методыг ашиглана. Гэхдээ drawstring () метод Graphics2D объект
дээр дуудагдах ёстой.
G2D.drawString (“Hello Word” , 10, 40);
үүнтэй төстэйгээр setColor методыг ашиглан өнгө тогтоож болно.
4.8.4 Ялгаатай дүрсүүд зурах
Awt API-тэй адилгүй нь ялгаатай объектуудыг (шулуун, тэгш өнцөгт г.м)
зурахад ялгаатай методуудыг ашигладаггүй. Java2D нь бүх төрлийн дүрсийг
зурахад ганц draw() методыг ашигладаг. File () метод нь төстэйгээр тэр
объектыг будахад ашигладдаг. Тиймээс, хэрэв тэгш өнцөгт зурах бол тэгш
өнцөгт объект нь үүссэн байх хэрэгтэй ба дараа нь draw () ба file методуудад
параметр болгон дамжуулдаг. Ялгаатай дүрсүүд үүсгэхийн тулд та програмдаа
jav.awt.geon.* -г импортлох ёстой.
4.8.5 Шулуун зурах
Line2D класс нь шулуун объект үүсгэхэд ашиглагдах java.awt.geom пакетад
байдаг класс. Шулуун объект үүсгэх үед шулуун классын Flout эсвэл Double
методыг ашиглана. (10,10)-c (300,310) шулуун зурахад дараахь кодыг ашиглаж
болно:
Line2D l=new Line2D.Float (10,10,300,310);
g2D.draw (l);
-55-
С.Ууганбаяр
JAVA програмчлал
мөн өөрөөр Point2D классыг ашиглаж эхлээд 2 цэгээс объектуудаа үүсгээд
дараа нь зурж болно:
Point2D p1=new Point2D. Float (10,10);
Point2D p2=new Point2D. Float (300, 310);
Line2D l=new line2D.Float (p1, p2);
g2D.draw (l);
4.8.6 Тэгш өнцөгт зурах
Ердийн тэгш өнцөгт объект нь Rectangle2D объектын тусламжтай үүсгэдэг. Энэ
классын байгуулагч нь тэгш өнцөгтийн зүүн дээд өнцгийн координатууд, өндөр,
өргөнийг хүлээн авдаг.
Rectang 2D r=new Rectangle2D.Float (20,20,150,100);
g2D.draw (l);
4.8.7 Эллипс, тойрогь нум зурах
Ellipse2D класс нь эллипс, тойрог, объект үүсгэхэд хэрэглэгддэг.
4.8.8 Муруй үүсгэх
Муруй нь хоёр төрөлтэй- квадратик ба кубик. Квадратик муруй нь нэг контрон
цэгтэй ба кубик муруй нь 2 контрон цэгтэй байдаг.
(40,40)-c (40,250)-ийг холбосон (20,20) дээр контрон цэгтэй муруй зурахад:
QuadCurve20 q=newQuadCurve2D.Float (40,40,20,20,40,250);
g2D . draw (q);
Контрон цэг нь муруй зурагдах замыг тодорхойлдог. Дээрхи жишээнд (40,40)-c
(40,250)-г холбосон шулуун зурагдаад дараа нь (20,20) дээрхи контрон цэгийг
ашиглан муруйлт нь зурагдана.
(40,40)-с (40,250)-г холбосон (20,60) ба (150ь150) дээр контрон цэгүүдтэй
муруй зуръя.
Cubic Curve2D q=new Cubic Curve2D.Float (40,40,20,60,150,150,40,250);
g2D.draw (q);
4.8.9 Дурын дүрс зурах
Ердийн дүрсүүдээс гадна олон өнцөгт, гурвалжин, бусад муруйны төрлүүд г.м
дурын хэлбэртэй дүрс зурж болно. Үүнийг GenoralPath классын тусламжтай
хийдэг. Generalpath классыг ажиллаж эхлэхэд объектыг байгуулах бүх замаа
тордорхойлно. Дараа нь draw методыг ашиглан зурна. Дараах жишээн дээр 8
өнцөгтийг зурсан.
-56-
С.Ууганбаяр
JAVA програмчлал
Import java.awt.*;
Import java.awt.geon.*;
Public class TryHex extends java.аплет.Аплет {
Public void paint (Graphics g) {
Graphics2D g2D = (Graphics2D) g;
General Path =new General Path();
p.move To (60,20);
p.line To (140,20);
p.line To (180,60);
p.line To (140,100);
p.line To (60,100);
p.line To (20,60);
p.line To (60,20);
g.2D.draw (p);
}
}
4.8.10 Stroke (Хүрээ шугам)
Stroke нь дүрсийн хүрээ яаж зурагдахыг тодорхойлдог. Ердийн Java awt API нь
1 цэгийн өргөнтэй тасралтгүй шулууныг stroke болгон хэрэглэдэг. Java 2D нь
янз бүрийн stroke ашигладаг тэдгээрийг янз бүрийн дүрс зурахад хэрэглэж
болдог. Ялгаатай stroke-ууд нь Basic Stroke классын тусламжтай үүсгэгддэг.
Энэ класс нь чухал байгуулагч методуудтай. Үүнд:
• Basic Stroke ()
• Basic Stroke (float width,int cap, int join);
• Basic Stroke (float width, int cap, int join float miterlimit)
• Basic Stroke (float width, int cap, int join float miterlimit, fload [ ] dash, float
dash_phase )
Width – strok- н өргөн
Cap- strok-н үзүүрүүдийн хэлбэрийг засдаг: CAP_BUTT, CAP_ROUND, CAP_
SQUARE.
CAP_BUTT нь stroke-н CAP_ROUND нь stroke-н CAP_SQUARE
үзүүрт юу ч байхгүйг заана. төгсгөлүүд дугуйрсан нь тэгш өнцөгт
хэлбэртэй байхыг заана
join – Stroke дэх булангуудын хэлбэрийг заадаг. (холбогдож буй булангууд)
JOIN_BEVEL – stroke-н гадаад үзүүрүүд шулуун зурагдахыг заадаг.
-57-
С.Ууганбаяр
JAVA програмчлал
JOIN_ROUND Stroke-н гадаад үзүүрүүд
Miterlimit – эдгээр гадаад үзүүрүүд хэр хол байж болохыг заадаг. Dash ба
dash_phase нь Stroke-г тасралттай зураасууд болгоход хэрэглэгддэг. Dash
массив нь зураас-цэгийн засвар, цоорхойн уртыг агуулдаг. Dash_phase аргумент
нь зураасын цуваа тэр холоос эхлэхийг заадаг.
Дараах код нь 2 ширхэг 8- дүрс зурах ба эхнийх нь 5 dash_phase-тэй, хоёр дахь
нь 10 dash_phase –тэй.
Import java.awt.*;
Import java.awt.geon.*;
Public class Dash extends java.аплет.Аплет {
-58-
С.Ууганбаяр
JAVA програмчлал
Public void paint (Graphics g) {
Float [ ] av = new float [4];
av= [0]=15; av[1]=10; av[2]=5; av[3]=10;
g2D.setStroke (new Basic Stroke (10f, BasicStroke.
CAP_ROUND, Basic Stroke. JOIN_ROUND, 18 av, 5));
GeneralPath p=new General Path ();
SetBackground (Color.yellow);
G2D.setColor (Color.red);
p.moveTo (100,10);
p. Curve To (50,60,150,160,100,210);
p.move To(100,10);
p.curve To (150,60,50,160,100,210);
g2D.draw (p);
g2D.setstroke (new Basic Stroke (10f, Basicstroke.CAP_ROUND,
Basic stroke. JOIN_ROUND, 1, av, 10));
GeneralPath p1=new GeneralPuth();
Set.Backround (Color.yellow);
G2D.setColor (Color.red);
P1. Move To (200,10);
P1. Curve To (150,60,250,160,200,210);
P1. Move To (200,10);
P1. Curve To (250,60,150,160,200,210);
G2D.draw (p1);
}
}
4.8.11 Будах хэлбэрүүд
Будах загваруудын тусламжтайгаар объектууд яаж будагдахыг зааж болно.
Будах загвар нь үргэлж өнгө, ууссан өнгө, texture эсвэл хэрэглэгчийн зохиосон
ямар ч загвар байж болно. БУдах хэлбэр нь setPaint() методыг ашиглан
тогтоогддог, энэ метод Paint объектыг параметрээр хүлээж авдаг.
Gradient Paint объект нь дурын 2 цэгийн хооронд нэг өнгөнөөс нөгөө өнгө рүү
уусган будахад хэрэглэгддэг. Эдгээр цэгүүд нь уусалтын мужийг тодорхойлдог.
Хэрэв 2 цэг (0,0), (50,50) гэж өгөгдсөн бол уусалтын мужийн урт 50 нэгж болно.
Будалт нь (0,0) цэгээс заасан өнгөөр эхэлдэг.
Хоёр өнгийг ингэж нийлүүлэх нь Cyclic эсвэл Acyclic байж болно. Acyclic
тохиолдолд өнгө үзүүрийн өнгөндөө хүрээд тэндээ зогсдог. Харин хэрэв cyclic
бол энэ хвиргалтын процесс үргэлжилнэ. Энэ нь төгсгөлийн өнгөнд хүрээд
эхний цэгийн өнгө болон солигдож энэ процесс цааш үргэлжилнэ гэсэн үг.
Gradient Paint (float x1, float y1, Color c1, Float x2, float y2, Color c2, boolean
cyclic);
Энд сүүлчийн cyclic аргумент заавал байх албагүй хэрэв орхивол false (default
утга) утга авна.
-59-
С.Ууганбаяр
JAVA програмчлал
Gradient объектыг үүсгэсний дараа түүнийг setPaint() методыг ашиглан
хэрэгжүүлж болно.
Import java.awt.*;
Import java.awt.gean.*;
Public class File extends java.аплет.Аплет {
Public void paint (Graphics g) {
Graphics2D g2D= (Graphics2D) g;
GradienPaint grad =new Gradient Paint (0,0, Color.blue,
50,50, Color.krange, );
g2D.setPaint (grad);
Rectangle2D r=new Rectangle2D.Float (10,10,100,100);
G2D.File(r);
TexturePaint (BufferedImage Fillpattern, Rectangle2D r);
FufferedImage класс нь массив ашиглан зургийн цэгүүдийг тус тусад нь
удирдахад хэрэглэгддэг.
Image классын нэг тусгай хувилбар юм. Rectangle 2D объект буцах хэлбэрийн
хэмжээг тодорхойлно.
Нь ийм хэмжээний тэгш өнцөгт блокуудаар дүүргэгдэх ба file pattern- д
заасан хэлбэрээр будагдана.
Дараах програмын код нь дүрсийн будалтын хэлбэрт TINY.GIF нэртэй зурган
файлыг ашигласан.
Import java.awt.*;
Import java.awt.geon.*;
Import java.awt.image.BufferedImage;
Public class FileImage extends java.аплет.Аплет {
Public void paint (Graphics g) {
Graphics2D g2D= (Graphics2D) g;
G2D. setstroke (new BasicStroke (601,BasicStroke.CAP_ROUND,
Basicstroke.JOIN_ROUND));
GeneralPath p=new General Path ();
SetBackground (Color.yellow);
G2D.setColor (Color.red);
p.moveTo (50,50);
p. line To (300,300);
p.move To(300,50);
p.line To (50,300);
Imag ing=getImage (getCodeBase(), “TINY.GIF”);
BufferedImage bing=new BufferedImage (ing.getwidth (this),
ing.getHeight (this), BufferedImage.TYPE_INT_RGB);
Graphics2D temp=bing.create Graphics ();
Temp.drawImage (img, 0,0, this);
Revtange2D r=new Rectange2D.Float (0,0 ing.get width (this),
ing.getHeigth (this));
TexturePaint tp=new TexturePaint (bimg, r);
G2D.setPaint (tp);
G2D.draw (p);
-60-
С.Ууганбаяр
JAVA програмчлал
}
}
Лекц №10
5.1 Exception Handling
Exception бол таны програмд үүсч буй бий болдог хэвийн бус байдал юм.
(нөхцөл) Тийм нөхцөлд програмд үүсэхэд түүнийг боловсруулах тийм
төлөвлөсөн код бичигддэг. Энэ нь С хэлэн дэх функцээр буцаагдсан
алдааны кодтой төстэй. Функцийн буцаагдсан ямар ч утга шалгагдах ба утгаас
хамааран түүнийг амжилттай биелсэн эсвэл алдаатай болсон эсэхийг шалгадаг.
Хэрэв алдаа бол алдааны кодыг алдааны жагсаалтаас олж ямар алдаа гарсныг
мэддэг. Java –н runtime орчин нь энэ байдлыг exception handling хэлбэрт объект
хандлагат технологи ашиглан шийддэг. Excption handling –г ашиглан та
програмаа гэнэтийн тасралт, төвөгтэй мэдээллүүдээс сэргийлж чадна. Эсрэгээр,
бага зэргийн алдаа гарсан бол энэ нь ажиллах үед баригдах бөгөөд таны
програм тасралтгүйгээр үргэлжилнэ.
Бүх exceptio-ууд Throwable гэж нэрлэгдэх bnilt-н классын sub классууд юм.
Throwable –н дор 2 үндсэн sub класс байдаг: Exception ба Error.
Exception класс нь хэрэглэгчийн програмаар баригдах ёстой бүх асуудлуудыг
шийддэг. Runtime Exception бол Exception-ий нэг чухал sub класс, ийм төрлийн
exception-ууд нь 0-д хуваах г.м өмнө тодорхойлогдсон байдаг. Төлөвшөөгүй
exception –ууд гадаад алдаанууд Error sub классын дор ордог. Жнь: стек дүүрэх
Эдгээр нь runtime орчин өөрөө шийддэг ослын байдлууд юм. Системд
тодорхойлсон exception –уудаас гадна хэрэглэгч мөн exception тодорхойлж
болно. Дараах зурагт exception классуудын удамшлыг харуулав.
Throwable
Error
Exception
Runtime
Exception
Class Not
Found
Array Index
Out Of Bounds
Lincage
Error
Stack Over
Flow
-61-
С.Ууганбаяр
JAVA програмчлал
5.2 Exception-уудыг яаж барих вэ?
Java нь Claus-р exception-г удирддаг: try, catch, throw, throws, finally.
Програмд exception-ны байдал тулгархад exception-ны тохирох төрлийн объект
нь exceptionны ижил методод шидэгддэг. Ингээд шидэгдэж
ирсэн объектыг барихыг төлөвлөсөн метод байх ба exception-ыг өөрийн замаар
шийддэг. Хэрэв энэ хийгдэхээргүй сонгогдсон ба exception-г тавьж явуулбал
дараа нь дуудагч функц түүнийг авна, үгүй бол runtime орчин барьж авч
програмыг таслана.
5.2.1 Try, throw, catch
Exception-г үүсгэхээр төлөвлөсөн код нь try ба catch блок дотор бичигдэх ёстой.
Exception-handling-ийн хамгийн үндсэн хэлбэр бол:
Try
{
// бичиглэл
// бичиглэл
{
catch (<Exception Type Class> object1)
{
// exception-г боловсруулах үйлдлүүд
}
Try.. catch блок дотор удалгүй exceptioyn-ий байдал үүснэ, exception-ний тэр
тусгай төрлийн объект нь автоматаар үүсэж, шидэгддэг. Дараа нь шидэгдсэн
объект төлөвлөсөн catch блокод очно, ө.х шидэгдсэн объектын төрөлтэй ижил
параметр бүхий catch блок. Хэрэв блок тохирвол catch-д бичигдсэн exception-г
боловсруулах кодууд биелнэ.
Дараах програмыг үзье, энд exception үүссэн үед runtime орчин яаж
боловсруулахыг жишээлэн үзүүлэв. Энэ нь сүүлд нь exception-г
боловсруулахаар өөрчлөгдсөн байгаа. Үүссэн exception бол Number Format
Exception. Энэ нь тэмдэг мөрийг бодит тоо руу хөрвүүлэх үед үүсдэг, тэмдэгт
мөр нь нэг бол хоосон эсвэл зөв хэлбэрийн тоог агуулаагүй.
Class NumForm Excp
{
-62-
С.Ууганбаяр
JAVA програмчлал
public static void main (String arge[ ])
{
String str1=new String (“text12”);
Int mm1= Integer.parseInt(str1); // тэмдэг мөрийн тоо руу
хөрвүүлэх
System.out.printen (mm1);
}
}
Энэ програмын үр дүн нь:
Exception in thread “main” java.lang.NumberFormatException: taxt12
At java.long.Integer.parseInt (Compiled code)
At java.long.Integer.parseInt (Integer.java :458)
At mmfornexcp.main (numformexcp.java :6)
Дээрх програмд Str1 нь зөв тоон форматтай тоог агуулаагүй байна. Str1 тоо руу
хөрвүүлэгдэхийг оролдох үед NumberFormatException төрлийн объект
шидэгдэнэ. Энэ үед та энэ объектыг бариагүй учраас энэ нь runtime орчныг
default exception handler-ээр боловсруулагдсан байна. Энэ нь стекийн мөрөөр
орж ямар exception шидэгдсэн, ямар команд үүнийг үүсгэх болсон, мөн түүний
үүссэн мөрийн дугаар методын дугаарыг хэвлэдэг.
Доорхи програм нь энэ exception-г яаж боловсруулж болохыг үзүүлэв:
Class NumFormExcp
{
public static void main (string args [ ])
{
try
{
string str1=new String (“text12”);
int num1=Integer.parseInt (str1);
system.out.println (num1);
} catch (NumberFormatException e)
{
system.out.println (“# # Wrong Number # # “);
}
}
}
Дээрхи жишээнд тохиолдсон exception нь ил тодорхой байна, ө.х. автоматаар
шидэгддэг. Хэрэв та exception-г ил тодорхой шидэхийг хүсч байгаа бол та throw
class-г хэрэглэх хэрэгтэй. Энэ нь та өөрийн exception-г үүсгэхийг хүсч, мөн
тэднийгээ шидэхийг хүсэх үед хэрэглэгддэг. Системд тодорхойлогдсон бүх
exception-ууд автоматаар шидэгддэг, харин хэрэглэгч тодорхойлсон exception-
ууд throw class-г хэрэглэн шидэгдэх ёстой:
Try
{
-63-
С.Ууганбаяр
JAVA програмчлал
// бичиглэл
throw new Udef_Exception();
// бичиглэл
}
catch (Udef_Exception obj1)
{
system.out.println (“User defined exception caught”);
}
Udef_Exception нь exception-г боловсруулахаар тусгай хийгдсэн класс, мөн энэ
нь хэрэглэгчийн тодорхойлсон шинжүүдийн зарим онцлог төрлүүдийг
битүүмжилсэн. Хэрэглэгч тодорхойлсон exception үүсгэх зарчмыг сүүлд үзнэ.
Энэ exception нь ил байдлаар throw clause-г ашиглан үүсгэгдэж байна. Та throw
clause-н хамт Udef_Exception- ий объектыг дамжуулах хэрэгтэй. Нэгэн зэрэг
catch clause нь ижил exception объектыг барихад бэлэн байдаг.
Дараах жишээг үзье, энэ жишээнд throw clause-н үүргийг харуулахын тулд
системийн exception-г зориуд шидсэн юм:
Class Throw Clause
{
public static void main (string args [ ])
{
try
{
throw new NullPointerException ();
}
catch (NullPointerException e)
{
System.out.println (“Invalid reference use”);
}
}
}
Дээрх жишээнд throw clause нь системд тодорхойлогдсон NullPointerException
exception-ий объектыг шидэж байна. NullPointerException exception нь бодит
хэрэгтээ объект null заагчийг агуулж байвал шидэгддэг.
Үүний дараа, удалгүй exception үүсч catch блок түүнийг барьж авч мэдээлэл
хэвлэж байна.
ХЭрэв объект throwable классын удамшилд хамаардаг бол зөвхөн тэрээр
шидэгдэж болно. String, Date г.м классууд throw-тэй хамааралтай ажиллаж
чадахгүй.
Лекц № 11
5.2.2 Throws
Бид try блок дотор exception нь ил болон далд байдлаар шидэгддэгийг, мөн
catch блок нь үүнийг барихад бэлэн байдгийг үзлээ. Гэвч exception-г шиддэг
-64-
С.Ууганбаяр
JAVA програмчлал
боловч түүнийг биетэй кодоор барьдаггүй методууд байдаг. Энэ тохиолдолд
exception-г шидэж байгаа метод нь тодорхойлолтдоо throws clause-г ашигласан
байх ёстой. Throws clause нь сэрэмжлүүлэг мэдээ шиг байдлаар ажилладаг, ө.х
дуудагч модуль нь шидэж байгаа exception-ээ өөрөө боловсруулахгүй гэдгээ
мэддэг. Мөн энэ нь шидэгдэх exception-ээр боловсруулагдахаар байдаг.
Ажиллах үеийн exception-уудын тохиолдолд тэднийг боловсруулахгүй орхиж
байгаа метод нь throws clause –г ашиглах хэрэггүй байдаг, runtime орчин
тэднийг боловсруулдаг.
Дараах method_one () нэртэй методыг агуулсан классын бүтцэд анхаарлаа
хандуулъя. Энэ метод нь exception объектыг шидэх, throws clause-г ашигласан
байна. Энэ методод харгалзах catch clause байхгүйг анхаар. Энэ метод нь main
() методоос дуудагдана, main () метод нь эргүүлээд exception –г method_one ()-р
бариулна, учир нь exception-г боловсруулахгүй бол тэр нь throws clause руу
хандаж чадах ба runtime орчноор боловсруулагдана.
Class <class name>
{
static void method_one() throws <exception_one>
{
throw new <exception one> // method_one нь exsption-г ши дэх
боловч барихгүй.
}
public static void main (string args [ ])
{
try
{
method_one (); // main() метод нь exception-г шидээгүй,
гэхдээ түүнийг // кодтой байна.
}
catch (<exception_one> object )
{
// exception-г боловсруулах код
}
}
}
Дараах жишээнд анхааръя. Энэ жишээнд 2 статик метод байна: throwExcp() ба
main () метод
Throw Excp() метод нь IllegalAccess Exception exception-ий объектыг шиддэг
бөгөөд түүнийг барьдаг.
(IllegalAccessException нь халдах зөвшөөрөлгүй класс руу хандахыг оролдох
үед шидэгддэг.) Гэвч catch блок дотор IllegalAccessException-ий объект дахин
шидэгдэх ба энэ удаа тэр ямар нэг блок дотор баригдахгүй. Програмын
хөрвүүлэх үед та алдааны мэдээлэл хүлээн авна.
Class Throws_Clauses
{
static void throwExcp()
-65-
С.Ууганбаяр
JAVA програмчлал
{
try
{
throw new IllegalAccessException(); // exception
шидэгдэнэ.
} catch (IllegalAccessException e ) // exception баригдана.
{
system.out.println(“catch блок”);
throw new IllegalAccessException(); // exception дахин
шидэгдэнэ.
}
}
public static void main (string args [ ])
{
throwExcp();
system.out.println (“coes not reach here”);
}
}
Програмын үр дүн:
Throws_Clauses.java:12:Exception java.lang.IllegalAccessException must caught,
or it must throw new IllegalAccessException();
Ижил програмын өөрчилсөн хувилбарыг харъя. Throw Excp() функцийн
тодорхойлолтод throws clause нэмэгдсэн байна. Энэ нь дуудагч функц нь
exception-ий шидэхийг заадаг, гэвч түүнийг боловсруулахгүй. Компятор одоо
throwExcp() функцийг exception боловсруулалтгүйгээр байхыг зөвшөөрнө, гэвч
эсрэгээр дуудагч функцээс шаарддаг, ө.х main() exception-г боловсруулах ёстой.
Тэгээд main() функц exception шууд шидэгдээгүйг үл харгалзан түүнийг
боловсруулдаг. Throws clause нь үндсэндээ өргөн хүрээтэй зохиомжлолыг
бүрдүүлдэг, үүсгэгч нь өөрийнхөөрөө exception-г боловсруулахгүй гэхдээ өөр
методууд түүнийг дуудан өөрөөр exception-г боловсруулах боломж олгох
зэргээр.
Class Throws_Clauses
{
static void throwExcp() throws IllegalAccess Exception
{
throw new IllegalAccessException();
}
public static void main (string args [ ])
{
try
{
throwExcp();
}
catch (IllegalAccessException e )
{
-66-
С.Ууганбаяр
JAVA програмчлал
system.out.println(“Exception caught”);
}
}
}
Програмын үр дүн:
Exception caught
5.2.3 Finally
Finally clause нь try –тэй хамт бичигддэг, try-н ардаас нэг бол catch эсвэл finally
блок бичигдэх ёстой, мөн хоёулаа try-тэй хамт байх нь саадгүй /буруугүй/.
Finally блокын ашиг нь тэр catch блокын дараа эсвэл метод гарахаас өмнө
гарцаагүй биелдэг.
Энэ нь дараах хэлбэртэй:
Try
{
// бичиглэлүүд
}
finally
{
// бичиглэлүүд
}
эсвэл
try
{
//бичиглэлүүд
}
catch (<exception> obj)
{
// бичиглэлүүд
}
finally
{
// бичиглэлүүд
}
Catch ба finally блоктой дараах жишээг авч үзье. Catch блок нь 0-д хуваах зэрэг
арифметик алданы үед тохиолддог Arithmetic Exception –г барьдаг. Catch
блокыг биелсний дараа finally мөн биелж хоёр блокоос мэдээлэл өгнө.
Class Finally_Block
{
Static void division ()
{
-67-
С.Ууганбаяр
JAVA програмчлал
try
{
int num=34, den=0;
int duot=num/den;
}
catch (ArithmeticException e)
{
system.ont.println(“Divide by zero”);
}
finally
{
system.ont.println(“In the finally block”);
}
}
public static void main (string args [ ])
{
division()
}
}
Exception handling-тэй харьцаж байх үед програмын ажиллагааг олон удаа
гэнэтийн хэвийн ажиллагааг саатуулах зүйлтэй тулгардаг. Энэ нь заримдаа
хүсээгүй зарим үр дүнд хүргэдэг. Жнь: файл нээдэг, түүнрүү өгөгдөл бичдэг,
хаадаг методыг тасладаг. Ийм байдалд finally clause нь урхидахад хэрэглэгддэг.
Прогаммын бүтцийг дор харуулав.
Class Write_To_Stream
{
public void open_Stream ()
{
//урсгалыг нээх
}
public void writing_To_Stream ()
{
try
{
// урсгал руу бичих
}
finally
{
// урсгалаас цагаас нь өмнө хаах
}
}
public void close_Stream ()
{
// урсгалыг хаах
}
public class IO
{
public static void main (string args[ ])
-68-
С.Ууганбаяр
JAVA програмчлал
{
// Write_To_Stream-н методуудыг дуудах
}
}
}
5.3 Олон Catch clauses-ууд
Try блокоор хүрээлэгдсэн код үргэлж дан exception-г шийдэж байдаггүй. Хэрэв
try блокод олон ялгаатай төрлийн exception шидэгдвэл тэдгээр бүх exception-
уудыг боловсруулахын тулд олон catch блокыг тавьж болно. Exception
шидэгдсэн үед энэ нь тохирох catch блок олдох хүртэл нэг нэгээр catch
блокуудаар нэвтэрдэг. Тийм тохиолдолд програмын бүтэц:
try
{
// бичиглэл
} catch (<exception_one> obj)
{
// бичиглэл
}
catch (<exception_two> obj)
{
// бичиглэл
}
catch (<exception_three> obj)
// бичиглэл
}
Ийм замаар та олон төрлийн exception-уудыг хослуулан боловсруулах
боломжийг програмдаа бий болгоно.
Мөн Exception класс гэж нэрлэгдэх ерөнхий exception класс байдаг. Тиймээс
exception-г барих үед та exception-ий төрлийг засахыг хүсэхгүй бол ерөнхий
exception тавьж болох ба ингэхэд дурын төрлийн exception-ийг боловсруулж
болно.
Class Gen_Exp
{
public static void main (String args [ ])
{
try
{
int num =34, den=0;
int quot = num/den;
} catch (Exception e)
{
system.ont.println(“Error in the code”);
}
-69-
С.Ууганбаяр
JAVA програмчлал
}
}
Ерөнхий exception класс нь мөн олон блокод хэрэглэгдэж болно. Энэ
тохиолдолд ерөнхий exception-г хамгийн сүүлийн catch блокт тавих нь зүйтэй.
5.4 Үүрлэсэн try блок
Java нь exception боловсруулалтад зориулж хэд хэдэн built-н классуудыг
тодорхойлсон байдаг. Эдгээр байх классууд java.long пакетын нэг хэсэг, энэ
пакет нь амвтоматаар импорлогддог. Built-ийн exception классуудаас гадна та
өөрийн exception классыг тодорхойлж болно. Энэ нь стандарт exception
төрлүүдээс ялгаатай шинжүүдийг агуулсан exception төрлийг үүсгэхэд маш
чухал, ялангуяа өөрийн праграмдаа баталгаа (validation) хийхийг хүссэн үед.
Дор өгөгдсөн жишээ нь хэрэглэгч тодорхойлсон exception-г үүсгэж ашмгласан
байна. Энэ жишээнд exception класс нэгэн ижил .java файлд үүсгэгдэж,
ашиглагдаж байна, гэхдээ exception төрлүүдийг пакетуудад хадгалж, глобалиар
ашиглаж болно.
Class Validate_Range extendes Exception
{
String mesg;
Validate_Range ()
{
mesg=new String (“Enter between 20 and 100”);
}
public String to String ()
{
return (mesg);
}
}
public class My_Exception
{
public Static void main (String args [ ])
{
try
{
int x=10;
if (x<20 // x>100)
throw new Validate_Range();
catch (Validate_Range e)
{
system.ont.println (“**” +e);
}
}
}
5.5 Exception-уудыг хэдийд хэрэглэхгүй вэ?
-70-
С.Ууганбаяр
JAVA програмчлал
Exception боловсруулах механизм нь алдаанд хүргэх нөхцөлүүдийг зайлуулах
тодорхой зам юм. Гэвч та үүгээр мэдээлэл хийх болон хүссэн газраа exception
боловсруулалтыг хэрэглэж болохгүй. Тэд хянамгай төлөвлөгдөж, хэрэгжигдэх
ёстой. Дараах тохиолдлуд хэзээ та exception-с зайлсхийх ёстойг зөвлөнө:
Та алдаатай нөхцөлүүдээс exception handling-гээр бага хэмжээний кодоор
хялбар зайлсхийж болно. Exception-с ашигладахд илүү дээр гэж үзвэл.
Хэдийгээр exception handling нь програм зохиогчдод маш тохиромжтой
санагддаг боловч энэ нь процессорт их хугацаа авдаг.
Карим тохиолдолд exception handling нь маш хөнгөмсөг байдаг ба тэдний
орших зорилгыг умартан үсрэлтийн механизм шиг ашиглагдсан байдаг. Энэ бол
сайн програмчлалын арга биш, энэ нь сүүлд таны кодыг үймүүлдэг ба
зааварлахад хэцүү болгодог.
Мөн хэрэв кодын хэсэг зарим exception-г алдаж байгаа бол энэ нь зөв
боловсруулагдсан байх ёстой. Exception-г барих нь зөвхөн тулд байдаг
бөгөөд catch блокыг хоосон орхих нь тусгүй юм. Эргэж санахад, exception-ууд
бол гарч болох алдаануудын хувьд сэрэмжүүлэг нь болдог.
Лекц №12
Java дахь Mulmithreading
6.1 Multithreading
Multithreading гэдэг нь програм thread гэж нэрлэгдэх 2 буюу дээшхи хэсгүүдэд
хуваагдаж, тэдгээр бүх thread -үүд паралель ажиллах ойлголт юм. Multithreading
нь програмуудыг уян хатан, үр ашигтай болгодог бөгөөд түүний бүтээмжийг
бас дээшлүүлдэг. Жнь: өнөөдөр вэб хуудсууд дуут хөдөлгөөн, текст зэргийг
бүгдийг нэгэн зэрэг дүрслэх хэрэгтэй байдаг. Хэрэв энэ нь уламжлалт Single-
threaded үзэгдлийн давталтыг ашиглан хийгдвэл програм ачаалагдахад их
хугацаа авдаг, харин хугацаа бол web програмуудын хувьд маш чухал
шийдвэрлэх хүчин зүйл юм.
Program P
Thread
1
-71-
С.Ууганбаяр
JAVA програмчлал
Програм нь multithreading ашиглалгүй ажиллах үед event loop гэж нэрлэгдэх
аргыг дагадаг. Энэ аргад нэг дан процесс удирдлагыг авч, дараа нь юу хийхийг
шийдэж байдаг. Энэ нь үүнийг шийдэхийн тулд дан үзэгдлийн дарааллын
механизмтэй хамт polling-г хэрэглэдэг. Нэгэнт polling механизм тодорхой
бөгөөд бэлэн гэдгийг дохиолж буцаахад энэ нь хүсэлтийг тохирох үзүэгдэл
боловсруулагч руу илгээдэг. Энэ үзэгдэл боловсруулагчаас буцах хүртэл юу ч
болохгүй.
Thread Thread
2 3
С ба С++ зэрэг дээр үеийн хэлүүд multithreading дэмждэггүй, учир нь тэр үеийн
үйлдлийн ситемд үүнийг дэмждэггүй байсан. Microsoft windows, Apple
Maantegh зэрэг үйлдлийн системүүд нь уламжлалт event loop загвараар
хийгдсэн.
6.1.1 Яагаад Multithreading
Multithreading нь програмын хугацаа шаардах даалгаврууд (tasks) бусад
нөөцүүд сул болохыг хүлээх, эсвэл заримынх нь хугацаа хэтрэлт болохыг
хүлээх тийм байдлуудад их ач холбогдолтой. Multithreading нь Single-processor
орчинд явагддаг. Олон процессорын орчинд ялгаатай thread -үүд өөр өөр
процессорууд дээр ажиглана.
Зур. Ялгаатай процессорууд дээр ажиллаж буй thread-ууд
-72-
С.Ууганбаяр
JAVA програмчлал
Нэг процессортой системд эдгээр нь өөр замаар явагдана. Ийм системд олон
thread-ууд CPU time-г хуваан эзэмшдэг. Үйлдлийн систем нь thread-уудад
мүүдыг хувиарлах, төлөвлөх үүрэгтэй. Энэ зохион байгуулалт нь trhead үргэлж
CPU time шаардах хэрэггүй бол маш ач холбогдолтой. Энэ хугацаанд бусад
thread CPU-г авна. Өмнөх thread тухайн thread-г дуссаны дараа идэвхжнэ.
6.1.2. Multitasking ба Multithreading
Олон орчин ү/с-д multitsking байдаг, олон хүмүүс multitasking-г multithreading-
тэй эндүүрдэг. Multitasking ба multithreading нь бие биеэсээ маш ялгаатай.
Maltitasking-д task бол heavy-weight (хүнд жингийн) процесс. Heavy-weight ба
light-weight –н хоорондох ялгаа нь heavy-weight процесс нь ялгаатай хаяган
орон зайд байдаг. Нөгөө талаас light-weight процесс нь ижил хаяган орон зайг
хувааж эзэмшдэг. Нэг машин дээрх ялгаатай програмууд ажиллаж байгааг
multitasking гэж ойлгож болно, ө.х J Builder ба Word хоёулаа нэг машин дээр
ажиллаж байгаа нь multitasking. Харин Word текстийг хэлбэржүүлэх, scroll
хийх нь нэгэн зэрэг явагддаг. Энэ бол multithreading.
6.1.3 Java-ийн Thread загвар (model)
Java орчин нь multithread загвараар зохиогдсон. Үнэндээ, бүх классын сангууд
multithreading-ээр зохиомжлогдсон. Хэрэв thread хэсэг хугацаанд зогсолтын
байдалд орвол програмын амралтад энэ нь нөлөөлөхгүй. Төстэйгээр, animation
давталт нь зургийг дүрслэхэд өдөөгдөж болно. Мөн кадруудын хоорондох
секундэд амардаг. Энэ нь animation нь системийн амралтын ажиллагааг
зогсоохгүй хугацааны нэг эгшинд thread дараах төлвүүдийн нэгэнд орсон
байдаг. –new , ready, running, inactive, finished. Thread үүссэнийхээ дараа new
төлөвт ордог. Эхэлсний дараа ready болно. Үүний дараа runing төлөвт орно.
Thread ажиллаж байх үедээ блокод орж болно. Учир нь түүний хүссэн нөөц
бэлэн бус эсвэл бусад шалтгаанаар түр зогсоогдож болно. Ийм тохиолдолд thrad
inactive төлөв төрдөг.
-73-
С.Ууганбаяр
JAVA програмчлал
New
FinishidReady
Thread зэрэглэл
Multithreading орчинд нэг thread нөгөөгөөсөө илүү CPU шаардаж болно. Ийм
тохиолдолд уг thread өндөр зэрэглэлтэй байх хэрэгтэй. Thread-н зэрэглэл нь нэг
thread-с нөгөө рүү шилжих дүрмийг тодорхойлдог. Thread-н зэрэглэл бол 1-ээс
10 завсар дахь бүхэл тоон утгууд юм. 10 нь өндөр, 1 нь доогуур.
Зэрэглэл гсэн ойлголт нь thread –н хурдан ажиллахтай эндүүрч болохгүй. Өндөр
зэрэглэлтэй thread доогуур зэрэглэлтэй thread –ээс ямагт хурдан ажиллахгүй .
Thread сайн дураараа шууд зогсоож, унтаж эсвэл I/ 0 –с шалтгаалан
блоклогдож, эсвэл системийн тушаалаар pre-empted болж удирдлагыг орхиж
болно. Эхний тохиолдолд процессор бүх thread-үүдийг шалгаж, удирдлагын
Running Inactive
-74-
С.Ууганбаяр
JAVA програмчлал
өндөр зэрэглэлтэй thread –д удирдлагыг олгодог. Хоёр дахь тохиолдолд
удирдлагыг орхиход бэлэн бус доогуур зэрэглэлийн thread өндөр зэрэглэлтэй
thread-р түүний юу хийж байгааг нь үл харгалзан pre-empted болдог. Үүнийг
pre-emptive multi-tasking гэдэг. Хоёр thread ижил зэрэглэлтэй тохиолдолд энэ нь
зөвлүүштэй зүйл юм., Тэд удирдлагыг тэг байхаар тохиролцох ёстой.
Synchronization
Multithrasking нь програмын хувьд asynchronous шинжийг бий болгодог. Энэ нь
бүх thread-ууд бие биендээ нөлөөлөхгүй үл хамаарах нэгжүүд байдлаар
ажилладаг гэсэн утгатай. Гэхдээ зарим тохиолдолд энэ нь эдгээр thread-уудыг
зайлшгүй синхронжуулах хэрэг болдог. Жнь: Синхронжуулалт нь 2 thread ижил
хувьсагч буюу массивтэй адил өгөгдлийн бүтцүүдийг хамтран эзэмших үед
хэрэглэгддэг.
Мэдээ
Multithreading орчинд нэгээс илүү thread байх үед inter-process харилцаа чухал
болдог. Thread буюу thread-үүдтэй харицаж чаддаг байх ёстой. Thread-үүд бие
биетэйгээ wait ба notify методуудыг ашиглаж ярьж чадна.
6.2 Thread үүсгэх
Thread нь Java програмуудад 2 замаар үүсч бий болно.
Thread классыг өргөтгөж,Runmable интерфэйсийг хэрэгжүүлэх. Програм
Thread классыг өргөтгөх үед (удамших) уг классын run() методыг дарж
тодорхойлох ёстой. Хэрэв програм Runnable интерфэйсийг ашигласан
бол зөвхөн run() методыг хэрэгжүүлэх хэрэгтэй. Бид эдгээрийн тухай тус
бүрд нь үзнэ, гэхдээ эхлээд main thread-н тухай яръя.
6.2.1 Main Thread
Main метод нь Java програм ажиллах болгонд ажиллаж байдаг тийм thread-г
заадаг. Үүнийг main thread гэж нэрлэдэг, учир нь энэ програм ажиллаж эхлэх
үед эхлээд ажилладаг thread юм. Бусад thread –ууд энэ үндсэн thread-с гарч
болно. Үндсэн thread нь програм дахь сүүлийн thread байх ёстой. Main thread
зогсоход програмын ажиллагаа зогсоно.
Main thread нь автоматаар үүсдэг, гэхдээ энэ нь thread объектыг ашиглан
програмаар удирдагдаж болно. Thread объект нь Thread классын currentThread ()
методын тусламжтайгаар main thread-н заалтыг авч чадна.
Доорхи жишээнд: main thread яаж удирдагдаж болохыг үзүүлэв:
Class MainThread {
Public static void main (String args [ ]){
Thread t = Thread.currentThread();
System.ont.println(“Current Thread : ” + t);
System.ont.println(“Name : ” ++.getName());
System.ont.println(“ ” );
t.setName (“New Thread”);
-75-
С.Ууганбаяр
JAVA програмчлал
-76-
С.Ууганбаяр
System.ont.println(“After changing name”);
System.ont.println(“Current Thread : ” + t);
System.ont.println(“Name : ” + t.get Name ());
System.ont.println(“ ”);
System.ont.println(“This thread first 10 numbers ”);
Try {
For (int I =1; I < = 10; I ++) {
System.ont.print (i);
Thread.sleep (1000);
}
} catch (Interrupted exception e) { }
}
}
6.2.2 Thread классаас удамшуулж thread үүсгэх
Thread үүсгэх эхний арга бол Thread классын sub классыг үүсгэх. Энэ класс нь
run() методыг дарж тодорхойлох ёстой, мөн бусад методуудыг бас дарж болно.
Дараа нь уг классын объектыг үүсгэж болно. Энэ алхмуудыг доорхи зурагт
харуулав.
h тооны тэмдэгт мөр хэвлэдэг thread үүсгэх програмын жишээг авъя. Энэ
програм Thread классыг өргөтгөж thread үүсгэсэн.
Class PrintString 1 {
Public Static void main (String args [ ] ) {
String Thread1 t = new StringThread 1 (“Java”, 50);
t.Start ();
}
}
classes StringThread1 extends Thread {
private String str;
private int num;
StringThread1 (String s, int n ) {
Str = new String (s);
Class My Thread extends Thread
{
My Thread ( ) {
……..
……..
}
public void run () {
…..
…..
}
…..
}
Class Example
tic void main () {
My Thread t=new My Thread ();
….
t ();
……
}
}
{
public sta
t.Star
JAVA програмчлал
Num = n ;
}
public void run () {
for (int I = 1; I c = num; I++)
system.ont.print(str+” ”);
}
}
6.2.3 Runnable интерфэйсийг хэрэгжүүлж thread үүсгэх
Өмнө хэлснээр, thread нь Runnable интерфэйсийг хэмэргжүүлснээр мөн үүсч
болно. Эндээс эдгээр аргуудын алийг нь thread үүсгэхэд ашиглах вэ? гэсэн
асуулт гарна. Хэрэв таны үүсгэж байгаа thread класс бусад классын sub класс
бол энэ нь thread классаас удамшиж чадахгүй. Учир нь Java нэгээс дээш
классаас удамшихыг зөвшөөрдөггүй. Ийм үед Runnable интерфэйсийг
ашигладаг.
Өмнөх програмыг Runnable интерфэйсийг ашигласан байдлаар өөрчилье.
Class PrintString 2 {
Public Static void main (String args [ ] ) {
String Thread 2 t = new StringThread (“Java”, 50);
New Thread (+).Start ();
}
}
classes StringThread 2 implements Runnable {
private String str;
private int num;
StringThread 2 (String s, int num ) {
Str = new String (s);
Num = n ;
}
public void run () {
for (int I = 1; I c = num; I++)
system.ont.print(str+” ”);
}
}
Өмнөх болон энэ програмын хоорондох ялгаа бол Thread классаас удамшуулан
thread үүсгэх үед шууд t.Start () гэж байсан. Учир нь String Thread1 бол Thread
классын sub класс, тиймээс тэр thread-н бүх боломжуудыг агуулсан байна.
Runnable –г ашиглан thread үүсгэх үед Thread объект PrintString2 классынхтай
адилаар ил үүсгэгдэнэ. Дараа нь String thread 2 объктыг түүнд параметр болгон
дамжуулж ажиллуулна. Энэ нь String Thread 2 классын run() методыг
ажиллуулахын тулд хийж байгаа хэрэг.
Мөн дээрхи програм Runnable интерфэйсийг хэрэгжүүлэн, мөн StringThread 3
классын дотор Thread объектыг үүсгэж өөрчлөгдөн бичигддэг.
Class PrintString 3 {
Public Static void main (String args [ ] ) {
-77-
С.Ууганбаяр
JAVA програмчлал
New string Thread 3 (“Java”, 50);
}
}
class StringThread 3 implement Runnable {
private String str;
private int num;
StringThread3 (String s, int n ) {
Str = new String (s);
Num = n
Thread t =new Thread (this);
T. start();
}
public void run () {
for (int I = 1; I c = num; I++)
system.ont.print(str+” ”);
}
}
6.2.4 Олон thread үүсгэх, удирдах
3 thread үүсгэе- нэг нь “Java”-г 100 удаа хэвлэдэг, нөгөө нь “Cafe”-г 100 удаа
хэвлэдэг, гурав дахь нь 150-с баг а анхны тоо хэвлэдэг.
Class MultiThread {
Public Static void main (String args [ ] ) {
new Thread(new StringThread (“Java”,100)).Start ();
new Thread(new StringThread (“Cafe”,100)).Start ();
new Thread(new PrimeThread (150)).Start ();
}
}
classPrimeThread inylementsRunnable {
private int Castval;
primeThread ( int n ) {
Castval= n;
}
public void run () {
int I, j;
booloon flag;
for (I=2; I<= n; I++) {
flag = false ;
for ( j2; j<=i/2; j++)
if (i%j==0)
flag=true;
if (flag==false)
system.ont.print (it+” ”);
}
}
-78-
С.Ууганбаяр
JAVA програмчлал
}
class String Thread implements Runnable {
private string str;
private int num;
stringThread (String s, int n) {
str = new String (s);
num = n;
}
public void run () {
for (int i=1; i<=num; i++)
System.ont.print (str+ “ “);
}
}
}
6.3 Thread-н зэрэглэл
Thread класс нь MIN_PRIORITY. NORM_PRIORITY, MAX_PRIORITY утгуудыг
тодорхойлсон байдаг бөгөөд тус бүр нь харгалзан 1,5,10 утгууд авдаг. Thread
default-оороо NORM_PRIORITY-тэй байдаг.
Java нь доогуур зэрэглэлтэй thread –ээс өндөр зэрэглэлтэй thread-г дээгүүр
тавьдаг. Хэрэв 2 буюу түүнээс дээш thread-ууд ижил зэрэглэлтэй бол CPU нь
тэдэнд round-robin маягаар хувиарлагддаг. Бид StringThread классын жишээг
үзсэн. Одоо 4 thread үүсгээд тэдэнд 5,6,7,8 зэрэглэлүүдийг харгалзан тогтоож
яаж ажиллахыг харъя.
Import String Thread;
Class PriorityThread {
Public static void main (String args [ ] ) {
Thread t 1=new Thread (new String Thread (“Java”, 25));
Thread t 2=new Thread (new String Thread (“Cafe”, 25));
Thread t 3=new Thread (new String Thread (“Symantic”, 25));
Thread t 4=new Thread (new String Thread (“Platform2”, 25));
t1.setPriority (Thread.NORM_PRIORITY);
t1.setPriority (Thread.NORM_PRIORITY +1);
t1.setPriority (Thread.NORM_PRIORITY+2);
t1.setPriority (Thread.NORM_PRIORITY+3);
t1.start ();
t 2.start ();
t3.start ();
t4.start ();
}
}
Thread-үүд бүгд 25 удаа тэмдэгт мөр хэвлэнэ. “Pleatform 2” –г хэвлэж байгаа
thread өндөр зэрэглэлтэй болохоор хамгийн эрт дуусна, г.м
-79-
С.Ууганбаяр
JAVA програмчлал
Лекц №13
6.4 synchronization
Бид өмнө синхронжуулалтын тухай ярьсан. Энэ нь 2 буюу түүнээс дээш тооны
thred-ууд ижил хувьсагч, обьект руу хандахыг оролдох үед яригддаг. Энэ нь
monitor гэсэн ойлголтыг inter-process синхронжуулалтад хэрэглэдэг. Monitor
Нь хугацааны эгшинд зөвхөн 1 thread-ыг багааж байдаг хайрцаг адилаар
ажилладаг. Хэрэв 1 thread-ыг агуулсан бол бусад бүх thread-үүд эхний thread-
ыг гартал нь хүлээх ёстой. Monitor нь хамтран эзэмшиж байгаа хувьсагч
өгөдөлийн бүтэц буюу түүнээс дээшthread-үүдэд ашиглагдаж байгаа байдлаар
зохион байгуулдаг. Гэвч Java-д обьектыг үүсгэж болох monitor класс байхгүй.
үүний оронд обьект бүр нь тодорхой синхронжсон методуудаар хангагддаг.
Обьект бүр эдгээр синхронжсон методуудаас аль нэгийг дуудаж өөрийн
monitor-д орж болно. Нэрэв thread обьект дахь синхронжсон методуудыг
дуудагч буюу thread-үүд тэр обьект дахь синхронжсон методыг дуудаж
чадахгүй.
• Үүнийг сайн ойлгохын тулд жишээ авъя. Бидэнд 2 хувьсагчтай Accout
класс бичих гэж үзье.(account number Ба balance) мөн Negative Amount
Exception, Insufficient Fund Exception нэртэй 2 класс байна гэе. Энэ 2
класс хоёулаа нийт дүн 0-ээс бага бол, мөн балансаас илүү гарах үед
үүсэх асуудлыг шийдэхэд зориулж үүссэн. Account Класс нь
методуудтай.
• Get balance-Тооцооны нийт балансыг буцаана.
• Set balance -Балансыг тогтооно.
• Deposit -Нийт дүнг авах, түүнийгээ тооцооны баланс дээр нэмнэ. Энэ
метод нь хэрэв нийт хадгаламж 0-ээс бага байвал Negative Amount
Exception үүснэ.
• With draw-Нийт дүнг авч, түүнийг балансаас хасна. Энэ метод нь 2
Exception-ийг үүсгэнэ. Хэрэв хадгаламж 0-ээс бага бол Negative Amount
Exception , хэрэв буцааж авсан дүн нь балансаас хэтэрвал Insufficient
Fund Exception.
Class account1
Int account no;
Float balance;
Account (int ac, float bal){
Account no=ac;
Balance=bal;
}
float get balance () {
return balance;
}
void set balance( float balance){
balance= bal;
}
void deposit (float amount) throw negative Amount Exception{
if (amount < 0)
throw now Negative Amount Exception() ;
balance = balance +amount ;
}
-80-
С.Ууганбаяр
JAVA програмчлал
void with draw (float amount) throw Negative Amount Exception, Insufficient
Fund Exception {
if (amount < 0)
throw now Negative Amount Exception();
if (balance < amount )
throw now Insufficient Fund Exception();
balance = balance – amount;
}
class negative amount exception extend exception{
negative amount exception () ;
super (“negative amount”);
}
}
class insufficient fund exception extend exception{
insufficient fund exception();
super (“Insufficient Fund”);
}
}
import account;
class nosync {
public static void main ( string args [ ] );
account a1 = new account (1,1000)
account a2 = new account (1,0 )
thread +1 [ ] =new thread {100 }
thread +2 [ ] =new thread {100 }
threadgroup g1 = new threadgroup(“group1”)
threadgroup g2 = new threadgroup(“group2”);
for ( int I= 0; I<100; I ++){
t1 [ I]= new thread (g1, new transforthread ( a2,a1,1), “t1”)
t1 [ I].star+ ( );
}
for ( int I= 0; I<100; I ++){
t2 [ I]= new thread (g2, new transforthread ( a2,a1,1), “t2”)
t2 [ I].star+ ( );
}
while ( true) {
if ( g1. activecount ( )==0)&& ( g2. activecount ( )==0)
break;
system.out.println (“balance in account1”+ a1.getbalance( ) );
system.out.println (“balance in account2”+ a2.getbalance( ) );
}
}
}
class transferthread extends thread1
account from account, to account;
float amount;
transferthread (account a1, account a2, float amt){
fromaccount = a1;
toaccount = a2;
-81-
С.Ууганбаяр
JAVA програмчлал
amount = amt;
}
public void um ( ) {
transfer ( fromaccount, toaccount, amount);
}
void transfer ( account from, account to, float amt) {
float formprior = from.get balance ( );
float toprier = to. Get balance ( );
try {
sleep (1000)
} catch ( interrupted exception e ) { }
try {
to deposit (amt);
from.withdraw (amt)
} catch (negative amount exeption e ) {
from.set balance (fromprior );
to,setbalance (toprior);
}
catch (insufficientfund exeption e){
from.set balance (from prior);
to.setbalance( toprior);
}
}
}
Програиыг одоо эхлээд атигоё. Энэ програмд Threadgroup гэж нэрлэгдэх класс
ашиглагдсан бна. Threadgroup Нь thread-үүдийн бүлэг. Thread -Ийг хамтад нь
бүлэглэхийн давуу тал нь нэгэн зэрэг бүлэг дэх бүх thrad-үүдийг түр зогсоох
буюу буцаан идэвхжүүлж болно. Энэ програм нь thread обьектын 2 массив
үүсгэж байна. +1;+2 мөн “g1” “g2” нэртэй 2 обьект үүсгэж байна. тэгээд
тэдгээрт харгалзан group1, group2 нэрүүд оноож байна. энэ нь а1-а2 руу re1ийг
дамжуулах 100 thread-үүдийг үүсгэж тэднийг “g1”рүү нэмж эхлүүлж байна.
мөн “g2” адил. Дараа нь програм төгсгөлтэй давталтанд орж байна.Энэ давталт
нь бүх thread-үүд ажлаа дуусган хүртэл ажиллана.Энэь threadgroup дэх идэвхтэй
thread-үүдийн тоог тодорхойлох activecount метоор хйигдэнэ.
Thread үүсгэхэд програм transferthread обьектыг ашигласан.Энэ класс нь
байгуулагч метод thread run нь эргүүлээд методыг дуудна.
Thread-үүд бие биеээсээ үл хамааран ажиллаж байгаа тул өгөгдлийн гэмиэл
гарна.Асуудлыг шийдэх зам тал буюу 2 түүнээс дээш thread-ээр хангагдаж
байгаа нөөцийн хувьд synchronized гэж тодорхойлох хэрэгтэй.Дээрх програмд
transfer метод нь өгөгдлийг зөв шилжүүлэхийн тулд synchronized байх ёстой.
Тиймээс transfer метод дараах байдлаар тодорхойлогдох ёстой.
Synchronized void transfer (account from accoun to float amt)
Метод synchronized гэж зарлагдсаны үр дүнд энэ метод нь түүнийг эхний thread
дуудах үед monitor-руу ордог. Тэгээд бусад thread-үүд эхний thread-ийг гартал
түүнрүү хандаж чадахгүй.
6.5 inter thread communication
методод synchronized түлхүүр үгийг хэрэглэсэнээр бусад thread-үүд дуртай
цагтаа уг методруу хандахыг блоколдог. үүнийг т аметодын тусламжтайгаар
хийж болно. Энэ метод нь идэвхтэй ийг мониторруу өгөх ба бусад методууд тэр
мониторруу орох хүртэл түр зогссон байдаг.мөн notify методыг дуудна. Энэ нь
-82-
С.Ууганбаяр
JAVA програмчлал
ижил обьект дээр wait-ийг дуудсан тэр эхний thread-ийг сэргээнэ. Эн
этохиолдолд олон thread-үүд wait-ийг ижил обьект дээр хэрэглэн түр зогссон
байх ба та тэднийг notify all методыг ашиглан буцааж болно.
Эдгээр бүх методууд нь зөвхөн synchronized методоос дуудагдана.
Ийн хэрэгцээг ойлгохын тулд жишээ үзье.produser consumer-ийн асуудлыг
харуулсан жишээ авъя. 2 методтой дараалал байг. –put Ба –get. Put метод нь
дараалалд байх тоо оруулдаг, get нь авдаг. Produser Класс нь дарааллын эхний
утгыг тогтоож, дараалалд нэгээс эхлэн төгсгөлгүй бүхэл утгуудыг тавих thread-
ийг эхлүүлдэг.
Consumer Класс нь мөн дарааллын эхний утгыг тогтоож дараалал дахь утгуудыг
авдаг thread-ийг эхлүүлдэг байг. Дараахь код байг.
Class queen 1
Int n;
Synchronized int get () {
System out printin ( “ got:” +n);
Return n;
}
synchronized void put ( int n) {
this.n=n;
system.out.println (“put:”+n);
}
}
class produser implements runnable{
queen q;
produser (queen q){
this.q=q;
new thread (this, “produser”).start+( );
}
public void run ( ) {
int i=0;
while ( true) {
q.put (I++);
}
}
}
class consumer implements runnable {
queen q;
produser (queen q){
this.q=q;
new thread (this, “produser”).start+( );
}
public void run ( ) {
while( true) {
q.get ( )
}
}
}
class interthread {
public static void main ( string args) {
queen q= new queen( );
-83-
С.Ууганбаяр
JAVA програмчлал
new produver (q);
new consumer (q);
}
}
Үр дүнд нь:
put :27
get :27
put :28
get :28
get :28
put :29
get :29
put( ) get( ) методууд нь хүёулаа synchronized гэж тодорхойлогдсон. Гэвч 28
тоо 2 удаа хэвлэгдсэн байна. энэ нь үл хамааарах методууд synchronized
зарлагдана гэсэн үг. consumer дараалан 2 удаа авах эсвэл producer consumer –
аас илүү гарч ажиллах зэргийг зогсоох зам байхгүй. Энэ нь дээр хэлсэнээс
харагдаж байна. producer дараалалд 28 тоог тавьсан, consumer тэр утгыг 2 удаа
авч байна.
бид энэ програмыг зөвхөн тавьж дууссаны дараа дараалал руу хандахаар мөн
хандсаны дараа утгыг тавихаар өөрчилөе. Ингэж өөрчлөхийн тулд классад
зарим өөрчилөлт хийнэ.
Class queen {
Int n;
Boolean flay= false;
Synchronized int get ( ) {
If ( flay==false )
Try {
Wait ( );
} catch ( interrupted exception e ) { }
system.ant.printen (“got:”+n );
flag= false;
modify ( );
return n ;
}
synchronized void put (int n) {
if (flay== true)
try{
wait ( );
} catch (iterruped exception e) { }
this.n = n;
flag=true;
system.out.println ( “put:”+n);
modify( );
}
}
6.6 Thread ашиглан animation үүсгэх
animation гэдэг бол зураг, дуу авиа, текст гэх мэтийг байрлуулсан frame-ийн
процесс юм. Энэ frame нь дараа нь дэлгэц дээр зурагдана. Frame үүсгэх энэ
процесс ба тэдгээрийг дэлгэц дээр зурах нь хуурмаг хөдөлгөөн үүсгэхийн тулд
давтагддаг. Frame бүрийн хооронд нийт хугацаа нь ялгаатай байж болдог.
-84-
С.Ууганбаяр
JAVA програмчлал
Animation үүсгэхийн хэрэгцээг ойлгохын тулд цэг дүрсэлдэг дараах жишээг
авъя.
inport java.util.Gregorian calendar;
import java.text.dateformat;
import java.awt.x
public class clock extends java аплет.аплет{
int xcontre ycentre, clock radins;
dateformat df;
gregoriancalendar col;
public void init ( ){
df=dateformat.getdatetime instance ( );
clockradins=(int) ((getsize( ).width( )*0.5*0.7)
xcentre= (getsize( ).width( )/2;
ycentre= (getsize( ).width( )/2;
}
public void point (graphics g){
g.setcolor (color.black);
g.draworal (vcentre.clockradins, ycentre-clockradins, 2*clockradins);
g.drawstring (“12”, xcentre-5, ycentre-clockradins);
g.drawstring(“3”, xcentre+dookradins, ycentre+3);
g.drawstring(“6”, xcentr-2, ycentre+ dookradins+10);
g.drawstring(“3”, xcentr- dookradins -10, ycentre+3);
col= new Gregorian calendar;
int s= (int ) col.get (Gregorian calendar.second);
int strength= (int) (dookradins*0.9);
int secondx= (int) (math.cos((s/60.0)+2*math.pi-math.pi/2)*slenght+xcentre);
int secondy= (int) (math.sin || s/60)*2*math.pi-math.pi/2)*slenght+ycentre);
g.setcolor (color.green);
g.draw.line (xcentre. Ycentre, secondx, secondy);
int m=(int)col.get (Gregorian calendar~minute);
int m length= (int) (calendar radius*0.8);
int minutex=(int)(math.cos((m/60.0)*2*math.pi-math.pi/2)*mlenght+xcentre);
int minutey= (int) (math.sin((m/60.0)*2*math.pi-math.pi/2)*mlenght+ycentre);
g.setcolor( color.blue);
g.drawlink(xcentre, ycentre, minutex, minutey);
int h= (int) col.get (Gregorian calendar.hour_of_day);
int hlenght=(int)( dookradius*0.7);
konble hourangle=(h/12.0)*2*math.pi+(m/60.0)*(2*math.pi/60.0)-math.pi/2;
int hourx=(int) (math.cos (hourangle)*hlenght+xcentre);
int houry=(int) (math.sin (hourangle)*hlenght+ycentre);
g.setcolor (color.red);
g.drawline(xcentre, ycentre, hourx, houry);
string today= ds.format(col.gettime() );
font metrics sin =g.setfontmetrics();
g.drawstring(today,(getsize().width—sin.stringwidth (today))/2,
ycentre+clockradius+30);
}
}
-85-
С.Ууганбаяр
JAVA програмчлал
Бид гэж юу болох, ямар нөхцөлд ийг хэрэглэхийг мэднэ. Animation бол thread-
ийн бодит зорилго юм. Thread-үүднь давтагдан үргэлжилсэн үйлдэл, жишээлбэл
gnimation адил зурах үйлдлүүдийн нөхцөлд чухал зүйл болдог. Thread-тэй
аплет үүсгэхийн тулд програмд дараах өөрчлөлтүүдийг хийх ёстой.
1.класс зорилт нь Implements runnable class-ийг агуулах
2.програм Thread обьект үүсгэх ёстой
3.Thread үүсгэх аплет-ийн start методыг дарж тодорхойлох, түүнийг ажлуулж
эхлүүлэх
4.Thread-ийн ажиллагааг зогсоох аплет-ийн stop методыг драж тоодорхойлох
5.hread-ийн ажиллагаанд зориулсан run методыг үүсгэх, энэ метод нь repaint
методыг дахин дахин дуудах ёстой.
Бид идэвхтэй цагийг дүрсэлдэг програм зохиосон, одоо түүнийгээ дэд класс
болох animation үүсгэх класс байгуулъя.
Inport java.out.x;
Public void start( ) {
If (t==null) {
T=new thread (this);
t.start( ) ;
}
}
public void run( ) {
htread this thread=thread.currentthread( );
while (t==thisthread) {
repaint ( );
try{
thread.sleep (1000);
}catch (interrupte1exception e) { }
}
}
public void stop ( ) {
if (T!=null)
t=null;
}
}
Дээрх жишээнд тухайн йззлжэ-ийг параметр болгон авдаг. Thread обьектыг
үүсгэж байна. аплет-ийн start метод thread-ийг үүсгэж, эхлүүлдэг. Stopt метод
нь Thread обьектод null утга олгоод thread-ийн биелэлтийг зогсооно.thread-ийн
start тетод нь run методыг дуудна.run метод point методыг дуудаж аплет-ийн
дэлгэцийг дахин дуудна. Энэ ньwhile (+==thisthread) давталтаар хийгдэнэ.
Internet ба intranet-ээс gpplet-д хандах хандлага
inport java.awt.image;
import java.аплет.*;
public class Myanimator extends аплет implements runnable {
MediaTracker mediatracker=null;
Image imagae[ ]=new image [3];
Int index;
Thread ani=null;
Public void init( ) {
Mediatracker=new mediatracker (this);
-86-
С.Ууганбаяр
JAVA програмчлал
For (int I=0; I++) {
Image [I]=get image( getdocument base ( ),”fr”+I+”jpg”);
Mediatracker.addimage (image[I],0);
}
}
public void start( ) {
if (ani==null {
ani=new thread (this);
ani.start ( );
}
}
public void stop ( ) {
if (ani!=null) {
ani.stop ( ) ;
ani.null :
}
}
public void run ( ) {
for (;;) {
if ( index<3)
index++;
else
index=0;
repaint ( );
try {
ani.sleep (1000);
} catch (exception e) { {
}
}
public void paint (graphics g) {
if ( mediatravker.check ID (0,true))
g.drawimage (image index, 0,0,this);
}
public void update( graphics g) {
paint (g);
}
{
дээрх програмд mediatracker классыг ашигласан. Mediatracker Бол “java.awt”
какет дэх утилит класс бөгөөд images зэрэг media обьектуудын төлвийг
удирдахад хэрэглэдэг. Mediatracker Обьектын хэрэглэхийн тулд imageobserver-
ийн заалтыг дамжуулдаг. Зураг бүр “addimage” метод дээр даралтанд ордог,
өөрөөр хэлбэл дуудагдана. Зургуудад ID оноодог. Энэ утга нь олон зургуудад
ашиглагдаж болно. Тэгээд хэрэв харахыг хүсвэл зургийн байдлыг дүрслэхэд
бэлэн бол түүнийг ID-ээр нь удирдаж болно. “check ID(0,true) Метод нь 0
дугаартай бүх зургууд ачаалагдсан эсэхийг шалгана, хоёр дах аргумент load flag
нь бол таалагдаагүй байгаа зургуудыг ачаалж эхэлдэг. Animaation-Ний нэг хэсэг
болж багтах зургууд бол “fro.jpg” “frd.jpg” “fr2.jpg”. Энэ аплет-руу хандах html
file бий
<аплет
code= “myanimator.class” width=500, hight=500>
-87-
С.Ууганбаяр
JAVA програмчлал
</аплет>
Үүнийг Intranet server дээр ачаалахын тулд “myanimator.class” “fro.jpg” “frd.jpg”
“fr2.jpg” “html” файлуудыг ёерверийн үндэс каталогруу жишээлбэл: NT server –
д “innetpubviewroot” хуулна.Килентүүд энэ файлруу хандахын тулд сервер
хаягийн ардаас ”/html” файлын нэрийг залгаж бичнэ. Жишээ нь:
http://163.122.882170/animation.html энд 163.122.88.170 нь сервер хаяг.
Адилхан internet-д ачаалахын тулд webserver-д өгөгдөлийг ачаалах эрх байх
ёстой. Та өөрийн эрхээр ftp”server name” гэж хандана.
C:mydir>ftp 163.122.88.170
Connected to 163.122.88.170
User:
Password:
Ftp>bin
ftp>put byanimator.class
ftp>put animation.html
ftp>put fr0.jpg
ftp>put fr1.jpg
ftp>put fr2.jpg
ftp>byl
Машины нэрийг зааж ftp командын тусламжтайгаар алсын машинтай
холбогдоно. “fit” командаар горим тогтооно. Дараань “put file name” командаар
серверрүү бүх файлаа тавина. Layout хийхийн тулд “bye” гэж бичиж enter
дарна.
Нэгэнт таны класс файл Internet сервер дээр ачаалагдсан болохоор та
http://siteaddress/html.filename гэж бичиж болно.
Мэдээлэлийг дэлгэцэн дээгүүр хөдөлгөх
Animation үүсгэх өөр програм бичие. Дэлгэцэн дээр мэдээлэлийг хөдөлгөх. Энэ
програм нь мэдээлэлийг дэлгэцэн дээр хүрээнүүдээр зурна. Хүрээ бүр нь
хөдөлгөх эффект үүсгэхийн тулд нэг текстийг ялгаатай өнгүүдээр дүрсэлнэ. Энэ
зорилгоор бид бүх өнгүүдийг агуулсан color обьектуудын массивыг ашиглан
үүнийг аплет зурагдах болгонд хэрэглэнэ.
Import java.awt,a;
Public class flash extends java.аплет.Аплет.implements runnable {
Font f;
Color colore [ ]=new color [150];
Thread t=null;
Public void init ( ) {
F= new font (“timeroman”, font.bold,28);
}
public void start ( ) {
if (t==null){
t= new thread (this);
t.start;
}
}
public void stop( ) {
if (t!=null)
t=null;
}
public void paint (graphics g) {
-88-
С.Ууганбаяр
JAVA програмчлал
g.setfont (f);
g.drawstring (“welcome to java2 platform:,10,40);
}
public void run ( ) {
float c=0.0f;
for (int I=0; I<colors length; I++){
if (I<50)
colors [I]=color.get HSBcolor (c,1.0f,1.0f);
if (I>=50 xx I<100)
colors [I]=color.get HSBcolor (0.0f,c,1.0f,);
if (I>=50 xx I<100)
colors [I]=color.get HSBcolor (1.0f,0.0f,c);
if (;%50==0)
c=0.0f
else
c=c+0.2f;
}
int I=0;
thread thisthread=thread.currentthread ( );
while ( t==thisthread) {
setforeground (colors [ I]);
repaint ( );
I++;
If (I==colors.length)
I=0;
Try{
+.sleep (10);
}catch (interrupted exception e ) { }
}
}
}
}
Энэ програм нь color обьект үүсгэхэд getHSBcolor методыг ашиглаж байна.
6.7 Thread ашиглан animation-д дуу авиа нэмэх
animation аплет thread animation thread
import java.awt.*
import java.аплет.audioclip;
publc class imageanim extends java.аплет.Аплет.implements runnable;
image pics [ ] =new image [10]
image currimage
audioclip c1;
thread timage;
public void init ( );
string picsource [ ] ={“t1.gif”, “t2.gif”, “t3.gif”, “t4.gif”, “t5.gif”, “t6.gif”, “t7.gif”,
“t8.gif”, “t9.gif”, “t10.gif”,
for int I=0; I<10;I++);
Add() функцийн тусгай хэлбэрийг ашиглан нэмэгддэг, add() функцийн эхний
аргумент нь муж, хоёр дахь нь нэмэх компнент. Байгуулагчид:
Public BorderLayout ();
-89-
С.Ууганбаяр
JAVA програмчлал
Public BorderLayout (iint horizontal gap, int vertica gap)
Жишээ:
Import java.awt.*;
Import java.аплет.*;
Public class borderlayout extends Аплет
{
BorderLayout b=1 new BorderLayout ();
Button est, wst, nrth, sth;
Text Area cen;
Public void init ()
{
est =new Button (“East”);
wst =new Button (“Wst”);
nrth =new Button (“North”);
stn =new Button (“South”);
cen =new Text Area ();
set Layout (L1);
add (“East”, est);
add (“West”, wst);
add (“North”, nrth);
add (“South”, sth);
add (“Center”, cen);
}
}
7.3.3 Card Layout
-90-
С.Ууганбаяр

Java programchlal s.uuganbayr

  • 1.
  • 2.
    JAVA програмчлал Лекц №1 1.Java танилцуулга 1.1. Java гэж юу вэ ? Java хэлийг 1991 онд “Green” төслийн нэг хэсгээр Sun Microsystems хөгжүүлж бий болгосон. Энэ төслийн групп нь хэрэглэгчдийн элетрон төхөөрөмжийг удирдах програм хангамжийг хөгжүүлэхээр ажиллаж байв. Энэ хугацаанд тэд Start гэж нэрлэгдэх төхөөрөмжийг бүтээсэн бөгөөд түүнийг удирдахаар төлөвлөж байсан үйлдлийн систем нь С++ дээр бүтээгдэх байв. Гэвч багын нэг гишүүн James Gosling нь С++-ийн бүтээмжийг төдийлөн өндөр үнэлэхгүй байв. Тиймээс тэрээр Start-д зориулж шинэ хэлийг бий болгосон. Тэрээр энэ хэлээ Oak гэж нэрлэсэн, энэ нь түүний offise-ийн гадаа харагдаж байдаг Oak модны нэрийг хэрэглэсэн хэрэг. Сүүлд нь Oak гэдэг нэр нь зарим өөр хэлэнд ашиглагддаг болохыг мэдээд Sun энэ хэлийг Java гэж нэрлэсэн. Java бол платформоос хараат бус объект хандлагат програмчлалын хэл юм. Програм бичих үедээ та энэ програм эцэст нь хаана ажиллахад үргэлж анхаарч байдаг. Жишээлбэл, хэрэв програм Windows платформ дээр ажиллах бол та MFC (Microsoft Foundation Classes)-ийг ашиглана. Хэрэв энэ нь Mac машин бол Mac OS Toolbox-г ашиглана. Түүнчлэн төгсгөлд нь програмаа хэрэгжүүлэх /турших/-дээ програмынхаа эх кодыг янз бүрийн процессортой машин бүрд тохиргоог нь хийж хөрвүүлэх болно, тэгээд энэ нь зайлшгүй програмыг ажиллах машины процессорт тохируулж зайлшгүй хөрвүүлэх хэрэгтэй болно. Үнэ хэрэгтээ энэ нь програмууд Internet-д хэрэгжүүлэх боломжгүй болох юм. Хэрэв бид адилхан сценартай гэж бодвол учир нь та програм тань эцэстээ хаана татагдаж ажиллахыг мэдэж чадахгүй. Энэ асуудлыг эсэргүүцэхийн тулд Java нь JVM /Java Virtaal Machine/ гэж нэрлэгдэх in-built механизмтай байдаг. JVM нь таны програмыг клиентийн машинтай зохицохоор болгодог бөгөөд таны програм интернет дэх дурын машин дээр ажиллаж чадна. С++-тай адилгүй нь, Java бол бүхэлдээ объект хандлагат хэл. Java дахь бүх зүйлс зөвхөн классын дотор бичигдэх ёстой. Классууд дотор бүх зүйлүүдийг хийж хязгаарласнаар програмууд зарим талаар хатуу чанга болно гэж та бодож магадгүй, гэвч энэ нь бүрэн дүүрэн эргэлзээгүй програмчлалын хэв маяг юм. С++-д объект хандлагат ба бүтцийн програмчлалын хэв маягуудыг хослуулан програмаа бичихэд хангалттай уян хатан байдаг. Гэвч энэ хольсон арга нь тийм ач холбогдолтой бус юм. Ингээд зохиомжлогчдийн хувьд бүхэлдээ объект хандлагат аргыг ашиглан зохиомжлоход хялбар болжээ. 1.2. Java хувилбарууд ба хөгжүүлэлтийн хэрэгслүүд Өдий хүртэл Java нь ердөө л 3 чухал хувилбараар өөрчлөгдсөн. Java нь эхлээд Java 1.0 гэж гарч ирсэн, энэ нь одоо хүртэл олонхи brokser-уудын хувьд тохирч байна. Дараа нь Java 1.1 гарсан, энэ нь сайжруулсан хэрэглэгчийн итеррэйс, үзэгдэл боловсруулалттай сайжирсан хэл байв. Энэ хүртэл Java олон өөрчлөлт хийгдсээр эцэст нь Sun сүүлчийн хувилбар “Java 2” гэж нэрлэгдэх Java 1.2.2-г гаргасан. -2- С.Ууганбаяр
  • 3.
    JAVA програмчлал Java ньолон хөгжүүлэлтийн орчинд бичигддэг. Хамгийн хялбархан Java програм хангамж бол JDK /Java Devolepment Kotekit/ 1.0, 1.1, 1.2 юм. JDK-г интернет дэх http://java.sun.com/products/jdk сайтаас үнэгүй татаж авч болно. Java-гийн хувьд олон өөр хөгжүүлэлтийн хэрэгслүүд байдаг: Java Workshop, Borland Jduilder, Symantec Visul Case, Visual Java /VJ++/, SuperCede г.м 1.3. Java-гийн онцлог Java нь объект хандлагат байхаас гадна интернет програмчлалын хувьд чухал онцлогуудаар хангадаг. Архитектур ба Цөм Бодит шинжтэй байсан учраас Java гарч ирсэн цагаасаа л өргөн ашиглагдаж эхэлсэн. Платформ хэлний эсрэг өндөр үр бүтээмжтэй болгон Java өөрийгөө баталгаажуулж чадсан. Java програмууд нь эх кодод ямар нэгэн өөрчлөлт хийлгүйгээр интернет дэх ямарч төрлийн клиент машин дээр ажиллаж чадна. Өмнө хэлснээр энэ бол JVM буюу Java Virtual Machine-д хүрсэн явдал юм. JVM нь таны програмыг шууд техник хэсгүүдтэй харьцахыг зөвшөөрдөггүй бөгөөд код ба техник хангамж хоёрын хоорондох интерфэйс байдлаар ажилладаг. Иймээс Java програм нь клиент тал болдог, энэ нь програмын биелэлтийг локаль процессорт зохицоход тусалдаг. Доорхи тодорхойлолт бол Java програм яаж ажилладаг тухай юм. Java програм нь 2 үе шатанд биелдэг. Java програм хөгжүүлэгчээр хөрвүүлэгдэж дуусаад интернэт сервер рүү ачаалагдана, дараа нь дахин interpret хийгдэж тэгээд ажилладаг. Java програмууд байт код /.class file/ гэж нэрлэгдэх зүйл рүү хөрвүүлэгддэг. Байт код бол байт хэлбэрийн командуудын дараалал юм. Эдгээр командууд нь ямар нэгэн машинд зориулагдсан зүйл биш, харин JVM-д зориулан бичигдсэн. JVM бол виртуаль машинд зориулсан програм юм, ө.х бодит машин биш боловч үнэндээ бол төстэй орчин юм. Байт код буюу class файл өөрөө ажиллах боломжгүй ба түүнийг веб хуудсанд суулгадаг. Та веб хуудсаа HTML-ээр байгуулаад түүний дотроос .class файлыг дуудна. Байт кодыг агуулсан веб хуудас нь түүнийг веб сайт дээр тавигдсанаар интернэтээр тардаг. Веб хуудсын клиент талд браузер ашиглан ханддаг. Браузер нь дотроо Java компонентыг агуулсан байх ёстой, ө.х Java-г зөвшөөрсөн байх ёстой, эсрэг тохиолдолд байт кодыг HTML текст гэж хүлээн авна. Веб хуудас клиентээр дуудагдах үед Java програм HTML документ дотор сууж ажиллаж эхэлдэг. Хамгийн эхний алхам болох хамгаалалтын шалгалт Java код үнэхээр мөн эсвэл биш гэдгийг тодорхойлохын тулд Java кодыг оруулж ирж байх үед хийгддэг. Дараа нь энэ нь холбогдоно, эцэст нь тухайн машины архитектур руу орчуулагдана, энэ хооронд ямар нэг алдаа эсвэл тасралт тохиолдвол тэдгээр нь боловсруулалт хийгдэх ба програм ажиллана. -3- С.Ууганбаяр
  • 4.
    JAVA програмчлал Эх код-- - - - - - Хамгаалалтын - - - - - - - Зур 1.1 Аплет яаж ажилладаг вэ. Хүчтэй Ихэнхи програмууд гэмтлийн тохиолдлуудад бууж өгдөг, учир нь товлосон байдал бүрдээгүй шинжүүд нь байхгүй, эсвэл санах ойн зохион байгуулалт буюу програмын алдаа боловсруулах байдал нь ялгаатай байдлуудад байдаг. Энэ бол санах ойн зохион байгуулалтын дараа авч үзэх маш чухал зүйл юм. Заримдаа тодорхой алдааны нөхцөлүүд, “File not found” зэрэг, тулгардаг. Эцэст нь програм мухардалд ордог! Эдгээр асуудлууд нь Java-д “garbage collection” ба “ exception handling” гэж нэрлэгдэх технологиудаар онцгойлон шийдэгдсэн. “Garbage collection” – “Хог хаягдал цуглуулах” “Хог цуглуулах” технологид daemon /буг чөтгөр, догшин сахиус/ thread заагдаагүй объектуудыг чөлөөлж байдаг. Daemon thread - / систем харьцангуй чөлөөтэй болох үед амьтай болдог thread/ Тиймээс програм зохиогч heap муж дүүрэгийн тухайд зовох хэрэггүй. “Exception handling” – “алдаа боловсруулах”: “Exception handling” механизмд массивын доод хязгаарын элементэд хандахыг оролдох зэрэг програмыг сүйрүүлэхэд хүргэдэг тохиолдлуудыг түүнийг ажиллаж байх үед нь засаж шийддэг. Найдвартай, Аюулгүй Java програм нь интернэтээр зөөвөрлөгдөн хэн нэгний машин дээр ажиллах чадвартай, гэвч хүлээн авагч ирсэн програмыг ямар нэг сүйтгэх ажиллагаа хийхгүй гэдэгт яаж үнэмшиж, итгэх вэ? Та үргэлж мэддэг эх сурвалжаас - - - - - - - шалгалт Java хөрвүүлэгч 00110100 01000100 01000010 (.java файл) Орчуулалт 01011000 Алдаа боловсруулалт Код интернэтээр зөөвөрлөгдөнө Байт код (.class файл) Биелэх код Хөгжүүлэлтийн төгсгөл Интернэт Клиент -4- С.Ууганбаяр
  • 5.
    JAVA програмчлал мэдээллийг татдаггүй,мөн энэ нь татсан програмуд файл систем рүү хандах, тодорхой файлуудыг устгаж болно. Тиймээс Java програмыг найдвартай байлгахын тулд Java нь интернэтээс ирээд браузер дээр ажиллаж байгаа аплет гэж нэрлэгдэх програмудад локаль системийн файл систем рүү хандахыг зөвшөөрдөггүй. Хэдий тийм боловч заагч нь үнэхээр уян хатан, програм бичихэд хүчтэй, Java нь заагчийг бүрэн ашиглахыг хягаарласан. Энэ нь Java програмуудыг маш аюулгүй болгоно, энэ нь дур зоргоороо дурын санах ойн байрлалд бичилт хийх эсвэл системийн нөөцүүдийг онгичих боомжгүй болгоно. Аплет өөрийн зорьсон газраа ирэхэд түүнийг орчуулахын өмнө хамгаалалтын шалгалт түүн дээр явагдана. Энэ нь ирсэн Java кодыг үнэхээр Java код мөн эсэхийг баталгаажуулна. ө.х энэ нь ямар нэгэн вирустай төстэй тодорхойгүй элементүүдийг агуулах ёсгүй. Та мөн өөрийн Java кодоо илгээхийн өмнө тэмдэг хийж болох ба хүлээн авагч түүнийг авахын тэмдгийг /шошго, хаяг/ тааруулж болно. Үүнийг таны кодын цифрэн тэмдэг /digital sign/ гэх ба хэрэв тэмдэг тохирохгүй бол та хэн нэгэн гуравдагч хүн кодыг онгичсон /hack/ гэж мэдэж болно. Энгийн, хялбар Нэгэн объект хандлагат програмчлалын үндсэн ойлголтууд тодорхой болсон бол та үр бүтээлтэй Java праграммуудыг маш хялбархан бичиж чадна. Олон хэлүүд тодорхой тооны онцлогуудаар тодорхой зорилгын хэрэгжүүлэх боломжуудаар хангадаг. Энэ нь эргээд хэнийг эмх цэгцгүй, сурахад хэцүү болгодог. Java нь энэ аргыг хэрэглээгүй бөгөөд үндсэн чухал онцлогуудыг үлдээхийг зорьсон, мөн нийлмэл төвөгтэй байдлуудаас зайлсхийсэн. Java классын сан дахь классуудын тусламжтайгаар асар их чадал бий болсон. Distributed Java объектууд нь интернэт дэх чухал серверүүдээр тархаж чаддаг. Тэдгээр объектууд нь дурын Java програм дотор агуулагдах, мөн тэдгээр нь түүний өөрийнх нь компонентууд бол ажиллуулдаг. Лекц№2 1.4. Java дахь програмын төрлүүд Java хэл нь үндсэндээ програмын 2 төрөлтэй байдаг, аплет ба програм / өгүүлэмж/ Аплет бол браузераар интернэтэд ажиллах чадвартай програм юм, өгүүлэмж –д ийм боломж байхгүй. Браузер нь апплетыг ажиллуулж чадахын тулд өөр дотроо Java компонентийг агуулсан байх ёстой. Internet Explorer 3.1 ба түүнээс дээшхи хувилбарууд аплет-г амжилттай ажиллуулж чадна. Энэ хоёрын хоорондох өөр нэг гол ялгаа бол өгүүлэмж бол локаль файл систем ба нөөцүүд рүү хандаж -5- С.Ууганбаяр
  • 6.
    JAVA програмчлал чадна, харинаплет үүнийг хийх хориотой. Програм бол та түүний функцүүдийг /үүргүүдийг/ маш сайн мэдэж байдаг бүрэн дүүрэн итгэлтэй, мөн та програмаар хэн тань руу хандсаныг мэддэг. Апплетын хувьд програмыг зохиогч нь хэн болох тухай мэдэхгүй, эсвэл програм хангалттай аюулгүй эсэх талаар. Үүнийг толгойдоо хадгалж, аплетууд ирсэн зөвхөн тэр машиныхаа файл систем эсвэл бусад хэсэг рүү хандах боломж локаль буюу клиент машинуудаас / дэдний ажиллах/ илүү байдаг. 1.4.1 Өгүүлэмж Өгүүлэмж ба аплетууд нь Java дахь бүх зүйлтэй адилхан классууд хэлбэрээр бүхэлдээ бичигддэг. Классын гадна бичигдэх ямар нэгэн зүйл байж болохгүй, С++-тай адил классын гадна функцүүдийг тодорхойлох г.м зүйлс боломжгүй. Классыг нэр нь нэрлэх ёсыг дагах ёстой бөгөөд том жижиг үсгүүд ялгаатай. Өгүүлэмж биелүүлэх үед JVM нь файлын нэртэй ижил нэртэй класс байгаа эсэхийг хайдаг. Энэ класс нь эхлэх класс /initrating class/ гэж нэрлэгддэг. Pullic хандалттай класс нь түүнийг гадна харагдана гэдгийг тодорхойлдог, ө.х JVM-д харагдана. Энэ нь “main” гэж нэрлэгдэх методтой байдаг ба энэ нь compiler-аар автоматаар хамгийн эхэлж ажиллах метод юм. Энэ методоос бусад бүх классууд ба тэдний методууд холбогддог. Өгүүлэмжийн энгийн жишээг үзье. public class SimpleApp { public static void main(String args[ ]) { System.out.println(“Та өөрийн анхны програмаа үүсгэлээ”); } } JDK-д өөрийн гэсэн хөгжүүлэлтийн орчин байдаггүй. Програмууд DOS editor, notepad дээр бичигдэж болно. Файл нь эхлэн классын нэртэй адилхан нэртэй .java өргөтгөлтэй хадгалагдах ёстой, дээрхи тохиолдолд энэ нь ‘SimpleApp.java’ байна. Одоо main() методын тодорхойлолт дахь чухал хэсгүүдийг авч үзье. public түлхүүр үг нь main() методыг програмын гадна харагдахаар болгодог, ө.х main() методыг хөрвүүлэгч харах болно. Static түлхүүр үг нь main()–г агуулах классын хувийг үүсгэлгүйгээр JVM шууд main ( ) метод руу хандаж чадна. void түлхүүр үг нь main () метод ямар нэгэн утга буцаахгүй гэдгийг заана. System.ont.println() нь гаралтын стандарт урсгал руу өгөгдөл хэвлэх метод юм. Энэ нь агуулгыг хэвлэсний дараа шинэ мөрөнд шилжинэ. Програм дараа нь хөрвүүлэгчээр (javac) хөрвүүлэгдэнэ. Өмнө path=;c:javabi;c:javalib;c:java2include гэж Java 2-н Java програмуудыг агуулж байгаа замыг хаах хэрэгтэй. C:> javac SimplApp.java Хөрвүүлэлтийн дараа byte кодыг агуулах .class файл үүснэ. Үүнийг дараа нь C: > java SimpleApp -6- С.Ууганбаяр
  • 7.
    JAVA програмчлал 1.4.2 Аплет Програмтайадилхнаар файлын нэртэй адилхан нэртэй класстай аплет-г бичнэ. Програмтай адилгүй нь main метод байхгүй. Бусад чухал методууд аплет-д байдаг. Import java.аплет.*; Import java.awt.*; Public class Apple extuds Аплет { public veid paint (graphics) { g.drawstring C” An apple a Day Keeps the Doctor Away”, 50,50); } } Эхний 2 бичиглэл нь аплет-д пакетуудыг багтаах буюу импортлох үүрэгтэй. Пакет бол тусгай нэрийн дор категорчлогдсон классудын олонлог бөгөөд санд (librory) хадгалагддаг. Энэ програм java. Пакетыг paint () методыг ашиглахын тулд, java.аплет-г main классыг Аплет классаас урамшуулахын тулд include хийж болно. ‘ extends’ түлхүүр үг нь удамшилд хэрэглэгддэг. Paint (Graphics-д) метод нь аплет-д зураг, текстийг зурахад ашиглагддаг. Энэ нь аплет-н график колтекстыг автоматаар параметр болгон авдаг. График колтекст бол ямар нэгэн зүйл зурах бичих муж юм. Тиймээс paint() функц дэх ‘Graphics- д’ нь аплет-н график колтекстыг өгдөг. Аплет-д текст бичихийн тулд бид drawString (String text, int posx, int posy) функцийг ашиглана. Дээрхи аплет нь классын нэртэй адил Аплет.java гэсэн нэртэй хадгалагдаж, дараах байдлаар хөрвүүлэгдэнэ. Javac Apple.java Энэ нь byte кодыг агуулах .class файлыг үүсгэнэ. Энэ нь аплет учраас .class файл нь HTML документ дотор суулгагдах ба браузерээр ажиллана. Хамгийн энгийн HTML документ дараах байдалтай бичигдэж болно: <html> <head> <title> “The Аплет is Rumming” </title> </hend> <body> <аплет code=”Apple” heigt=200_width=200> </аплет> </html> 1.5. Java хэлний элементүүд 1.5.1 Операторууд Төрөл Зорилго Тэмдэглэгээ Хэрэглэх байдал -7- С.Ууганбаяр
  • 8.
    JAVA програмчлал Арифметик Нэмэх+ Int no =1+1 Хасах - Int no =1-1 үржих * Int no =1*1 хуваах / Int no =1/1 үлдэгдэл % Int no =1%1 нэмэгдүүлэх ++ no++ буюу ++no нийлбэр олгох += no+=4 ялгавар олгох -= no- =4 үржвэр олгох *= no* =4 ногдвор олгох /= no/ =4 үлдэгдэл олгох %= no%=4 хорогдуулах - - no- - буюу - - no Бит үгүйсгэл ~ ~a ба & a&b буюу ab xor ^ баруун шилжилт >> баруун >>> тэгээр дүүргэх зүүн шилжилт << Хөрвүүлэх Тэнцүү == Тэнцүү биш != Их > Бага < Их буюу тэнцүү >= Бага буюу тэнцүү <= 1.5.2 Өгөгдлийн төрлүүд Java-д 8 үндсэн өгөгдлийн байдаг. Эдгээрээс чадал класс, интерфейс, массив зэрэг өгөгдлийн төрлүүд байдаг. Класс ба интерфейсийн тухай сүүлд гүнзгий үзнэ. Өгөгдлийн төрөл Урт Хэмжээ Хэрэглэнэ Byte 8 -128 127 Short 16 -32768 32767 Int 32 -2147483647 2147483647 - 263 263 -1Long 64 Double 64 1.7e – 308 1.7e + 308 Илүү нарийвчлалтай fleat 32 3.4e – 038 3.4e +038 Бага нарийвчлалтай char 16 0- ээс 65536 Java нь тэмдэгтийг дүрслэхэд Unicode –г ашигладаг. Тэмдэгт нь кодоор эсвэл тэмдэгтээр олгогдож болно. Char choice=1y 1; Char trop = 27; -8- С.Ууганбаяр
  • 9.
    JAVA програмчлал boolean True/falseBoolean flag=true; 1.5.3 Бүтцүүд ба илэрхийлэл (Statemant and Expressions ) Бүтэц гэдэг нь тодорхой зориулалттай хэсэг дэх командууд юм. Java дахь зарим бүтцийн бүтцийг авч үзье. Dear reply = ‘y’; Int book –no; System.ont.println(” resulting statemant g”) Java дахь бүх бүтцүүд цэгтэй таслалаар (semicolon) төгсдөг. Бүтцүүдийг бүлэглэхэд нээх, хаах “{}” хаатлтуудыг хэрэглэдэг. Нээх, хаах хаалтуудтай тодорхойлогдсон бүтцүүдийг олонлогын блок гэж нэрлэдэг. ---------------------------------- { int count=0; ---------------- ---------------- { count=count+1; ---------------- ---------------- } } Илэрхийлэл гэдэг нь операторууд ба операидуудаас бүрддэг, эдгээр нь утгыг гаргадаг. 1.5.4 Хувьсагчид ба утгууд (тогтмолууд) (Variables and Literals) Хувьсагч бол хамгийн үндсэн хадгалах нэгж юм. Энэ нь дараахь байдлаар тодорхойлогдоно: Type identifier=value; Жишээлбэл, boolean status=true; int heigt=60; Утгын жишээ, “lilly”, “tulip”, 100, 5179, 79 г.м 1.5.5 Тайлбар Тайлбар нь хоёр байдлаар бичигддэг: ‘// ’ ба ‘ / * * / ‘. // нь дан мөр тайлбарт хэрэглэгдэнэ. Энэ нь хаа ч бичигдэж болох бөгөөд compiler түүний ардаас бичигдсэнийг үл хэрэгсдэг. / * * / нь блок тайлбар оруулахад хэрэглэгддэг. Хэд хэдэн тайлбар хийхэд хэрэглэнэ. 1.5.6 Хувьсагчийн үйлчлэх хүрээ (Scope) -9- С.Ууганбаяр
  • 10.
    JAVA програмчлал Хувьсагчийн үйлчлэххүрээ нь түүний тодорхойлогдсон блокоор тодорхойлогддог. Хувьсагч нь түүний тодорхойлогдсон блок болон түүн доторхи бүх дэд блокуудад харагдана. Дараахь жишээг үзье: Public class Visibility { public Static void main (String args [ ] ) { block 1 : // энэ бол label { int gvar = 100; block 2: { int lvar = 200; system.out.println (“Глобаль хувьсагч” + gvar); system.out,println (“Локаль хувьсагч” + lvar); } } gvar=gvar+1; System.out.println (“Глобаль хувьсагч” + gvar); Lvar =lvar+1; // алдаа } } } Тэнд: Java-д өөр блокуудад боловч ижил нэртэй хувьсагчид зарлахыг зөвшөөрдөггүй. Жишээлбэл, gvar хувьсагчийг block2 дотор дахин зарлавал алдаа өгнө. 1.6 Програмчлалын элементүүд Програмчлалын элементүүд нь програмын биелэх дарааллыг удирддаг. Java дахь програмчлалын элементүүд нь С++ -аас авсан бөгөөд нэмсэн зүйл байхгүй. 1.7 Массив Массив бол нэгэн ижил нэрийн дор заагдах ижил төрлийн хувьсагчдын бүлэг юм. Массив нь дурын хэмжээст байж болно. Дараах жишээг үзье. Public class EnyBenus { public static void main (String args [ ]) { String ebonus[ ] [ ] =new String [2][5]; Ebonus [0][0]= “P.K.Roy” ; ‘ ‘ ‘ ‘ ebonus [1][4]= “5500”; for (int I=ө; i < 5; I ++) { System.out.println (“Emplorgee name:” + ebonus [0] [ i]); -10- С.Ууганбаяр
  • 11.
    JAVA програмчлал System.out.println (“BonusReceved:” + ebonus[1][i]); } } } Java-д массивтай ажиллах нь бусад хэлэн дэхтэй ижил, гэхдээ массив үүсгэх нь нэлээд өөр: Type name[ ] = new type [no.of elements]; Жишээ нь: int item_code [ ] = new int [10]; String week Days [ ]= new String [7]; New түлхүүр үг нь заалт төрлийн хувьсагчдад санах ой хувиарлахад ашиглагддаг. Java-д тэмдэгттэй ажиллахад ‘String класс’-ийн тусламжтай хийгддэг. Энэ класс нь зөвхөн тэмдэгт мөр үүсгэхийг зөвшөөрдөггүй, гэхдээ тэмдэгтийг боловсруулах олон функцүүдтэй. Хоёр буюу олон хэмжээст массив: Float twoP_Array[ ] [ ]= new float [5][10]; байдлаар үүсгэдэг. Мөн 2 хэмжээст массивын ялгаатай тооны багануудтайгаар үүсгэж болдог. Int list+[ ] [ ] = new int [2][ ]; List[0] = new int [6]; List[1] =new int [15] Лекц№3 2. Java дахь ОХП 2.1. ОХП-н ухагдахуунууд Объект хандлага бол програмчлалын технологи дахь шилжилт юм. Одоог хүртэл програм зохиогчид процедур програмчлалын уламжлалт аргыг хэрэглэж байна. Процедур програмчлалд програм зохиогч заавруудын дарааллыг компьютерийн системд өгдөг. Код том хэмжээтэй болоход кодыг процедур ба функцүүд гэж нэрлэгдэх блокуудад хуваах хэрэгтэйг мэдсэн. Үүнийг бүтцийн програмчлал гэдэг байв. Бүтцийн програмчлал нь кодын удирдаж болох хэсгүүдийг байгуулахад туслана, гэхдээ ижил хугацаанд энэ олон дутагдалтай. Ихэнхи тохиолдолд функц ба процедурууд тэднээс гадуурхи өгөгдлийг ашиглаж байдаг. Үүний үр дүнд модулыг шалгахад маш хүнд болдог., модул бүр зөв ажиллаж байгаа эсэхийг нь мэдэхийн тулд шалгагдаж байдаг, тэр утгыг өөрчилсний дараа гэмтсэнийг мэдэхийн тулд. Энэ асуудал нь програмын хэмжээг нэмэгдүүлэн хүндрүүлдэг. Процедур програмчлал дахь өөр нэг асуудал бол өгөдөлд хоёрдугаарт ач холбогдол өгдөг. Өгөгдөл бол ямар ч програмчлал дахь хамгийн чухал зүйл. Үнэн хэрэгтээ өгөгдөл бол програм яагаад оршиж байгаагын анхдагч учир шалтгаан. Гэвч процедур програмчлалд өөр нэг цохон тэмдэглэх -11- С.Ууганбаяр
  • 12.
    JAVA програмчлал зүйл болфункц, процедуруудын тусламжтайгаар өгөгдөл яаж удирдагдах вэ гэдэгт байдаг. Эдгээр асуудал нь объект хандлагат технологиор шийдэгддэг. Объект хандлагат технологид өгөгдөл нь анхдагч чухалчлал болдог. Объект хандлагат технологийн цөм бол объект. Объект бол өгөгдөл ба тэдгээр өгөгдөлтэй ажилладаг методуудын нэгдэл юм. Үүнийг сайн ойлгохын тулд, ямар нэгэн бодит амьдралын объектод анхаарлаа хандуул, жишээлбэл үзгийг авч үзье. Үзэг бол шинж чанар (өнгө, бие, үзгэн эсвэл бөөрөнхий хошуутай г.м) ба ааш авиртай (үзэг бичдэг) объект юм. Үүнтэй төстэйгээр объект хандлагат технологид объект нь шинж чанар (өгөдөл)ба ааш авирыг (өгөгдөл дээр боловсруулалт хийх методууд) агуулж байдаг. Энэ ойлголт нь процедур програмчлалаас эрс ялгаатай болгодог. Бид объект хандлагын тухай ярих үед объект, класс, хийсвэрлэл, удамшил, полимор , битүүмжлэх зэргийг олон ухагдхуунууд бодит толгойд бууна. Бид объект гэж юу болох тухай ярилцсан, одоо үндсэн ухагдхуунуудыг нэг нэгээр нь тайлбарлая. 2.1.1 Класс Класс нь төстэй объектуудбн цуглуулга. Эдгээр объектууд нь ижилхэн өгөгдлийн бүтэц ба методуудтай байх ёстой 2.1.2 Хийсвэрлэл Хийсвэрлэл бол програмын үндсэн зорилгоос өөрийн сонирхож байгаа зүйлсээ илрүүлэх процесс бөгөөд өөрт хамаагүй нарийвчлалуудын гадна орхидог. Жишээлбэл, Order Processing System-г авч үзье, зүйл бүр нь түүнийг адилтгасан үл давтагдах дугаартай. Энэ зүйл (item) нь тодорхойлолт, үнэ, тоо ширхэг, дахин дугаарлах эрэмблэлтэй байна. Бид мөн өөр өнгө, хэмжээс зэрэг атрибутыг авч болно. Гэхдээ эдгээр атрибутууд ь Order Processing System-д төдийлөн ач холбогдолгүй, тиймээс бид тэднийг өөрсдийн зохиомжоосоо орхиё. Энэхүү таарахыг нь үлдээгээд үл таарахыг нь орхиж байгаа процессыг хийсвэрлэл гэдэг. 2.1.3 Битүүмжлэл Өмнөх хэлснээр объект нь өгөгдөл ба түүнтэй ажилладаг методуудын нэгдэл юм. Өгөгдөл ба методуудыг хамтад нь багцалж байгаа энэ аргыг битүүмжлэл гэдэг. Order Processing System-с адил хэмжээг дахин авъя. Бид өгөгдлийн тал дээр аль хэдийн шийдчихсэн, одоо объектын методуудыг олж тогтооё. Методууд нь: a) Зүйлийн тодорхойлолтуудыг хэвлэх b) Зүйлийн өгөгдлүүдийг оруулах /хүлээн авах/ c) Тоо хэмжээг өөрчлөх d) Материалын утгыг хэвлэх e) Зүйл дахин дугаарлагдах эсэхийг тодорхойлох төвийг хэвлэх. -12- С.Ууганбаяр
  • 13.
    JAVA програмчлал Объект Өгөгдөл Методууд ItemNoPrint Details Description Accept Details Rate Change QOH Quantity on hand Display Value Reorder Level Reorder Status Өгөгдөл ба методуудыг хамтад нь багцалж байгаа энэ арга нь битүүмжлэл бөгөөд энэ нь өгөгдлийн далдлатад хүргэдэг, учир нь гадна талыг интефэйсүүд төлөөлнө харин дотор атрибутууд далдлагдана. 2.1.4 Удамшил Удамшил бол шатлан захирах хамаарал дээр тулгуурласан классуудын хооронд атрибут ба үйлдлүүдийн эзэмшилт юм. Удамшигч нь мөн үндсэн классын бүх атрибутууд ба зан байдлыг түүний sub-класст бэлэн болгож дахин ашиглаж төлөвшдөг. Жишээлбэл, бид order Processing System-д Item гэж нэрлэгдэх объектыг авсан. Компани компьютерийн төхөөрөмж худалддаг гэж бодъё. Тэгвэл энэ Item нь Printer, Stationery, Floppy disk sub-классуудад тохирно. Эдгээр бүх sub-классуд нь нийтлэг itemno, description, rate, qurantity on hand, reorder level атрибуудтай, бид эдгээрийг super класс item-н дор оруулсан. Printer sub класс нь эдгээр бүх атрибут дээр өөрийн хоёр атрибутыг нэмнэ- хэвлэлийн төрөл /laserjet эсвэл Inkjet/, минутад хэвлэх хуудасны тоо. Stationory класс нь мөн Super классын атрибуттуд дээр өөрийн нэг атрибутыг нэмнэ- хуудсын хэмжээ. Floppy disk класс мөн super классын атрибутууд дээр нэмээд өөрийн 2 атрибутуудтай-багтаамж ба хэмжээ. Энэ удамшлыг зургаар үзүүлбэл. Item Item No Description Rate Quantity on hand Reorder level -13- С.Ууганбаяр
  • 14.
    JAVA програмчлал Printer StationeryFloppy disk 2.1.5 Полиморфизм Полифермизм бол өөр өөр объектуудтай ялгаатай байх метод эсвэл үйлдлийн чадвар юм. Жишээлбэл, show функц нь Printer ба Floppydisk классуудын хувьд ялгаатай байна. SiteType Capacity Pages Per Minute Site 2.2 Класс ба объект үүсгэх Бид одоо объект ханлагат програмтай танил боллоо. Одоо Item class-г үүсгэх Java програм бичье. Class Item { Private int itemno; Private string description; Private float rate; Private int goh; Private int roe; Public void display () < System.out.println (“Item Details”); Sistem.out.println (“. . . . . .. . . . ”); Sistem.out.println (“Item number : ” + itemno); Sistem.out.println (“Description : ” + description); Sistem.out.println (“Rate : ” + rate ); Sistem.out.println (“Quantityon hand : ” + ); Sistem.out.println (“Reoder level : ” + roe); Public void change QOH ( int qty, char Status) { If (Status == ‘A’) Qch=qch+qty; Else If (status = = ‘S’) Qoh=qoh-qty; } public void accep+Details ( int ino, String desc, float rt, int qty, int reorder) { itemno=ino; description=desc; rate=rt; qoh=qty; rol=roerder; } 2.3 Санах ойн менежмент (Memory Management) -14- С.Ууганбаяр
  • 15.
    JAVA програмчлал Та Java–д шинэ объект үүсгэхэд пек операторыг ашигладгыг үзсэн. Энэ оператор нь объектын өгөгдөл бүрт тохирох хэмжээтэй бүхэл санах ойг хувиарладаг. Java-д санах ойг удирдах нь динамик ба автомат. Энэ нь зүгээр л объектын шууд заагчийг үүсгэх боломжтой ба сүүлд нь түүнд пек операторын тусламжтай ой хувиарлана гэсэн үг. …………. Item I; ………… ………… I= пеw Item () ; ………. Одоо классын объектын классуудад ой яаж хувиарлагддагыг үзье. Классын объект бүр түүний тусдаа атрибутуудынхаа хувьд ой хувиарлагдсан байдаг. Гэвч нэгэн ижил классын бүх объектууд ижил методуудыг эзэмшинэ. Энэ нь зүгээр л классын объект пек операторын тусламжтай үүсгэгддэг, ой нь түүний атрибутуудад хувиарлагддаг боловч методуудад хувиарлагддаггүй гэсэн үг. Санах ой Item классын методууд Assept Details Display Change QOH Item A Item B Java -д санах ойн удирдлага нь автомат учраас та объектын хэрэглэсэн санах ойг чөлөөлөх хэрэггүй. Java нь хэрэглэгдэхгүй болсон объектуудыг хайдаг хог цуглуулагчтай байдаг ба тэдгээр объектуудаар ашиглагдсан ойг буцаан сэргээдэг. Олон тохиолдолд объект нь түүнийг устгах үед тодорхой үйлдлүүдийг хийдэг. Жишээлбэл, програм файл handl, цонхны тэмдэгтийн файл зэрэг объект устахынхаа өмнө суллах хэрэгтэй болно. Энэ метод нь объект хог цуглуулагчаар чөлөөлөгдөхийн өмнө дуудагддаг. Finalite() методын 1 2 Nuts & Botts Hammer 23.56 75.89 100 156 23 50 -15- С.Ууганбаяр
  • 16.
    JAVA програмчлал тодорхойлж буйэнэ процессыг finalitation гэж хэлдэг. Finalite() методын ерөнхий хэлбэр: Protected void finalite () { ……. ……. } Ямар ч гэсэн та нэг зүйлийг тэмдэглэх ёстой. Хэзээ хог цуглуулагч идэвхждэг мөн Finalite() дуудагддаг болохыг мэдэх боломжгүй. Иймээс та хэзээ Finalite() дуудагдах, эсвэл дуудагдсаныг хэзээ ч баттай хэлж чадахгүй. Та пек оператын тусламжтай объектод санах ойг ил тодорхой хувиарладаг, гэвч түүнийг тодорхойгоор чөлөөлж чадахгүй. Runtime класс Runtime класс нь run-time орчныг битүүмжилдэг. Run-time орчин нь аль хэдийн оршиж байгаа бол та Runtime объектыг үүсгэж чадахгүй. Гэхдээ та getRuntime() методын тусламжтай идэвхтэт run-time орчны заалтыг авч чадна. Та ил тодорхой байдлаар gc() методыг ашиглан хог цуглуулагчыг дуудаж болно. Дараах кодыг хэсэг хог цуглуулагчийг дуудна. ………. ………. Runtime r=Runtime, getRuntime(); r.gc(); 2.4 Төрөл хувиргалт Java програмд олон удаа нэг төрлийн өгөгдөл утгыг өөр төрлийн утга руу хөрвүүлдэг. Жнь: int-с float руу, float-c double руу. Casting бол утгыг түүний анхны төрлөөс өөр төрөлтэй шинэ утга болгох процесс юм. Төрөл хувиргалт нь үндсэн өгөгдлийн төрлүүд (int8 flout8 boolean г.м) хооронд, эсвэл объектуудын хооронд (String, Point, Integer г.м) эсвэл үндсэн төрөл ба объектын хооронд хийгддэг. 2.4.1 Үндсэн өгөгдлийн төрлүүдийн хувиргалт Энэ нь үндсэн өгөгдлийн төрөлтэй нэг утгыг өөр нэг үндсэн өгөгдлийн төрөлтэй болгож хувиргах. Гэхдээ boolean утгууд true эсвэл false гэсэн хоёрхон утга авдаг учраас хувиргалт хийгдэж болохгүй. Хувиргалт нь ихэвчлэн тоон утгуудад хийгддэг. Энэ тохиолдолд дүр утга нь эх утгаасаа том байх хэрэгтэй, жнь: int-г long руу. Учир нь бага утга их утга руу хувиргахад их утгад алдаа гарахгүй. Ийм төрлийн хувиргалт нь автоматаар хийгддэг. Харин, хэрэв дүр утга нь эхээс том байж чадахгүй бол ил төрөл хувиргалтыг хийдэг. Ил төрөл хувиргалт нь дараах байдлаар хийгдэнэ. (data type)value Дараах кодын хэсэг float утгыг int утга руу хөрвүүлж байна. …….. int i ; -16- С.Ууганбаяр
  • 17.
    JAVA програмчлал float f=6.7; I=(int)f; ………. Ямарч гэсэн энэ тохиолдолд өгөгдөл гэмтэнэ. I хувьсагч нь 6 утгатай байж болно, зөвхөн бүтэн утга авна. Өөр нэг бүтэн тоог бодит руу хөрвүүлсэн жишээ үзье. ………. Int i =1078; Double d;; ………… 2.4.2 Объектуудын төрөл хувиргалт Нэг классын объект нь өөр нэг классын объект руу хөрвөж болно. Гэхдээ энэ 2 класс нь хоёул хоорондоо удамшлаар холбогдсон байх ёстой, ө.х нэг класс нь нөгөөгийн sub класс байх ёстой. Энд мөн далд эсвэл ил төрөл хувиргалт хийгдэнэ. Далд хувиргалт нь бага төрлийн объект том төрлийн объект руу хувиргагдаж байгаа үед явагдана. Энэ нь ил хувиргалтгүйгээр sub классын объект нь super классын объект болн ашиглагдаж болно гэсэн үг. Учир нь супер классын бүх атрибут, методууд автоматаар түүний sub классд байдаг. Хэрэв sub классын объект super класс руу хувиргагдаж байгаа бол ил хувиргалт явагдана. Энд бодох ёстой нэг зүйл бит-ын хувиргалтын үр дүнд мэдээлэл гэмтэж болно. Учир нь sub класс бол түүний super классын илүү үүргүүдийг агуулдаг. Объектыг доорхи байдлаар төрөл хувиргана. (class name) object Ж.нь: Item new Item (); Printer P= new Printer(); I=P; // зөв, далд хувиргалт хийгдэнэ. P=I; // буруу, ил хувиргалт хэрэгтэй P=(printer) I;// зөв 2.4.3 Үндсэн төрлөөс объект руу эсвэл объектоос үндсэн төрөл рүү хувиргах Объектын үндсэн төрөл рүү хувиргах буюу vice – versee нь Java-д зөвшөөрөгддөггүй. Учир нь ердийн үндсэн төрлүүд нь класстай адилгүй бөгөөд тэдгээр нь объектоос ялгаатай. Хэдийгээр объектын үндсэн төрөл рүү хувиргах нь зөвшөөрөгдөөгүй боловч Java үүнийг өөр байдлаар бий болгосон. Java.long пакет нь үндсэн өгөгдлийн төрлүүдтэй тохирох классуудыг агуулдаг. Жнь: Integer класс нь int үндсэн төрлийн оронд, үүнтэй төстэйгээр Boolean, Byte8 Character, Long, Void, Double, Float г.м классууд байдаг. Объектын үндсэн төрөл рүү хувиргахын тулд уг классын методуудыг ашиглаж болно. Жнь: String объектыг int рүү хувиргах дараах кодыг харъя: String str = nek String (“4578”); Int i = Integer.Parse Int (str); Дээрхи кодод String-н str объектын бүхэл утгыг авахад Integer классын parse Int методыг ашиглаж болно. Лекц№4 2.5 Байгуулагчид -17- С.Ууганбаяр
  • 18.
    JAVA програмчлал Байгуулагч болобъектын анхан утгуудыг тогтооход ашиглагддаг классын нэг метод юм. Байгуулагч нь бусад классын методуудтай адилхан зарлагддаг. Гэхдээ байгуулагч нь буурах утга байдаггүй ба түүний нэр нь классын нэртэй ижил байдаг. Дараах кодын хэсэг нь Item классын байгуулагчыг тодорхойлж байна. Item() 1 Itemno=0; Description = nek String (); Rate = 0.0 f; Goh = 0; Rol =0; } Энэ байгууллага нь дуудагдсан үедээ объектын өгөгдлүүдэд утга онооно. Байгуулагч дараах байдлаар дуудагддаг: Item I= new Item (); Java нь default байгуулагчийг класс болгонд үүсгэдэг. Хэрэв хэрэглэгч тодорхойлогч бол. Хэрэв хэрэглэгч классын байгуулагч методыг тодорхойлсон бол энэ нь уг классын объект үүсэх үед дуудагддаг. 2.5.1 Олон байгуулагч үүсгэх Класс нь олон байгуулагчтай байж болно. Гэвч яагаад класст олон байгуулагч хэрэгтэй болдог юм бэ? Байгуулагч бол объектын эхний төлвийг байгуулах арга, объектыг олон замуудаар үүсгэхийг хүсч болно. Програмд дуудагдах байгуулагч нь объект үүсч байх үед тодорхой болно. Дараах жишээнд Item-ийн 2 байгуулагчыг тодорхойлж, объектууд хэрхэн ялгаатай замаар үүсгэгддэгийг үзүүдэв. Class Item { Private int itemno; Private String description; Private float rate; Private int goh; Private int rol; Public void display () { System. out. println (“Item details”); System. out. println (“Item details”); System. out. println (“Item number : ‘’ + itemno); System. out. println (“Description : ” + description); System. out. println (“Rate :” + rate); System. out. println (“Quantity on hand :” + qoh); System. out. println (“Reoder level :” + rol); } public void change QOH (int, qty, char status) { if (Status == ‘A’) qoh = qoh + qty; -18- С.Ууганбаяр
  • 19.
    JAVA програмчлал else if(status == ‘s’) qoh=goh – qty; } public void accapt Details ( int ino, string dese, float rt, int qty, int reorder); { itemno = ino; description = desc; rate = rt qoh = qty; rol = reorder; } Item () { // байгуулагч 1 Itemno = 0; Deseription = Rate = 0. 0 f; Roh = 0; Roe = 0; } Item (string str) { // байгуулагч 2 Itemno = 0 Description = str; Rate = 0.0 f; Roh = 0; Roe = 0; } } Item.Java файл Import Item; Class Try Item { Public void (string args [ ] ) { Item I=new Item (); // байгуулагч 1-г дуудна i. display; string d=new string (“Nuts 2 Bolts”); Item I=new Item (d); // байгуулагч 2-г дуудна i. display; /* буруу, классд тохирох байгуулаа тодорхойлогдоогүй */ item k=new Item (1, d); k.display(); } } Try Item.java файл Энд импортлогдож байгаа Item класс нь нэгэн ижил каталогт байх ёстой. Default байгуулагч объектын өгөгдлүүдийг яаж Ижил нэртэй боловч ялгаатай тодорхойлолттой 2 функц байвал үүнийг функцийг дахин тодорхойлолт гэдэг. 2.5 Объектуудыг харьцуулах Үндсэн өгөгдлийн төрлүүдийг харьцуулахад == (тэнцүү) операторыг ашигладаг. Доорхи жишээг харъя: -19- С.Ууганбаяр
  • 20.
    JAVA програмчлал Class Compint{ Public strtic void main (string args [ ] ) { Int x= 33; Int y=33; If ( x==y) System.out.println (“Equal”); Else System.out.println (“Not Equal”); Энэ програмын үр дүн нь х, у хоёул тэнцүү учраас “Equal” байна. Одоо Integer классын объектыг ашиглаж ижил програм бичьев Class CompInteger { Public static void main (String args [ ]){ Integer x= new Integer (33); Integer y= new Integer (33); If (x==y) System.out.println (“Equal”); Else System.out.println (“ Not Equal”); } Энэ програмын үр дүн нь хоёр объект хоёул 33 утгатай байхад “Not Equal” байна. Учир нь == оператор нь 2 объектыг харьцуулдаг. Харин объектын утгуудыг харьцуулдаггүй, х бау нь объектууд, тиймээс үр дүн нь “Not Equal”. Ялгаатай объектуудын хувьд ой хувиргалт Санах ой х у 33 33 Дараах байдлаар объектуудыг зарласан үед дээрхи програм нь “Equal” үр дүн гарна. Integer y; y = x; Учир нь зөвхөн ганц объект 33 гэсэн утгатайгаар үүссэн. у объектод санах ой хувиарлагдахгүй учир нь энд байгуулагч метод ашиглагдахгүй. Тиймээс у бол зүгээр л Integer төрлийн объектын заалт, гэвч одоохондоо энэ нь ямар нэг зөв объект заахгүй байна. у=х –н дараа у нь х-н зааж байгаатай адил объектыг заана. Ижил объектыг заах хувьсагчдын санах ой хувиарлалт Санах ой х у -20- С.Ууганбаяр33
  • 21.
    JAVA програмчлал Ингэхлээр, 2объект тэдгээрийн утгын хувьд харьцуулагдах үед == операторыг ашиглаж болохгүй. Хоёр объектод ашиглагдах утгуудыг харьцуулахад equals () методыг хэрэглэж болно. Жнь: Class CompInteger { Public static void main (string args [ ]) { Integer x= new Integer (33); Integer y= new Integer (33); If (x.equals (y)) System.out.println (“Equal”); Else System.out.println (“ Not Equal”); 2.6 Удамшил Бид өмнө удамшлын тухай бяцхан оршил хийсэн. Одоо яаж хэрэгжүүлэхийг авч үзье. Бид Item классыг 5 атритурт, 3 метод, 2 байгуулагчтай тодорхойлсон. Одоо Item классын дэд класс Printer-г нэмэлт атрибутуудтайгаар үүсгэе. Import Item; Class Printer extends Item { String type; Int ppm; Printer () { // байгуулагч 1 Super () ; Type ; Ppm=0; } Printer (int ino8 string desc, float rt, int qty, int reorder, string type, int ppm){ Super (ino, desc,rt, qty, reorder); // байгуулагч 2 This.type = type; -21- С.Ууганбаяр
  • 22.
    JAVA програмчлал This.ppm =ppm; } public void display () { super.display (); // super классын display методыг дуудах system.out.println (“Printer-н төрөл : ” + type); system.out.println (“Минут дахь хуудас : ” + ppm); Printer.java файл Import java.lang.*; Import Printer; Class Try In herit { Public static void main (String args [ ]){ Item I=new Item (1, “Mouse”, 500.89f 1200, 200); i. display (); Printer p=new Printer (2, “Inkjet Printer”, 10000.75f, 200.35, “6P”, 6); P. display () ; } } Try Inherit.java файл Super түлхүүр үг нь super классыг заахад хэрэглэгддэг. Printer классын байгуулагч 1-д Super () бичиглэл нь Item super классын байгуулагч 2-д super (ino, desc, rt, qty, reorder) бичиглэл нь Item super классын байгуулагч методыг (дугаар 1) шууд дуудаж байна. Төстэйгээр Printer классын байгуулагч 2-д super (ino, desc, rt, qty, reorder) бичиглэл нь Item super классын байгуулагч методыг (дугаар 2) дуудаж байна. Printer классын display метод супер классын display методыг дуудагч эхний 5 атрибутыг хэвлээд дараа нь нэмэлт 2 атрибутыг хэвлэж байна. Энэ нь Sub класс супер класс хоёул ижил нэртэй функцүүдтэй байж болно гэдгийг харуулж байна. Printer-н байгуулагч 2 нь мөн this түлхүүр үгийг ашиглаж байна. this түлхүүр үг нь тухайн идэвхтэй объектыг заахад хэрэглэгддэг. Байгуулагч 2 методын аргументуудын нэг нь объектын атрибуттай адилхан нэртэй (type) байгааг ашиглаххэрэгтэй. Энэ нь ямар хувьсагч нь утга өгч, ямар нь утга авч байгаа нь тодорхой байх ёстой. Иймээс this.type = type бичиглэл өгөгдөж байна. 2.7 Полиморфизм Өмнө хэлснээр полиморфизм бол ялгаатай объектуудад ялгаатайгаар харш үйлдэл хийх функцийн чадвар юм. Полиморфизмын 2 төрөл байгаа, static ба динамик полиморфизм. Static полиморфизмд дуудагдах функц нь компиляц хийх үед өөрөө мэдэгддэг. Жнь: Дараах хоёр тодорхойлолттой 2 функц програмд зарлагдсан байдаг: Change QOH (int, char) Change QOH (int) тэгээд програмд дараах команд өгөгдсөн: Change QOH (30); -22- С.Ууганбаяр
  • 23.
    JAVA програмчлал Хоёр дахьфункц дуудагдах бөгөөд энэ нь хөрвүүлэлтийн үед өөрөө тодорно. Хоёрдугаар функц дуудагдах нь энэ тохиолдолд функцэд өгөгдөх аргументын тоо ба төрлөөр тодорно. Зөвхөн нэг аргумент өгөгдсөн учраас 2 дахь функц дуудагдана. Хэрэв хоёр аргумент (нэг нь int нөгөө нь char) өгөгдсөн бол эхний функц дуудагдах байсан. Энэ онцлогыг мөн Функцийн тодорхойлолт буюу Эрт Холболт гэдэг. Dynamic полиморизм бол Хожуу холболт гэж мөн нэрлэгддэг. Динамик полиморизмд дуудагдах функцийн шийдэл нь ажиллаж байх үед шийдэгддэг. Илүү тодорхой болгохын тулд жишээ авъя. Бид өмнө Item ба Printer класс файлууд тодорхойлсон. Printer бол Item классын sub класс. Энэ нь супер классын (Item) заалтыг задлах боломжтой ба тэгээд ажиллаж байх үед нь хэрэглэгчийн оролтоос хамааруулан Item эсвэл Ptinter объект тодорхойлогдож болно. Import Ptinter; Import java.io.*; Class Try Poly { Public static void main (string args [ ]) { Item I; Int ch =0; While ( ch ! = ‘P’ && ch! = ‘N’) { System.out.println(“ердийн Item нэмэхэд N, Printer нэмэхэд P дар”); Try { Ch=System.in.read(); }Catch (I 0 Exception e) { System.out.println (“Error”); } } if (ch==’p’) I=new Println (1, “Laser jet”, 20000f, 100,25. “III plus”, 8); Else I=new Item (1, “Mouse Logitech”, 300f, 100, 20); i. display (); } } Динамик полиморфизмын хэрэгжүүлэх (TryPoly.java) 2.8 Командын мөрийн аргументууд Командын мөрийн аргументууд бол командын мөрнөөс Java програмд дамжигдах аргументууд юм. Java програм нь дараах командыг өгч ажилладаг: Java { class file name} Жишээ нь: TryPoly.class файлыг ажиллуулахад java TryPoly Програмд аргументууд дамжуулахад дараахь команд өгөгдөж болно: Java TryPoly c1 c2 c3 c4 c5 Энд с1 нь эхний аргумент, с2 нь хоёрдох аргумент г.м. Хоёр аргументын хооронд заавал сул зай байх ёстойг анхаараарай. Командын мөрөн дээр аргументыг хүлээн авахын давуу тал нь програм илүү ерөнхий шинжтэй болно. -23- С.Ууганбаяр
  • 24.
    JAVA програмчлал TryPoly.java програмданхаарлаа хандуулъя. Ямар төрлийн объект үүсгэхийг ажиллаж байх үед асуухын оронд командын мөрнөөс аргументаар дамжуулж програмд өгье. Одоо Java яаж командын мөрийн аргументуудыг боловсруулдагыг үзье. Хэрэв програм командын мөрнөөс аргумент хүлээн авсан бол Java эдгээр аргументуудыг тэмдэгт мөрийн массивт хадгалан main() функцэд дамжуулдаг. Дараа нь програм үүнийг хүссэн цагтаа боловсруулж болно. Жишээ нь: Public class TryMain Arguments { Public static void main (string [ ] args) { int I =0; for ( I=0; I < args.lugth; I ++) { System.out.println (“Аргумент ” + (I+1) + “ ; “ + args [i]) ; } } } Командын мөрийн аргументуудыг хэвлэх. Одоо TryPoly.java програмыг дээр хэлснээр өөрчилье: Class TryPoly 1 { Public static void main (String args [ ]) { Item :; If (args. Length !=1) { System.out.println (“Аргументын тоо буруу ”); System.exit (0); } If (args [0]. Equals (“P”)) { I=new Println (1, “Laserjet”, 20000 f, 100, 25, “III plus”, 8); i.display () ; } else if (args [0]. Equals (“N”)) { I=new Item (1, “Mouse logitech”, 300f, 100, 20); i. display (); } else { System.out.println (“Буруу утга ….”); System.exit (0); } } } Лекц №5 3.1 Хандалт ба хандалтын удирдлага -24- С.Ууганбаяр
  • 25.
    JAVA програмчлал Өмнө хэлснээрбитүүмжлэл нь классын өгөгдөл ба методуудын хамтад нь нэгтгэж дан бүхэл болгодог. Битүүмжлэл дэх хамгийн чухал зүйл бол класс дотрхи компонентуудын хамгаалалт юм. Энэ бол классын рүү хандалтыг чангатгахад маш чухал бөгөөд өгөгдөл буруу ашиглагдахгүй. Ийм шалтгаанаар хандалт тодорхойлогчид, public, private, protected, өгөгдөл рүү ялгаатай замаар хандахыг удирдахын тулд тодорхойлогдсон. Хандалт тодорхойлогчид нь өгөгдлүүдийн харагдах байдалд нөлөөлдөг ба мөн классын гадна методуудын харагдах байдалд нөлөөлнө. Эдгээр методуудад классын гадна талаас нэг бол удаанаар эсвэл классын объектыг үүсгэж хандахад Хандалт тодорхойлогчид нь дан класс эсвэл пакетын түвшинд бүлэг классуудтай ажилладаг. Бид одоохондоо хандалт хувиргагчдыг нэг класс хэрэглэнэ. Сүүлд удахгүы пакетын тухай үзнэ. 3.1.1 Default Ямар нэгэн хандалт хувиргагчтай зарлагдаагүй хувьсагч буюу метод нь ижил пакет дотроо бусад классуудад бэлэн байна. Нэгэн пакет дахь классууд public гишүүдтэй адил default хувьсагчдад хандаж чадна. 3.1.2 Public Public хандалт нь классын гаднаас гишүүн өгөгдөл, функцүүд рүү нээлттэй хандахыг зөвшөөрдөг. 3.1.3 Privite Ийм өгөгдөл, функцүүд рүү зөвхөн public гишүүн функцүүдээр дамжин ханддаг. 3.1.4 Protected Protected гишүүд нь уг классаас удамшсан классд дотроос хандахыг зөвшөөрдөг. 3.1.5 Static Класс дотор хувьсагч static-р тодорхойлогдсон үед түүний зөвхөн нэг хувийг классын объектуудын гадна үлдээдэг. Энэ нь мөн кодын дурын бусад хэсгээс хандаж болох глобаль хувьсагч болно. Static <type name> <variable>; Хэрэв метод static-р зарлагдсан бол энэ нь классын заалттай хамт хэрэглэгдэх ба объектод хамаарахгүй оршдог. Static хувьсагчид ба методууд нь классын хувь үүссэн ч үүсээгүй ч сул чөлөөтэй оршдог. Static метод нь зөвхөн бусад static метод, хувьсагчдыг чадна, тэд ямар ч тохиолдолд уг эсвэл super- г зааж чадахгүй. Static хувьсагч ба методуудаас гадна кодын блок мөн static-р тодорхойлогдож болно. Түүнийг static блок гэдэг. Энэ блокын онцлог нь класс ачаалагдах үед л биелдэг кодын бусад хэсэг биелэхээс өмнө. Энэ нь үндсэндээ хийгч дүрэм байдлаар ажилладаг. -25- С.Ууганбаяр
  • 26.
    JAVA програмчлал Class Static_Block { Staticint a; Static { a=a+10; } public static void main (String args [ ]) { System.out.println (“ a-н утга : ” +a); } } Дээрхи жишээнд main () методоос өмнө static блок биелнэ, ‘a’ хувьсагч эхлээд ба дараа нь main () метод биелнэ. 3.1.6 Final Final нь хувьсагч ба методуудтай хамт хэрэглэгдэж болно. Хувьсагч final байдлаар зарлагдсан үед энэ нь тогтмол байдлаар хэрэглэгддэг, түүний утгыг өөрчилж чадахгүй. Тогтмол зарлах жишээ: Final int radias =34 Final float pi =3. 1428f; Float төрлийн хувьсагчдыг зарлахад ардаас ‘f ’ үсэг тавьж ил төрөл хувиргалт хийх шаардлагатай байдаг. Методыг final байдлаар зарлах нь түүнийг байгаагаар нь үлдээхийг хүссэн үед хэрэглэдэг, ө.х методыг дахин тодорхойлохыг хүсээгүй үед методыг Final болгосны үр дүнд түүнийг sub класс дарж тодорхойлохоос хамгаалдаг. 3.2 Хийсвэр класс ба методууд Удамшлын ойлголт нь үндсэндээ классыг гэмтээлгүй дахин байгуулалгүйгээр түүний боломжийг нэмэгдүүлэхэд хэрэгжүүлдэг. Энэ нь ерөнхийдөө нэг бол байгаа методуудыг дарж тодорхойлж эсвэл өөр шинийг шинэ хүү классд нэмж байгаа хэрэг. Гэхдээ эдгээрээс маш ялгаатай нэгэн тохироо байж болно. Танд үндсэн классд ердөө байр эзлэн орших метод тааралдаж магадгүй, энэ нь хүү классуудад үл тохирох бодит хэрэгжүүлэлт юм. Энэ бол run time полиморфизмд хүрэх шалтгаан юм. Энэ тохиолдолд бид байр эзлэгч методыг суурь классд абстрактаар тавьж болно., абстрактаар тодорхойлно гэдэг нь уг метод нь ямар нэг кодтой байж чадахгүй гэсэн утгатай. Абстракт методтой класс нь мөн абстрактаар тодорхойлогдох ёстой, ийм класс нь хувь үүсгэж чадахгүй гэсэн утгатай. Үүнээс гадна, абстракт суурь классаас удамшсан хүү классуд нь энэ методыг тодорхойгоор дарж тодорхойлох ёстой. Мөн хэрэв энэ нь дарж тодорхойлж болохгүй бол тэрхүү хүү класс нь өөр нэг хүү класс түүнээс удамшиж хэрэгжүүлэх хүртэл абстрактаар тодорхойлогдох болно. -26- С.Ууганбаяр
  • 27.
    JAVA програмчлал Үйлчлүүлэгч ресторандтөлбөрөө төлж байгаа тохиолдлыг авч үзье. Тэр төлбөрөө кредит карт, чек, кассаар хийж болно. Нийт төлбөрийг дараах төлбөрийг тооцоог хийнэ. • Хэрэв төлбөр кредит картаар хийгдсэн бол түүнийг шалгаад хэрэв хүчинтэй бол тооцоо хийнэ. • Хэрэв чек бол чекийн дугаар дахь төлбөрийн дансыг авч тооцоо хийнэ. • Хэрэв кассар бол төлбөр шууд хийгдэнэ. Бүх 3 тохиолдлуудын хувьд энгийн төлөх процедур хийхийн оронд get.Payment () нэртэй ердийн абстракт функц байгуулж энэ функцээ Payment классаас удамшсан чек төлбөр, кредит төлбөр, класс төлбөр гэсэн ялгаатай 3 классуудад тус тусад нь хэрэгжүүлнэ. Abstruct class Payment { int file_Number; String customer_Name; String customer_Address; Void accept_ Cust_Details () { ………… ………… } Payment () { // гишүүн хувьсагчдыг тохирох утгуудаар } } abstruct void get_Payment (); // абстракт метод зарлагдана class CC_Pymt extends Payment { void get_Payment () { // кредит картын дугаарыг авах // банкны нэрийг авах // нийт төлбөрийг авах } } class Chq_Pymt extends Payment { void get_Payment () { // чекийн дугаарыг авах // төлөгч банк ба төлбөрийг авах } } class Cach_Pymt extends Payment { void get Payment () { -27- С.Ууганбаяр
  • 28.
    JAVA програмчлал // нийттөлбөрийг авах } } public class Restaurant { public static void main (string args[ ]) { payment p.cc=new CC.Pymt (); p-cc.accept_Cust_Details(); p-cc.get_Payment (); Payment p.chq=new chq. Pymtc (); p-chq.accept_Cust_Details (); p-chq.get_Payment (); Payment p.cach =new cach_Pymt (); p-cach.acept_Cust_Details(); p-cach.get_Payment (); } } main ( ) метод дотор Payment суурь классын гурван объект үүссэн байна. Тус бүр нь төлбөрийн хэлбэрээс хамааран тохирох хүү классыг заасан ба get.Payment () метод руу хандана. Лекц № 6 3.3 Интерфэйс Интерфэйс бол зөвхөн тогтмол ба методуудын prototype- уудаас тогтох классын нэг тусгай төрөл юм. Энэ нь биегүй метод ба хувьсагчийн хувийг хуулдаггүй. Интерфэйсийг хэрэгжүүлэх үед та хэрэгжүүлэлтийн мэдээллийн талаар ямар нэгэн төсөөлөл хийгдэдгүй. Энэ нь интерфэйсийг хэрэгжүүлж байгаа классууд интерфэйс дэх методуудын үүргийг шийдэх болдог. Интерфэйсүүд нь практикт Java –гийн нийлмэл удамшлыг орлодог. Хэдийгээр класс суурь класаас удамшсан боловч энэ нь интерфэйсүүдийг хэрэгжүүлэхийг зөвшөөрдөг. Интерфэйс нь цэвэр абстракт класстай адилхан. Үүний учир нь, тэд хэрэгжүүлэлтийг дэлгэрэнгүй мэдэж чадахгүйгээс эрх мэдэл дутуу байдаг. Гэвч тэдэнд өөр давуу талууд бий. Энэ нь бүлэг классуудын нийтлэг шинжийг жагсаах боломжтой. Эдгээр классууд нийтлэг интерфэйсийг хэрэгжүүлж болох үед интерфэйсийн өөрийн тодорхойлолтоос тэд юу хийх, яаж хийх зэргийн маш тодорхой болгодог. Тиймээс интерфэйсийг хэрэгжүүлж буй классууд нь зүйлүүдийг судлан тусгай шинж чанартай болж болно. Жнь: бид radio класс, television гэсэн 2 класс байгуулъя гэж саная. Эдгээр хоёр классд нийтлэг нэг зүйл байна. Энэ нь дуу. Тиймээс бид sound control нэртэй интерфэйсийг байгуулъя. Тэгээд үүнийг дээрхи 2 класс хэрэгжүүлнэ. Цааш нь дуу ямар чанар байхыг хүсч байгаагаас хамаараад классууд хэрэгжүүлнэ. -28- С.Ууганбаяр
  • 29.
    JAVA програмчлал Интерфэйс дэхfinal ба static хувьсагчид, методууд нь түүнийг хэрэгжүүлэх классд харагдаж (нээлттэй) байхын тулд public – аар зарлагддаг. Классын тодорхойлолт нь inplements түлхүүр үгийг хэрэглэнэ. Доор интерфэйс яаж хэрэглэгдэхийг харуулав. Interfase < interfase – name > { // тогтмолууд // метод prototypes { class <class – name > inplements <interfase - name> { // хувьсагчид // классын методууд // интерфэйсийн методууд } Итерфэйсийг хэрэгжүүлж байгаа класс нь түүн дэх бүх метод prototype- уудыг дарж тодорхойлох ёстой. Энэ нь ямар нэгэн класс Lettover (өмнөх классаар дарж тодорхойлогдоогүй методууд) методуудыг дарах хүртэл. Класс нь зөвхөн дан суурь классаас удамшдаг боловч олон интерфэйсийг хэрэглэж болно. Энэ тохиолдолд классын тодорхойлолт дараах байдалтай: Class <class - name> inplements <interfase – name 1>, <interfase – name 2> { // хувьсагчид // классын методууд // интерфэйс методууд 1 // интерфэйс методууд 2 } Дараах жишээг авч үзье, ажилчдын цалинг тооцоолох , Товчлоод, цалин нь дараах хэсгүүдтэй гэж авъя. Үндсэн цалин, ажлын байрны тэтгэлэг, НRA, татвар шагнал, нэмэгдэл, нийт цалин. Мөн сарын энэ цалин нь шагнал өгөх, жилийн амралтын шагналыг хэвлэх эсэхийг шалгана. Одоо програмын зохиомжийн асуудал дээр анхааръя. 2класс байна, худалдагч, менежер кассууд. Энэ хоёр классын хувьд цалин тооцоолоход зарим нийтлэг шинжүүд байна. Тэдгээр нь HRA, шагнал, нэмэгдэ, татвар, нийт цалинг тооцоолоход хоёуланд хэрэгтэй методууд. Мөн цалинг тооцоолох үед эдгээр бүрэлдэхүүнүүдийг тодорхой үзүүлэх хэрэгтэй. Тиймээс эдгээр методуудын prototype-г тодорхойлсон Calcpay гэж нэрлэгдэх интерфэйс байгуулъя. Дараа нь Clerk (худалдагч ) ба Manager (менежер) классууд энэ инэужфэйсийг хэрэгжүүлнэ. Хэрэв интерфэйсийн ямар нэг метод классын гадна үлдвэл тэр классын хувьд цалин тооцоолж чадахгүй, учир нь уг класс абстракт болох бөгөөд абстракт классын объектын үүсгэж чадахгүй. Мөн худалдагч, менежер кассууд нь Employes гэсэн ерөнхийлсөн классаас удамшина. Interfase Calc Pay { final status string company_Name = “Supersoft ltd”; -29- С.Ууганбаяр
  • 30.
    JAVA програмчлал public intcalc_HRA () ; public float calc_Tax (); public float calc_Bonus (); public float calc_Super_Animation (); public float calc_Gross (); } class Employse { protected int e_id; string ename; protected int basic; Employse (int meid, String name, int mbasic) { e_id = meid; ename = name; basic = m basic; } } class Clerk extends Employle implements CalcPay { Clerc (int seid, String sname, int sbasic) { super (seid, sname, sbasic); } public int calc_HRA () { if (basic < 1000) return (500); else return (900); } public float calc_Tax () { float ani_sal = basic + calc_HRA () + calc_super_animation(); if (ani_Sal > 60000) return ((float).10*ani.sal); else return 0; } public float calc_Bonus() { return ((float).08 * basic) ; } public float calc_Super.Animation() { return (0); } public float calc _Gross() { return (basic + calc_HRA () + calc_Bonus () – calc_Tax () ); -30- С.Ууганбаяр
  • 31.
    JAVA програмчлал } void print.Solary() { System.out.println (“ n ” + Calcpay.companyName); System.out.println (“ Employse Number :” + e_id) System.out.println(“EmployseName :” + ename ); System.out.println(“Basicsolary :” + basic); System.out.println(“HousePentAllowance: ” + calc_HRA()); System.out.println (“Bonus : ” + calc_Bonus() ); System.out.println (“Taxation : ” + calc_Tax () ); System.out.println (“ Cross Solary : ” + calc_Gross () ); System.out.println (“ ………………………………….th “); } } Class Manager extends Employse implements Calc Pay { Manager (int seid, String sname, int sbasic) { super (seid, sname. sbasic); } public int calc_HRA () { if (basic < 6000) return (3500); else return (5500); } public float calc_Tax () { float ann_Sol = basic + calc_HRA() + calc_Super_Animation () if (ann_sol > 130000) return ((float).30*ann.sol); else return ((float).20*ann.sol); } public float calc_Bonus () { return (0); } public float calc_super_Annmation () { return ((float).15-basic); } public float calc_Gross () { return (basic + calc_HRA () +calc_Super_Annmation () –calc_Tax () ); } void print_Solary () { System.out.println (“ ” + CalcPay.company Name); -31- С.Ууганбаяр
  • 32.
    JAVA програмчлал System.out.println (“Employse Namber : ” + e_id ); System.out.println (“Employse Name : ” + ename ); System.out.println (“Basic Solary : ” + basic); System.out.println (“House Rent Allowance : ” +calc_HRA () ); System.out.println (“Taxation : ” + calc_Tax () ); System.out.println (“Superamnation : ” + calc_Super_Amnation ()); System.out.println (“Gross Solary : ” + calc_Gross () ); System.out.println (“……………………………………….n ”); } } public class Payship { public static void main (String args [ ] ) { Clerk c1=new Clerk (3648, “Vinay Sharma” , 800); c1.print_ Solary (); Manager m1 =new Manager (2619, “S.K Lal” , 7000); M1.print_Solary (); } } Интерфэйс нь өөрийн хувийг үүсгэж чадахгүй. Жнь: ifase гэсэн нэртэй интерфэйс байгаад ‘Ifase ofj 1= new Ifase ()’ гэж хэлж болохгүй. Гэхдээ ‘Ifase obj1=new Class1’ нь Class 1 Ifase-г хэрэгжүүлсэн класс байх үед зөв болох юм. Энэ бол runtime полиморфизмийн хамгийн зөв хэрэгжилт юм. Интерфэйсийн өөр нэг онцлог бий. Дараах жишээг үзье: Inforfase Ifase { public void show (); } class A implemens Ifase { public void show () { system.out.println (“a”); } } public class B { public staic void main (String args [ ]) { Ifase obj1=new A(); { public void show () { system.out.println (“c”); } } -32- С.Ууганбаяр
  • 33.
    JAVA програмчлал obj1.show (); obj2.show(); } } Дээрх жишээнд Ifase интерфэйс нь show () нэртэй методтой байна. Энэ интерфэйс дараа нь ‘А’ классаар хэрэгжиж байна, түүний show () методыг дарж тодорхойлж байна. ‘А’ классд ‘Ifase obj1=newA ()’ бичиглэлийг ашиглан ‘А’ классын объектыг үүсгэж байна. Тэгээд үүнийг интерфэйсээр зааж байна гэдгийг илэрхийлнэ. Ийм замаар та интерфэйсийн тусламжтай динамик полимерфизмд хүрнэ. Дараагийн хэсэгт ‘new Ifase ()’-н ардаас бие бичсэн байна. Дахин хэлэхэд энэ бичиглэл нь интерфэйсийг хувилаж байгаа бус, гэхдээ энэ интерфэйсийг хэрэгжүүлэх нэргүй объектыг үүсгээд хаалтан дотор show () методыг дарж тодорхойлж байна. Хэрэв энэ биеийг авч хаяж цэгтэй таслал тавибал интерфэйс өөрийн хувийг үүсгэж болохгүй гэсэн алдааны мэдээллийг өгнө. 3.4 Пакет гэж юу вэ? (Package) Пакет гэдэг нь үндсэндээ классуудыг бүлэглэж нэгтгэсэн нэр юм. Эдгээр классуд нь тохиромжтой зөв замаар удирдагдана. Энэ нь катологи дотор хадгалагддагтай бараг адилхан ойлголт юм. 3.4.1 Өөрийн пакет үүсгэх Пакет үүсгэхийн тулд та пакетэд хамаатай түвшнүүдийг ойлгох хэрэгтэй. Пакетууд классын гишүүдийн хоорондох үзэгдэх байдлын 4 категорт хуваагдана. • Ижил пакет дахь sub классууд • Ижил пакет дахь sub бус классууд • Ялгаатай пакет дахь sub классууд • Sub классууд эсвэл ижил пакет дахь классууд Энэ хамаарлыг дараах хүснэгтэд үзүүлэв. private default protected Public Ижил класс Yes Yes Yes Yes Ижил пакет Sub класс No Yes Yes Yes Ижил пакет Sub бус класс No Yes Yes Yes Ондоо пакет Sub класс No No Yes Yes Ондоо пакет Sub бус класс No No no Yes Ижил классын элементүүдийн бүх хандалтууд байна. ИЖил пакет дахь sub классуудын хувьд суурь классын зөвхөн private гишүүд л sub классуудад харагдахгүй. Ижил пакет дахь sub бус классуудын хувьд, классын зөвхөн private -33- С.Ууганбаяр
  • 34.
    JAVA програмчлал гишүүд лбусад класст харагдахгүй. Хэрэв та өөр пакет дахь классаас удамшуулах sub классуудыг үүсгэвэл private ба default гишүүд рүү хандаж чадахгүй. Хоёр классын жишээг авъя. Stack класс нь стекийг хэрэгжүүлдэг, Callstack класс нь Stack классыг дууддаг. Энэ нь дан файлд байж болно, гэхдээ пакет үүсгэхийн тулд тэдгээрийг тусдаа класс файлууд үүсгэе. Stack класс нь пакет дотор, CallStack нь ердийн байдлаар. Mypackage нь бидний Stack гэж нэрлэх пакетын хадгалах каталоги болно. Пакет үүсгэх алхамууд нь: <drive :javasource filesmypackage> байдалтай бүтцийн каталоги үүсгэнэ. Энэ тохиолдолд c:javasourcefilesmypackage (бүгд каталогиуд). Callstack.java эх файл нь c:javasourcefiles каталоги дотор орших ба пакетыг дуудна. Stack.java класс файл нь c:javasourcefilesmypackage каталогит байрлана. Класс файлд файлын нэртэй адил нэртэй, public хандалттай зөвхөн нэг класс байх ёстой. Үлдсэн бусад классууд private г.м хандлагуудтай байж болно. Stack.java файлд, хамгийн эхний мөр нь класс ямар пакетад хамаарахыг заах package оператор байна. Энэ нь дараах байдлаар бичигдэнэ: Package mypackage; Энд Stack бол mypackage пакетэд хамаарах пакет (stack.class файлыг хадгалах) юм. Пакетын зам нь автоматаар каталогын бүтэцтэй ижилээр үүсгэгддэг. Stack.class файлыг байгуулахын тулд Stack.java-г хөрвүүлнэ. javasourcefiles каталоги дахь Classtack.java файл руу сэлгэ. Callstack.java-д импортлох бичлэгийг import.mypackage* байдлаар хий. Одоо стек public класс нь ашиглагдаж, хуваагдаж болно. Шинэ пакет нь хараахан Java орчинд харагдахгүй. Үүний тулд, classpath гэж нэрлэгдэх системийн хувьсагчийг тохируулах хэрэгтэй. Энэ хувьсагчид стандарт Java классууд мөн пакетуудыг агуулж буй каталогуудыг заадаг. Үүнийг дараах байдлаар тохируулж болно: Set classpath=.; c:Javaclasses; c:javasourcefiles Үүнтэй адилаар, өөр пакетууд хаа нэг газар үүсгэгдэж болох бөгөөд програмдаа дуудаж болно. Пакетууд дэх гадна харагдах классууд нь public хандалттай байх ёстой. Default нь public-тэй төстэй байдлаар үйлчилдэг, гэвч пакетын гадна адилгүй. Пакет үүсгэх програмыг дор үзүүлэв: Stack.java Package mypackage; Public class Stack { private int Stck [ ]; private int Stack_Ptr; public Stack (int site); { Stck=new int [site]; Stack_Ptr=-1; } -34- С.Ууганбаяр
  • 35.
    JAVA програмчлал public voidpush (int item) { if (stack_Ptr==Stck.lenth-1) system.out.println (“Stack is fule”); else Stck [++Stack.Ptr]= item; } public int pop () { if (Stack.Ptr <0) { system.out.println (“Stack underflow”); return 0; } else return stck [stack_Ptr--] ; } } CallStack.java Import mypackage.*; Public class callstack { public static void main (String args [ ]) { stack s1=new Stack (5); for (int I=0; I<5; I++) { s1.push (i); } system.out.Println (“The stack contains”); for (int I=0; I<5; I++) { system.out.println (s1.pop ()); } } } Практик ажил: Оюутны элсэлтийн систем. Асуудлын тавилт. -35- С.Ууганбаяр
  • 36.
    JAVA програмчлал SubjectCourse Зур. Оюутныэлсэлтийн Системийн классын диаграмм Application Core optional Applicant Student -36- С.Ууганбаяр
  • 37.
    JAVA програмчлал Энд ОМТ(object Modelling Technique)-н тэмдэглэгээгээр диаграмм байгуулсан, энд Классын диаграмм нь систем дэх шаардлагатай классуд, тэдгээрийн хоорондын хамаарлыг тэмдэглэдэг. Энэ системийг байгуулахын тулд бид тодорхой байдлаар хялбарчилж үзье: • Бүх курсын сүүлчийн хугацаа ижил • Курс болгон дэх оюутны тоо 5 (гэхдээ сүүлд нь ихэсгэж болно) • Бэлэн курсүүд нь “MDMC”, ”OCO”, ”C++” (өргөтгөж болно) • Бэлэн хичээлүүд нь “C”, ”C++”, ”OOADS”, ”JAVA”, ”NT”, ”VNIX”, ”VB”, ”VC”, ”ORACLE ” • 75%-ээс дээш эхний таван оюутан admitted. Одоо зарим классууд, тэдгээрийн метод, атрибутуудыг тодорхойлъё. Public class Subject { String sname; Subject (String name ){ This.sname=name; } } subject.java код public class CoreSubject extends Subject { CoreSubject (String name) { Super (name); } public void setName (String name) { sname-name; } } CoreSubject.java код. Subject классаас удамшсан Public class OptSubject extends Subject { OpmSubject (String name) { Super (name) } public void setName (string name) { Sname=name; } } OptSubject.java код. Subject классаас удамшсан. (үргэлжилнэ.) Одоо классуудыг “college. Student” пакетад багтааж зохион байгуулъя. Applicant классын методууд: • Applicant (байгуулагч) • Apply for course энэ метод нь Applicant классын courseName атрибутад сонгосон курсын нэрийг онооно. -37- С.Ууганбаяр
  • 38.
    JAVA програмчлал • SelectOptional Subjects энэ метод нь Applicant классын optional subject атрибутад сонгосон сонгох хичээлийн нэрийг онооно. • Get Functions нь шаардлагатай утгуудыг авна. Класс Course-н методууд: • Course (байгуулагч) • Set antrance qualifications элсэх хамгийн бага түвшингийн хувийг тогтоох • Set maximum students Курс дэх оюутнуудын хамгийн их тоог тогтоох • Check course availibility Тус курс бэлэн эсэхийг шалгах • Check entrance qualifications дамжуулсан дүн нь зөв тэнцэх эсэхийг шалгана. • Set number of students enrolled Элссэн оюутнуудын тоог оноох • Get number of students enrolled Элссэн оюутнуудын тоог авах Өгүүлэмж классын методууд: Receive өгүүлэмж объектын атрибутуудыг дамжуулсан утгуудаар Approve өгүүлэмж Курс бэлэн эсэхийг шалгаад хэрэв бэлэн бол элсэх шаардлага хангахыг шалгана, хэрэв зөв бол үнэн, үгүй бол худал утга Package college. Student; Import java.util.Date; Public class Applicant { String name; String courseName; String optSub; Long result; String address; Applicant (String name, String add, Long res) { This.name=name; Address=add; Result=res; Course Name = name; Optsub = mull; } public void apply forCourse (String selCourse) { Course Name = selCourse; } public void SelectOptSubject (String oSub) { opt Sub=oSub; } public String getCourse () { return CourseName; } public String get OptSub () { return optSub; } public void get AppDet (String sname, String add) { sname=name; address= add; } -38- С.Ууганбаяр
  • 39.
    JAVA програмчлал public longgetResult () { return result. Long Value () ; } } Applicant.java код Package college.student; Public class Course { String name; Static int num of St; Static int ourr St; Long qualPere; CoreSubject cSub [ ]; OptSubject oSub [ ]; Course (String name, CoreSubject cS [ ], OptSubject oS [ ]) { This.name=name; CSub=cS; OSub=oS; } public void setEEntranceQual (Long perc) { qualPerc=perc; } public void SetMaxStudents (int uSt) { numof=uSt; } public boolean check Course Avail () { if ((curSt+1) < numofSt) { return true; } else return false; } public boolean checkEntrance Qual (Long perc) { if (qualPerc.LongValue () > perc) return false; else return true; } public void set CurrSt () { // оюутан элсэх үед дуудагдана curr St++; } public int getCurrSt() { // оюутан элсэх үед дуудагдана return curr St; } Course.java код Package College.student; -39- С.Ууганбаяр
  • 40.
    JAVA програмчлал Public classӨгүүлэмж { Static int apNum; Applicant aplcnt; Public void rcvAppl (Applicant a) { ApNum++; Aplcnt=a; } public boolean appApl(Course c) { if (c.check CourseAvail () ) if (c. checkEntrancequal (aplcnt.getResult () ) ) return true; else return false; else return false; } } Өгүүлэмж.java код Үүнтэй төстэйгээр өмнө тодорхойлогдсон классууд мөн package college.student; мөрийг агуулна. Ингэснээр эдгээр классууд College.student пакетын нэг хэсэг болно. Одоо бид эдгээр бүх классаа ‘College’ каталогын ‘student’ дэд каталогт байрлуулна. 3.4.3 Зарим Java пакетууд Програм зохиогч классууд, интерфэйсүүдийг агуулсан пакетуудыг үүсгэдэгтэй адил Java чухал зорилтуудыг гүйцэтгэх үндсэн пакетуудыг агуулдаг. JAVA пакет Long util io applet awt net Java. Long пакет Security Manager, System, Thrend г.м Java-н суурь классудыг агуулдаг. Java.util пакет нь Date г.м утилит классудыг агуулдаг. Java.io пакет нь оролт/гаралтын үйлдлүүдэд зориулсан классуудыг агуулна. Java.аплет пакетыг үүсгэх, удирдахад зайлшгүй хэрэгтэй үүргүүдийг бүхий … -40- С.Ууганбаяр
  • 41.
    JAVA програмчлал Java.awt :интерфэйс зохиомжлоход зориулсан GUI компонентуудыг агуулна, Button, Label г.м Java. Net : алсын сервер рүү холбох зэрэг сүлжээний үйлдлүүдэд зориулсан классуудыг агуулна. Лекц №7 Аплет гэж юу вэ? 4.1 Аплет-н тухай. Аплет бол браузер дээр ажилладаг Java програм юм. Аплет ажиллах браузер нь Java-н онцлогуудыг дэмжих ёстой. Microsoft IE, Netscape Navigator, Sun-н Hot Java зэрэг нь хамгийн өргөн тархсан Java-enabled браузерууд юм. Java програмууд нь нэг бол өгүүлэмж эсвэл аплет буй болдог. Applicatoin эсвэл аплет-г хэрэгжүүлэх сонголт нь өгөгдсөн асуудлын хувьд бүхэлдээ хөгжүүлэгч дээр төвлөрдөг. Нэгэн аплет Word wid, web дээр тавигдсан бол түүний хийж болох зүйлүүдийг хязгаарлан олон хамгаалалт тавьж болно. 4.1.1 Өгүүлэмж –ээс Аплет-ийн ялгагдах нь 1. Аплет нь удамшигчийн (аплет-г үзэж буй хүн) машин дээрхи файлуудыг дамжуулах, унших, бичих зэрэг үйлдлүүд хийж чадахгүй, хэрэв түүний ашиглаж байгаа баузер нь хамгаалалтын өндөр хязгаарлалтуудтай бол. Гэхдээ хамгаалалтын хязгаарлалтууд нь доогуур ба үл таних аплет-уудад зөвшөөрөл өгсөн үед аплет y, уншигчийн машин дээрхи файлуудыг ажиллуулж, уншиж, бичиж чадна. 2. Аплет нь ажиллаж байгаа сайтаасаа өөр ямар нэгэн сайттай харилцаж чадахгүй. 3. Аплет нь уншигчийн машинаас сангууд ба биелэх файлуудыг зэрэг програмуудыг ачаалж чадахгүй. 4. Аплет нь ажиллахын тулд браузер хэрэгтэй. Тиймээс, энэ нь өгүүлэмж-аас аплет-г биелүүлэхэд удаан байна. Аплет-д хэрэглэгдэх нийт санах ойн хэмжээ нь браузерээр шийдэгддэг харин өгүүлэмж-д ийм хязгаарлалт байхгүй. 4.1.2 Аплет-н амьдралын цикл Аплет-г яаж үүсгэдэг, яаж ажиллуулдагыг 1-р бүлэгт үзсэн. Аплет нь биелэхийн тулд HTML бүрхүүлийг шаарддаг. Өгүүлэмж нь main () програмыг агуулдаг. Аплет-д main () функц байхгүй. Аплет-д ялгаатай хугацаануудад биелж байдаг хэд хэдэн метод байдаг. Дараах зурагт аплет-н хамгийн чухал 5 методыг үзүүлэв. – init(), start(), stop (), destroy (), paint (), Аплет ачаалагдсан -41- С.Ууганбаяр
  • 42.
    JAVA програмчлал init start Initialization Аплет санахойд ачаалагдсан үед init () функц дуудагдана. Энэ функц нь аплет- н эхлэх шинжүүдийг тогтоодог. Та энд фонт тохируулах, зураг ачаалах, хувьсагчид ба параметрүүдийн утгуудыг тогтоож болно. Аплет-д өөрийн хүсч байгаа боломжийг олгохын тулд init () методыг дарж тодорхойлох ёстой. Public void init () { // шаардлагатай кодыг бичнэ. } Эхлүүлэх Энэ үе нь аплет ишицилиазлагдсаны дараа эсвэл хэрэглэгч браузер дээр уг аплет-г агуулсан хуудас руу буцааж ирэх үед тохиолддог. Initialization ба эхлэл хоёрын хоорондох үндсэн ялгаа бол initialization нь зөвхөн нэг удаа хийгддэг, харин эхлэл нь аплет-д олон тооны удаа хийгдэнэ. Энэ шинжийг дээрхи зурагт харуулсан. Та аплет-д өөрийн ажилбаруудыг оруулахын тулд start () функцийг дарж тодорхойлох хэрэгтэй. Public void start () { // шаардагатай кодыг бичнэ. } Зогсоох Stop ( ) Paint ( ) Destray ( ) -42- С.Ууганбаяр
  • 43.
    JAVA програмчлал Stop ()метод нь уг метод руу илээр дуудах үед эсвэл хэрэглэгч аплет-н ажиллаж байгаа тухайн хуудсыг орхих үед дуудагддаг. Мөн stop () методыг дарж тодорхойлж болно. Public void destroy() < // шаардлагатай кодыг бичнэ. } Устгах Destroy () метод нь аплет-д ашиглагдсан ой чөлөөлөгдөх эсвэл хэрэглэгч браузерээс гарах үед дуудагддаг. Мөн destroy () –г дарж тодорхойлж болно. Public void destroy () { // шаардлагатай кодыг бичнэ. } Зурах Paint () метод нь аплет-д дурын тооны удаа дуудагддаг. Энэ метод нь текст, график, зураг г.м-г дүрслэх үүрэгтэй. Paint-г дарж тодорхойлж болно. Энэ функц нь Graphics төрлийн объектыг хүлээн авдаг, тиймээс та аплет- д awt пакетын Graphics классын импортлох ёстой. Public void paint (Graphics -д) { // шаардлагатай кодыг бичнэ. } 4.1.3 Аплет үүсгэх Дараахь энгийн аплет-г үзье. Энэ аплет нь фонт объектыг ашиглан тэмдэгт мөр хэвлэдэг. Import Java awt.Font Import Java awt.Color Import Java awt.Graphics Public class Try Аплет extends java. Аплет. Аплет { Font f=new Font (“Garamond”, Font.BOLD+Font. ITALIC, 30); Public void paint (Graphics g) { g. set Font (f); g.set Color (Color.blue); g. draw String (“My firest Аплет”, 10,40); } } Try Аплет.java Font.Bold ба Font.ITALIC тогтмолууд нь Font класс дотор g,blue нь Color классд зарлагдсан тогтмол. Энэ аплет-г дараах байдлаар HTML файлд суулгая. <html> <title> Tosting Аплет </title> </hend> <body> <p> энэ бол анхны аплет -43- С.Ууганбаяр
  • 44.
    JAVA програмчлал <br> <аплет code= “TryАплет.class” width=400 height =200 > Хэрэв таны браузер Java-г дэмжихгүй бол энэ хэвлэгдэнэ. </ аплет > </ body > </ html > Мөн түүнчлэн та аплет-г аплетviewer програмыг ашиглан ажиллуулж болно. Үнэндээ энэ бол өнөөдөр олонхи браузерууд Java 2-н онцлогыг дэмжихгүй байгаа үед аплетviewer –г ашиглах зөв зам юм. Аплетviewer <html file name >. 4.1.4 Аплет tag-н атрибутууд Аплет tag-н зарим чухал атрибутуудыг үзье. CODE tag нь биелэх java аплет файлын нэрийг авдаг, WIDTN нь аплет-н өргөн, HEIGHT өндөр. Эдгээр атрибутуудаас гадна өөр чухал атрибутууд <Аплет > tag-д хэрэглэгддэг. CODEBASE Энэ нь CODE атрибуттай хамт заагдаж болох заавал байх албагүй атрибут. CODE атрибут нь аплет-н үндсэн класс файлын нэрийг заадаг бол CODEBASE нь класс файлын байрлалыг заадаг. CODEBASE заагдаагүй үед аплет-г агуулж буй HTML файлтай адилхан байрлалд класс файлыг хайдаг. Дараах код нь үндсэн каталоги дахь Java Files нэртэй folder-с TryАплет.class файлийг ачаална. <Аплет code = “TryАплет.class” codebase = “ / Java Files” height = 300 width=300 > < / аплет > ALIGN Энэ атрибут нь аплет нь хуудасны бусад хэсгүүдэд яаж цэгцлэгдэхийг заадаг. ALIGN атрибут нь ALIGN = <value> командаар өгөгдөж тогтоогддог, авч болох утгууд нь: LEFT – аплет-г түүнийг заасан текстийн зүүн талд цэгцэлнэ. RIGHT - аплет-г түүнийг заасан текстийн баруун талд цэгцэлнэ. TEXTTOP – аплет –н дээд ирмэгийг өндөр текстийн оройтой чацуулна. TOP – аплет-н дээд талыг том зүйлүүдийн (текст, зураг, эсвэл өөр аплет г.м) дээд ирмэгтэй чацуулна. ABSMIDDLE – аплет-н дунд хэсгийг том зүйлийн дунд хэсэгтэй чацуулна. MIDDLE – аплет-н дунд хэсгийг текстийн дунд хэсэгтэй чацуулна. BASELINE or BOTTOM – аплет-н доод хэсгийг текстийн доод хэсэгт чацуулна. ABSBOTTOM – аплет-н доод хэсгийг жижиг зүйлийн шугамтай чацуулна. HSPASE ба VSPACE -44- С.Ууганбаяр
  • 45.
    JAVA програмчлал Эдгээр атрибутууднь аплет ба түүнийг хүрээлсэн текстийн хоорондох хэвтээ, босоо зайг тохируулдаг. Энэ зай нь цэгээр тооцогдоно. Жнь: <аплет code = “Trytinyj.class” width=60 heigth=50 hspace=20 vspace=20 > </аплет > 4.2 Аплет-д параметр дамжуулах Аплет-г браузер дээр ажиллуулахад класс файлын нэрийг АПЛЕТ tag-н CODE атрибутад зааж өгдөг. Дараах жишээг авъя. Хэвлэгдэх текстийн хэмжээ нь өөрчлөгдөнө гэж үзье. Ийм тохиолдолд өөрчлөлтийг java файлд хийж, файл дахин хөрвүүлэгдэж болно. Энэ нь хэрэв текстийн хэмжээ буюу текст зохиомжлох үед мэдэгдэж байгаа бол тохиромжтой, гэвч ажиллаж байх үед өөрчлөлт хийх хийх болвол яах вэ? Энэ байдал нь програмд командын мөрийг аргументын тусламжтай удирдагддаг. Үүнтэй төстэй, аплет –д параметрүүдийг HTML файлаас дамжуулж болох бөгөөд эдгээр параметрүүдийг аплет хүлээж авч болно. Параметрүүд нь HTML файлаас PARAM tag ашиглан дамжигддаг. PARAM tag нь <аплет > ба </ аплет > tag-уудын дотор хооронд заагдах ёстой. PARAM tag нь 2 атрибут авдаг. NAME (параметрийн нэр) ба VALUE (түүний утга). Дараах HTML код нь TryАплетParam.class аплет руу Site параметрийг 30 утгатайгаар дамжуулу байна. <аплет code = “TryАплетParam.class” width=400 height=200 > <param name = site value =”30” > </аплет > Аплет файлд параметрүүд нь getParameter () методыг ашиглан хандаж болно. Параметрийн утга нь String төрлөөр өгөгдөх ёстой. Дараах програмд хэрэв параметр заагдсан бол Site –н утгаар, үгүй бол 44 хэмжээтэйгээр текстийн хэмжээг тогтоож байна. Importjava.awt.Font; Importjava.awt.Color; Importjava.awt.Graphics; Public class TryАплетParam extends java.аплет.Аплет { Font f; Int s; Public void init () { String textsite; Textsite = getParameter () (“site”) If (textsite == null) S=44; Else S= Integer.parse_Int (textsite); } public void paint (Graphics g) { f=new Font (“Garamond”, Font.BOLD, S); g.set Font (f); g.set Color (Color.blue); g.drow String (“My first Аплет”, 10, 40); -45- С.Ууганбаяр
  • 46.
    JAVA програмчлал } } Аплет ньмөн програм шиг ажиллаж болдог. Лекц №8 4.3 Graphics Бид аплет-н paint методыг үзсэн. Та тэгш өнцөгт, шулуун, дугуй, олон өнцөг, бусад график объектуудыг мөн зурж болно. Аплет дэх график объектуудыг координатын систем нь математик координатын системтэй мөн адилхан. Гэхдээ хэмжих нэгж нь цэг бөгөөд бүх цэгэн утгууд нь бүхэл тоонууд 0, 0 Х өснө Дэлгэц буюу Monitor Y өснө 4.3.1 Шулуун зурах A (x1, y2), B (x2, y2) цэгүүдийг холбосон шулуун зурахад g.drawLine (x1, y1, x2, y2) командыг өгнө. 4.3.2 Тэгш өнцөгт зурах, будах g.drawRect (10,40,200,100) нь (10, 40) цэг дээр зүүн дээд өнцөг нь байрласан 100 өндөр, 200 өргөнтэй тэгш өнцөгт зурна. FileRect () нь тэгш өнцөгтийг будахад хэрэглэгддэг. Дугуйрсан тэгш өнцөгт зурахад drawRoundRect (), file RoundRect () –г ашиглана. 4.3.3 3D тэгш өнцөгт зурах, будах Draw 3dRect (), Sill 3dRect () g.draw3dRect (10,20,200,100, true) . сүүлчийн утга нь тэгш өнцөгт нь төвийсөн байх эсэхийг зана. 4.3.4 Олон өнцөгт зурах, будах -46- С.Ууганбаяр
  • 47.
    JAVA програмчлал DrawPolygon (),fillPolygon () drowPolygon() нь 2 байдлаар дуудагдаж болно: DrawPolygon (int x [ ], int y [ ], int n) x, y нь массивууд нь x, y , нь оройн тоо drawPolygon (Polygon p) Жнь: int x [ ] = { 20, 20, 70, 120 }; Int y [ ] = { 20, 150, 200, 150 }; L=x.length; Polygon p=new Poligon (x,y,l); p.addPount (1208 20); g.arowPolygon (p); Хоёр дахь методыг ашиглахын давуу тал нь олон өнцөгтийг зурахаас өмнө addPoint()-г ашиглан оройнуудыг нэг нэгээр нь нэмэх боломжтой. 4.3.5 Тойрог, муруй зурах, будах Draw Oval (), fillOval (). Дугуй өндөр, өргөн ижил үед тойрог болно. g.draw (20, 20, 100, 100) нь (20,20) дээрээс эхэлсэн 100 талуудтай тэгш өнцөгтөд багтааж тойрог зурна. 4.3.6 Нум зурах, будах Нум нь хагас дугуй юм. Drow Arc (), file Arc () методуудыг ашиглан нум зурдаг. g.draw Arc (20,20,100,20,0, -180) нь (20,20) цэгээс 100 өргөн, 20 өндөртэй тэгш өнцөгтөд 0 өнцгөөс эхлэн цагийн зүүний эсрэг 180о тойруулж нум зурна. -47- С.Ууганбаяр
  • 48.
    JAVA програмчлал 4.3.7 Бүгдийгнь хамтад нь бичвэл Import java. awt.Font; Import java. awt.Color Import java. awt.Graphics; Import java. awt.Polygon; Public class Drawsmiley extends java.аплет.Аплет { Public void paint (Graphics g) { Font f = new Font (“Times Roman”, Font.PLAIN, 30); SetBackground (Color.pink); // дэвсгэрийг pink болгож байна. // текст бичих g.setFont (f); g.setColor (Color.red); g.draw string (“smiley”, 80,50); // текстийг хүрээлсэн дугуйрсан тэгш өнцөгт зурах g. setColor (Color.block); g.drawRoundRect (78,24,90,35,20,20); // нүүрний гадна талыг зурах g. setColor (Color.yellow); g.filloval (100,100,200,200); // нүд зурах g. setColor (Color.black); g.filloval (140,140,30,30); g.filloval (225, 140,30,30); // хамар зурах g.drawline (200,180,200,220); // ам зурах g.drawArc (170.230,60,20,180,180); // текст бичих f=new Font (“TimesRoman”, Font. PLAIN, 24); -48- С.Ууганбаяр
  • 49.
    JAVA програмчлал g.setFont (f); g.setColor (Color.red); g.drawstring (“Hi !! I’m smiley” , 335, 60); // текстийг тойруулж муруй зурах g.setColor (Color.yellow); g.draw Oval (328, 24,170,50); // гурвалжин дүрс зурах int x [ ] = {327,260,340}; int y [ ] = {50,120,70}; int l = x.length; Polygon p = new Polygon (x,y,l); g.fill Polygon (p); } } 4.4 Шрифт ба өнгө Бид өмнө бичсэн програмуудад Font ба Color объектуудыг ашиглаж байсан. Font объект үүсгэхийн тулд шрифтийн нэр, хэв маяг, хэмжээг заах хэрэгтэй. Шрифтийн хэв маяг нь Font классын BOLD, ITALIC, PLAIN хувьсагчаар тодорхойлогддогв Өөр хэв маягууд гаргаж авахын тулд эдгээрийг хослуулан хэрэглэж болно: Font.BOLD+ Font.ITALIC Font классын методууд: • get Name () – шрифтийн нэрийг авах • get Site () - хэмжээ • get Style () – хэв маяг • is Bold () – Bold бол үнэн • is Italic () – Italic бол үнэн • is Plain () – Plain бол үнэн 4.4.1 Текст зурах Текст зурах үед зарим энгийн ухагдахуунуудыг мэдэх хэрэгтэй, үүнд baseline, ascent, descent, loading • Baseline – энэ нь текст байрлах шугам • Ascent нь baseline ба тодорхой тэмдэгтийн доод хязгаар хоорондох зайв Зарим тэмдэгтүүд бусдаасаа илүү ascent-тэй байдаг. Жнь: I нь a-ээс илүү ascent-тэй. -49- С.Ууганбаяр
  • 50.
    JAVA програмчлал • Descentнь baseline –аас доош хэр хэмжээтэй тэмдэгт өргөтгөгдөхийг тодорхойлно. G. j г.м тэмдэгтүүд descent-тэй байдаг (ө.х доошоо зурагддаг). • Hading гэдэг нь эхний мөрийн Descent ба дараагийн мөрийн ascent хоёрын хоорондох нийт зай. Мөн тэмдэг эсвэл байтуудыг зурахад draw Chars () ба drawBytes() методуудыг ашиглаж болно. Draw Chars (char arr [ ], int offset, int totalnumchars, int x, int y); Draw Bytes() метод нь эхний аргументаас бусад нь drawChars () – ихтэй ижил. Эхнийх нь byte массив: draw Bytes (byte arr [ ], int offset, int totalnumbytes, int x, int y); 4.4.2 FontMetris Awt пакет дотор идэвхтэй шрифтийн тухай мэдээлэл авахад ашиглаж болох FontMetris гэж нэрлэгдэх класс байдаг. Энэ мэдээлэлд тодорхой шрифттэй тэмдэгт мөрийн өндөр, өргөн байж болно. FontMetris нь абстракт класс, тиймээс энэ нь new операторыг ашиглан хувилагдаж болохгүй. Гэхдээ, өмнө байсан Font объектоос getFontMetris () методыг ашиглан FontMetris объектыг үүсгэж болно. Font f= new Font (“TimesRoman”, Font BOLD, 36); FontMetris fm= get FontMetris (f); String s= new String (“Testing FontMetris”); Int h= fm.getHeight (); Int sw= fm.StringWidht (S); Энд s объектын өргөнийг StringWidth() метод ашиглан цэгээр тооцоолж байна. getHeigth методын тусламжтай энэ FontMetrics-н өндрийг олж болно. Мөн FontMetrics-н зарим чухал методууд: • Get Ascent() • Get Leading () • Get Height () • Ascent +descent+leading space нийлбэр бүхэл тоон утгыг буцаана. • Get Max Ascent() • Хамгийн их ascen-г олох • Get Max Descent () Тэмдэгтийн өргөн гэдэг нь тэмдэгтийн эзлэх зай ба түүний арын сул зайн нийлбэрийн тэмдэг. Өргөнийг мөн Advance гэдэг. Тэмдэгтийн өргөнтэй холбоотой чухал методууд: • char Width() нэг тэмдэгтийг аргумент болгон авах ба уг тэмдэгтийн өргөнийг буцаана. • GetMax Advance () тодорхой нэг шрифлэгдэх дурын тэмдэгтийн хамгийн их advance. • String Width() тэмдэгт мөрийг аргумент болгон авах ба түүний нийт өргөнийг буцаана • Char Width () 3 аргумент авдаг: тэмдэгт массив, offset утга, нийт тэмдэгтийн тоо • Bytes Width () 3 аргумент авдаг: тэмдэгт массив, offset утга, нийт тэмдэгтийн тоо -50- С.Ууганбаяр
  • 51.
    JAVA програмчлал • GetWidths() шрифт дэх эхний 236 тэмдэгтийн хувьд өргөнүүдийн массивыг буцаах 4.4.3 Өнгө Color объект нь олон замаар үүсч болно: • RGB утгуудыг дүрслэх 0.0-c 1.0 хоорондох бодит тоонуудаар Color c = new Color (0.01 F, 0F, 1F); • 0-с 255 хоорондох RGB –г төлөөлөх бүхэл тоонуудаар Color c = new Color (64,64,64); • Зөвхөн нэг том бүхэл тоогоорь энд 16-23 бит нь улаань 8-15 нь ногоон, 0-7 нь цэнхэр өнгийг тодорхойлно. Color c = new Color (434); // улаан 1 орцтой, ногоон 1, цэнхэр 178 орцтой өнгийг тодорхойлно. Улаан, ногоон, цэнхэр орцуудыг өөрчлөн зааж янз бүрийн өнгүүд үүсгэж болно. Color класс нь өмнө тодорхойлогдсон өргөн ашиглагддаг өнгүүдтэй байдаг бөгөөд тэдгээр нь Color классын тогтмолууд байдлаар байдаг. Дараах хүснэгт Color классын бүх тогтмол, тэдгээрийн RGB орцыг үзүүлэв. Тогтмолууд Дүрсийн өнгө Улаан Ногоон Цэнхэр Black Хар 0 0 0 Blue Цэнхэр 0 0 255 0 255 255 Dark Gray Хүнд саарал 64 64 64 Gray Саарал 128 128 128 Green Ногоон 0 255 0 Eight Gray Гэгээтэй саарал 192 192 182 Magenta Magenta 255 0 255 Orange Улбар шар 255 200 0 Pink Ягаан 255 175 175 Red Улаан 255 0 0 White Цагаан 255 255 255 Yellow Шар 255 255 0 4.5 Аплет –д зураг оруулах Зураг бол ямарч Web програмын нэг чухал хэсэг. Java нь зургийг боловсруулахад Image классыг ашигладаг. Web дээр байрлалтай хадгалагдсан зургийг дүрслэхийн тулд та юуны түрүүнд тэр байрлалаас нь зургаа авах ёстой. Үүний тулд танд тэр байрлалын зам хэрэгтэй болно. Энэ зам бол тэр зургийн Web хаяг ба Web хаяг Java-д URL (Uniform Resource Locator)-аар дүрслэгдэнэ. Зурган файлын хаягыг агуулах URL объект үүсгэж болно. Жнь: зураг http://www.sun.com/images сайт дээр хадгалагдаж байгаа зургийн нэр balloon.gif бол URL объект дараах байдлаар үүсгэгдэх болно: URL u1= new URL (http://www.sun.com/images/balloon.gif); -51- С.Ууганбаяр
  • 52.
    JAVA програмчлал URL объектыгүүсгэсэн цагт уг байрлал дах зургийг авах Image объект үүсгэж болно. Аплет классын getImage () метод нь үүний тулд 2 байдлаар хэрэглэгддэг: • GetImage (URL) URL төрлийн нэг аргумент авах ба энэ нь Web дэх зурган файлын байрлал ба нэрийг агуулна. • Get Image (URL, String) Эхнийх нь файлын замыг агуулах URL , хоёр дах нь файлын өөрийн нэр Дараах жишээнд http://www.sun.com/images байрлалаас balloon.gif-г ачаалах код байна. URL u1= new URL (http:// new.sun.com/images/balloon.gif ); Image img=getImage (u1); Эсвэл URL u1=new URL (http:/www.sun.com/images); Image img= getImage (u1,”balloon.gif”); Ерөнхийдөө аплет-тэй холбогдсон зургууд нь аплет ачаалагдсан Web хаягийн дэд каталоги эсвэл ижил ккаталогит хадгалагдаж байдаг. Тийм тохиолдолд тухайн аплет-н web хаяг маш чухал болдог. Аплет класс нь тухайн аплет –н вэб хаягыг буурах 2 методтой болгодог. GetDocument Base() Аплет-г агуулсан документын URL –г буцаана. Жнь: та http://www.sun.com/аплетs –с try аплет.html файлыг ажиллуулж байгаа бол энэ метод нь http://www.sun.com/аплетs/tryАплет.html вэб хаягыг төлөөлөх URL буцаана. Get Code Base () Энэ нь аплет-н өөрийн URL-г буцаанав Жнь: Хэрэв та tryАплет.class apple-г http://www.sun.com/аплетs вэб хаягыг дүрслэх URL-г буцаана. Одоо дараагийн алхам бол зургийг дүрслэх. Graphics классын drawImage() метод нь зургийг дүрслэхэд ашиглагддаг. Энэ метод олон янзаар хэрэглэгддэг. Хамгийн тохиромжтой хэрэглэх замуудыг доор үзүүлэв. 4.5.1 Зургийг түүний эх хэмжээгээр дүрслэх Энэ тохиолдолд drawImage () метод 4 параметр авна- дүрслэгдэх Image объект, х,у координат, Image Ob server классын объектын заана. Энэ Image Ob server объект нь зураг ачаалах үед алдаа гарах буюу зураг ачаалахад удаан хугацаа орох үед зургийн замыг хадгалж байдаг. Аплет ImageObserver классыг хэрэгжүүлсэн тохиолдолд 4 дэх параметрт this –г дамжуулж болно. This түлхүүр үгийн тусламжтай аплет нь зураг ачаалагдаж байх үед түүний замыг хадгалж чадна. Дэвсгэр өнгийг заавал зааж байх албагүй нэг параметр мөн х,у координатын дараа тавигдаж болно. Дараах кодын хэсэг нь зургийг ачаалсны дараа нь түүнийг цэнхэр өнгийн дэвсгэртэйгээр эх хэмжээгээр нь дүрсэлж байна. Import java.awt.Image; Import java.awt. Graphics; Import java.awt. Color; -52- С.Ууганбаяр
  • 53.
    JAVA програмчлал Public classDraw Image exttends java.аплет.Аплет { Image img; Public void init() { Ing=getImage (get Code Base (), “Christinas Troes.gif”); } public void paint (Graphics g) { int w= ing.get Width (this); int h= ing.getHeight (this); g.draw Image (img, 200,10 w/2,h/2, Color.blue, this); 4.6 Аплет-д дуу оруулах Зураг, текст дүрслэх үед зарим тохиолдолд аплет-д зайлшгүй дуу авиа нэмэх хэрэгтэй болдог. Дуу авиа нэмснээр аплет-н чадварыг нэмэгдүүлдэг. Дээхэн үед зөвхөн .AU файлууд л аплет-д нэмж болдог байсан, харин Java 3 Plotform- д .WAV, .AU, .AIFF, .MIDI, .RMF форматтай дууны файлуудыг нэмж болдог. Java нь AudioClip гэж нэрлэгдэх абстракт классаар хангадаг. Энэ класс нь audio файлуудыг ачаалах, толуулах, зогсооход ашиглагдах хэд хэдэн методуудтай. Get AudioClip() метод нь аплет-д авиа файлыг ачаалахад хэрэглэгдэх ба new AudioClip() метод нь өгүүлэмж-д авиа файлын ачаалахад хэрэглэгддэг. Авиа файлыг ачаалсны дараа play (), loop(), stop() методуудыг дуу тоглуулах, дууг давтан үргэлжлүүлэн тоглуулах, шууд тоглохыг зогсооход ашиглаж болно. Дараах код нь авиа файлыг ачаалж, тоглуулж байна. Import java.awt.Graphics; Import java.аплет.Audio clip; Public class TrySound extends java.аплет.Аплет { Audio Clip c1; Public void init (){ C1=get AudioClip(getCodeBase(), “that.hurts.au”); } public void start () { c1.play (); } } 4.7 Дэлгэцийн хуулах, цэвэрлэх Graphics класс нь нэг мужаас нөгөө рүү тэгш өнцөгт мужийг хуулах copyArea() методоор хангагдана. Энэ метод нь 6 аргумент авдаг: • Мужийн эх (x,y) координат • Эх мужийн өндөр, өргөн • Хуулахын өмнө шилжүүлж аваачих мужийн хэвтээ, босоо зай цэгээр Дараах код нь (10,10) байрлал дахь зургийг дүрслээд дараа нь тэр зургийн хувийг үүсгэж түүнийгээ copyArea() методоор дүрсэлж байна. Import java.awt.Image; Import java.awt.Graphics; -53- С.Ууганбаяр
  • 54.
    JAVA програмчлал Import java.awt.Color; Publicclass CopyImage extends java.аплет.Аплет { Image iny; Public void init () { Ing = getImage (getCodeBase(), “Christmas Trees.gif”); } public void paint (Graphics g) { g.drawImage (ing,10,10, Color.blue,this); int w=iny.get Width (this); int h= ing.get Height (this); g.copyArea (10,10, w, h, w+20,10); } Clear Rect () метод нь аплет цонхноос тэгш өнцөгт хэсгийг цэвэрлэхэд хэрэглэгддэг. Энэ метод 4 аргументтай. • Цэвэрлэх мужийн эхлэлийг (x,y) координат • өргөн ба өндөр g.clearRect (10,10,100,100); Лекц №9 4.8 Java 2D-г хэрэглэх Java 2D нь Graphic объектуудыг үүсгэх, удирдах классуудын олонлогоор хэрэглэгчдийг хангадаг. Graphic объектууд нь awt эх пакетыг ашиглан үүсгэгдэж, удирдагдаж болно. Гэвч эх awt нь тийм ч хүчтэй биш. Java 2D нь график үйлдлүүдийг гүйцэтгэхэд маш сайн дэмжлэг үзүүлдэг. Эх awt-н бүх олонлогоос гадна Java 2D нь мөн: • Тусгай будах загваруудыг ашигладаг, жнь: уусалт, хээ • Зурах графикуудын өргөн, загварыг нарийн заадаг. • Объектуудын ирмэгүүдийг тасралтгүй болгоход Anti-cliasing-г ашигладаг. Java 2D классууд нь java.awt пакетын боломжуудыг өргөтгөсөн байдаг, тиймээс та хуучин классуудаа ашиглаж болох бөгөөд өөрийн өмнөх програмаа өөрчлөх шардлагагүй. 4.8.1 График 2D объект Өмнөхь paint () метод дахь бүх график үйлдлүүд Graphics объект дээр хийгддэгтэй адил, бүх Java 2D үйлдлүүд Graphics 2D объект дээр хийгдэнэ. Graphics 2D бол java.awt пакетын нэг хэсэгв paint() метод дэх Graphics объектууд Graphics2D объект руу дараах байдлаар хувиргагдаж болно: public void paint (Graphics g) { Graphics2D g2D= (Graphics 2D) g; // кодын байр } 4.8.2 Java 2D дэх координатын систем -54- С.Ууганбаяр
  • 55.
    JAVA програмчлал Өмнө үзсэнээрawt –д дэлгэц нь pivel гэж нэрлэгдэх жижиг цэгүүдэд хуваагддаг. График үйлдлүүд зөвхөн эдгээр цэгийг ашиглан хийгдэнэ. Энэ зохион байгуулалт нь дэлгэц буюу монитор дээр сайн зохицно гэвч хэвлэгч дээр тохирохгүй. Учир нь хэвлэгч бол монитороос илүү нягтралтай байдаг. Дэлгэц дээр зурсантай ижил зургыг хэвлэгч дээр ижил тооны цэгүүдээр зурвал зураг жижиг харагдана. Энэ нь ялгаатай төхөөрөмжүүдийн хувьд зургуудын хэмжээ өөрчлөгдөн зохицно гэсэн үг. Гэвч програм хөгжүүлэгч эдгээр асуудлуудыг хоёуланг нь хүсээгүй байж болох юм. Java2D нь энэ асуудлыг төхөөрөмжийн координатаас хэрэглэгчийн координатыг ялгаж шийдсэн. Тиймээс хэрэглэгчийн координат дээрх цэг төхөөрөмжийн кординат дээрхээс эрс ялгаатай. Иймээс Java2D нь хэрэглэгчийн координатын системийг төхөөрөмжийн к/с рүү хэрхэн хөрвүүлэгдэхийг тодорхойлдог default хувиргалтыг ашигладг. Дэлгэцийн ба хэрэглэгчийн системийн хэмжээс адилхан учраас хэрэглэгчийн координат дэлгэцийн координат руу солигдохгүй. Хэвлэгч дээр координатууд солигдоно. Default хувиргалт нь хэвлэгчийн нэг inch-д хэрэглэгчийн системийн 72 цэгийг ашигладаг. Энэ нь (72,72) байрлал дээрх цэг нь Эхлэлээс 1 инчийн баруун тийш, доошоо мөн 1 инч байрлалд хэвлэгдэнэ. Хэрэглэгчийн систем дэх координатууд нь мөн бодит тоо байж болдог, энэ нь цэгүүдээр Java2D –д координатуудыг дүрслэх боломжгүй юм. 4.8.3 Текст зурах ба өнгө тохируулах Текст нь Graphics объектын тохиолдолтой ижил замаар зурагддаг, ө.х drawString () методыг ашиглана. Гэхдээ drawstring () метод Graphics2D объект дээр дуудагдах ёстой. G2D.drawString (“Hello Word” , 10, 40); үүнтэй төстэйгээр setColor методыг ашиглан өнгө тогтоож болно. 4.8.4 Ялгаатай дүрсүүд зурах Awt API-тэй адилгүй нь ялгаатай объектуудыг (шулуун, тэгш өнцөгт г.м) зурахад ялгаатай методуудыг ашигладаггүй. Java2D нь бүх төрлийн дүрсийг зурахад ганц draw() методыг ашигладаг. File () метод нь төстэйгээр тэр объектыг будахад ашигладдаг. Тиймээс, хэрэв тэгш өнцөгт зурах бол тэгш өнцөгт объект нь үүссэн байх хэрэгтэй ба дараа нь draw () ба file методуудад параметр болгон дамжуулдаг. Ялгаатай дүрсүүд үүсгэхийн тулд та програмдаа jav.awt.geon.* -г импортлох ёстой. 4.8.5 Шулуун зурах Line2D класс нь шулуун объект үүсгэхэд ашиглагдах java.awt.geom пакетад байдаг класс. Шулуун объект үүсгэх үед шулуун классын Flout эсвэл Double методыг ашиглана. (10,10)-c (300,310) шулуун зурахад дараахь кодыг ашиглаж болно: Line2D l=new Line2D.Float (10,10,300,310); g2D.draw (l); -55- С.Ууганбаяр
  • 56.
    JAVA програмчлал мөн өөрөөрPoint2D классыг ашиглаж эхлээд 2 цэгээс объектуудаа үүсгээд дараа нь зурж болно: Point2D p1=new Point2D. Float (10,10); Point2D p2=new Point2D. Float (300, 310); Line2D l=new line2D.Float (p1, p2); g2D.draw (l); 4.8.6 Тэгш өнцөгт зурах Ердийн тэгш өнцөгт объект нь Rectangle2D объектын тусламжтай үүсгэдэг. Энэ классын байгуулагч нь тэгш өнцөгтийн зүүн дээд өнцгийн координатууд, өндөр, өргөнийг хүлээн авдаг. Rectang 2D r=new Rectangle2D.Float (20,20,150,100); g2D.draw (l); 4.8.7 Эллипс, тойрогь нум зурах Ellipse2D класс нь эллипс, тойрог, объект үүсгэхэд хэрэглэгддэг. 4.8.8 Муруй үүсгэх Муруй нь хоёр төрөлтэй- квадратик ба кубик. Квадратик муруй нь нэг контрон цэгтэй ба кубик муруй нь 2 контрон цэгтэй байдаг. (40,40)-c (40,250)-ийг холбосон (20,20) дээр контрон цэгтэй муруй зурахад: QuadCurve20 q=newQuadCurve2D.Float (40,40,20,20,40,250); g2D . draw (q); Контрон цэг нь муруй зурагдах замыг тодорхойлдог. Дээрхи жишээнд (40,40)-c (40,250)-г холбосон шулуун зурагдаад дараа нь (20,20) дээрхи контрон цэгийг ашиглан муруйлт нь зурагдана. (40,40)-с (40,250)-г холбосон (20,60) ба (150ь150) дээр контрон цэгүүдтэй муруй зуръя. Cubic Curve2D q=new Cubic Curve2D.Float (40,40,20,60,150,150,40,250); g2D.draw (q); 4.8.9 Дурын дүрс зурах Ердийн дүрсүүдээс гадна олон өнцөгт, гурвалжин, бусад муруйны төрлүүд г.м дурын хэлбэртэй дүрс зурж болно. Үүнийг GenoralPath классын тусламжтай хийдэг. Generalpath классыг ажиллаж эхлэхэд объектыг байгуулах бүх замаа тордорхойлно. Дараа нь draw методыг ашиглан зурна. Дараах жишээн дээр 8 өнцөгтийг зурсан. -56- С.Ууганбаяр
  • 57.
    JAVA програмчлал Import java.awt.*; Importjava.awt.geon.*; Public class TryHex extends java.аплет.Аплет { Public void paint (Graphics g) { Graphics2D g2D = (Graphics2D) g; General Path =new General Path(); p.move To (60,20); p.line To (140,20); p.line To (180,60); p.line To (140,100); p.line To (60,100); p.line To (20,60); p.line To (60,20); g.2D.draw (p); } } 4.8.10 Stroke (Хүрээ шугам) Stroke нь дүрсийн хүрээ яаж зурагдахыг тодорхойлдог. Ердийн Java awt API нь 1 цэгийн өргөнтэй тасралтгүй шулууныг stroke болгон хэрэглэдэг. Java 2D нь янз бүрийн stroke ашигладаг тэдгээрийг янз бүрийн дүрс зурахад хэрэглэж болдог. Ялгаатай stroke-ууд нь Basic Stroke классын тусламжтай үүсгэгддэг. Энэ класс нь чухал байгуулагч методуудтай. Үүнд: • Basic Stroke () • Basic Stroke (float width,int cap, int join); • Basic Stroke (float width, int cap, int join float miterlimit) • Basic Stroke (float width, int cap, int join float miterlimit, fload [ ] dash, float dash_phase ) Width – strok- н өргөн Cap- strok-н үзүүрүүдийн хэлбэрийг засдаг: CAP_BUTT, CAP_ROUND, CAP_ SQUARE. CAP_BUTT нь stroke-н CAP_ROUND нь stroke-н CAP_SQUARE үзүүрт юу ч байхгүйг заана. төгсгөлүүд дугуйрсан нь тэгш өнцөгт хэлбэртэй байхыг заана join – Stroke дэх булангуудын хэлбэрийг заадаг. (холбогдож буй булангууд) JOIN_BEVEL – stroke-н гадаад үзүүрүүд шулуун зурагдахыг заадаг. -57- С.Ууганбаяр
  • 58.
    JAVA програмчлал JOIN_ROUND Stroke-нгадаад үзүүрүүд Miterlimit – эдгээр гадаад үзүүрүүд хэр хол байж болохыг заадаг. Dash ба dash_phase нь Stroke-г тасралттай зураасууд болгоход хэрэглэгддэг. Dash массив нь зураас-цэгийн засвар, цоорхойн уртыг агуулдаг. Dash_phase аргумент нь зураасын цуваа тэр холоос эхлэхийг заадаг. Дараах код нь 2 ширхэг 8- дүрс зурах ба эхнийх нь 5 dash_phase-тэй, хоёр дахь нь 10 dash_phase –тэй. Import java.awt.*; Import java.awt.geon.*; Public class Dash extends java.аплет.Аплет { -58- С.Ууганбаяр
  • 59.
    JAVA програмчлал Public voidpaint (Graphics g) { Float [ ] av = new float [4]; av= [0]=15; av[1]=10; av[2]=5; av[3]=10; g2D.setStroke (new Basic Stroke (10f, BasicStroke. CAP_ROUND, Basic Stroke. JOIN_ROUND, 18 av, 5)); GeneralPath p=new General Path (); SetBackground (Color.yellow); G2D.setColor (Color.red); p.moveTo (100,10); p. Curve To (50,60,150,160,100,210); p.move To(100,10); p.curve To (150,60,50,160,100,210); g2D.draw (p); g2D.setstroke (new Basic Stroke (10f, Basicstroke.CAP_ROUND, Basic stroke. JOIN_ROUND, 1, av, 10)); GeneralPath p1=new GeneralPuth(); Set.Backround (Color.yellow); G2D.setColor (Color.red); P1. Move To (200,10); P1. Curve To (150,60,250,160,200,210); P1. Move To (200,10); P1. Curve To (250,60,150,160,200,210); G2D.draw (p1); } } 4.8.11 Будах хэлбэрүүд Будах загваруудын тусламжтайгаар объектууд яаж будагдахыг зааж болно. Будах загвар нь үргэлж өнгө, ууссан өнгө, texture эсвэл хэрэглэгчийн зохиосон ямар ч загвар байж болно. БУдах хэлбэр нь setPaint() методыг ашиглан тогтоогддог, энэ метод Paint объектыг параметрээр хүлээж авдаг. Gradient Paint объект нь дурын 2 цэгийн хооронд нэг өнгөнөөс нөгөө өнгө рүү уусган будахад хэрэглэгддэг. Эдгээр цэгүүд нь уусалтын мужийг тодорхойлдог. Хэрэв 2 цэг (0,0), (50,50) гэж өгөгдсөн бол уусалтын мужийн урт 50 нэгж болно. Будалт нь (0,0) цэгээс заасан өнгөөр эхэлдэг. Хоёр өнгийг ингэж нийлүүлэх нь Cyclic эсвэл Acyclic байж болно. Acyclic тохиолдолд өнгө үзүүрийн өнгөндөө хүрээд тэндээ зогсдог. Харин хэрэв cyclic бол энэ хвиргалтын процесс үргэлжилнэ. Энэ нь төгсгөлийн өнгөнд хүрээд эхний цэгийн өнгө болон солигдож энэ процесс цааш үргэлжилнэ гэсэн үг. Gradient Paint (float x1, float y1, Color c1, Float x2, float y2, Color c2, boolean cyclic); Энд сүүлчийн cyclic аргумент заавал байх албагүй хэрэв орхивол false (default утга) утга авна. -59- С.Ууганбаяр
  • 60.
    JAVA програмчлал Gradient объектыгүүсгэсний дараа түүнийг setPaint() методыг ашиглан хэрэгжүүлж болно. Import java.awt.*; Import java.awt.gean.*; Public class File extends java.аплет.Аплет { Public void paint (Graphics g) { Graphics2D g2D= (Graphics2D) g; GradienPaint grad =new Gradient Paint (0,0, Color.blue, 50,50, Color.krange, ); g2D.setPaint (grad); Rectangle2D r=new Rectangle2D.Float (10,10,100,100); G2D.File(r); TexturePaint (BufferedImage Fillpattern, Rectangle2D r); FufferedImage класс нь массив ашиглан зургийн цэгүүдийг тус тусад нь удирдахад хэрэглэгддэг. Image классын нэг тусгай хувилбар юм. Rectangle 2D объект буцах хэлбэрийн хэмжээг тодорхойлно. Нь ийм хэмжээний тэгш өнцөгт блокуудаар дүүргэгдэх ба file pattern- д заасан хэлбэрээр будагдана. Дараах програмын код нь дүрсийн будалтын хэлбэрт TINY.GIF нэртэй зурган файлыг ашигласан. Import java.awt.*; Import java.awt.geon.*; Import java.awt.image.BufferedImage; Public class FileImage extends java.аплет.Аплет { Public void paint (Graphics g) { Graphics2D g2D= (Graphics2D) g; G2D. setstroke (new BasicStroke (601,BasicStroke.CAP_ROUND, Basicstroke.JOIN_ROUND)); GeneralPath p=new General Path (); SetBackground (Color.yellow); G2D.setColor (Color.red); p.moveTo (50,50); p. line To (300,300); p.move To(300,50); p.line To (50,300); Imag ing=getImage (getCodeBase(), “TINY.GIF”); BufferedImage bing=new BufferedImage (ing.getwidth (this), ing.getHeight (this), BufferedImage.TYPE_INT_RGB); Graphics2D temp=bing.create Graphics (); Temp.drawImage (img, 0,0, this); Revtange2D r=new Rectange2D.Float (0,0 ing.get width (this), ing.getHeigth (this)); TexturePaint tp=new TexturePaint (bimg, r); G2D.setPaint (tp); G2D.draw (p); -60- С.Ууганбаяр
  • 61.
    JAVA програмчлал } } Лекц №10 5.1Exception Handling Exception бол таны програмд үүсч буй бий болдог хэвийн бус байдал юм. (нөхцөл) Тийм нөхцөлд програмд үүсэхэд түүнийг боловсруулах тийм төлөвлөсөн код бичигддэг. Энэ нь С хэлэн дэх функцээр буцаагдсан алдааны кодтой төстэй. Функцийн буцаагдсан ямар ч утга шалгагдах ба утгаас хамааран түүнийг амжилттай биелсэн эсвэл алдаатай болсон эсэхийг шалгадаг. Хэрэв алдаа бол алдааны кодыг алдааны жагсаалтаас олж ямар алдаа гарсныг мэддэг. Java –н runtime орчин нь энэ байдлыг exception handling хэлбэрт объект хандлагат технологи ашиглан шийддэг. Excption handling –г ашиглан та програмаа гэнэтийн тасралт, төвөгтэй мэдээллүүдээс сэргийлж чадна. Эсрэгээр, бага зэргийн алдаа гарсан бол энэ нь ажиллах үед баригдах бөгөөд таны програм тасралтгүйгээр үргэлжилнэ. Бүх exceptio-ууд Throwable гэж нэрлэгдэх bnilt-н классын sub классууд юм. Throwable –н дор 2 үндсэн sub класс байдаг: Exception ба Error. Exception класс нь хэрэглэгчийн програмаар баригдах ёстой бүх асуудлуудыг шийддэг. Runtime Exception бол Exception-ий нэг чухал sub класс, ийм төрлийн exception-ууд нь 0-д хуваах г.м өмнө тодорхойлогдсон байдаг. Төлөвшөөгүй exception –ууд гадаад алдаанууд Error sub классын дор ордог. Жнь: стек дүүрэх Эдгээр нь runtime орчин өөрөө шийддэг ослын байдлууд юм. Системд тодорхойлсон exception –уудаас гадна хэрэглэгч мөн exception тодорхойлж болно. Дараах зурагт exception классуудын удамшлыг харуулав. Throwable Error Exception Runtime Exception Class Not Found Array Index Out Of Bounds Lincage Error Stack Over Flow -61- С.Ууганбаяр
  • 62.
    JAVA програмчлал 5.2 Exception-уудыгяаж барих вэ? Java нь Claus-р exception-г удирддаг: try, catch, throw, throws, finally. Програмд exception-ны байдал тулгархад exception-ны тохирох төрлийн объект нь exceptionны ижил методод шидэгддэг. Ингээд шидэгдэж ирсэн объектыг барихыг төлөвлөсөн метод байх ба exception-ыг өөрийн замаар шийддэг. Хэрэв энэ хийгдэхээргүй сонгогдсон ба exception-г тавьж явуулбал дараа нь дуудагч функц түүнийг авна, үгүй бол runtime орчин барьж авч програмыг таслана. 5.2.1 Try, throw, catch Exception-г үүсгэхээр төлөвлөсөн код нь try ба catch блок дотор бичигдэх ёстой. Exception-handling-ийн хамгийн үндсэн хэлбэр бол: Try { // бичиглэл // бичиглэл { catch (<Exception Type Class> object1) { // exception-г боловсруулах үйлдлүүд } Try.. catch блок дотор удалгүй exceptioyn-ий байдал үүснэ, exception-ний тэр тусгай төрлийн объект нь автоматаар үүсэж, шидэгддэг. Дараа нь шидэгдсэн объект төлөвлөсөн catch блокод очно, ө.х шидэгдсэн объектын төрөлтэй ижил параметр бүхий catch блок. Хэрэв блок тохирвол catch-д бичигдсэн exception-г боловсруулах кодууд биелнэ. Дараах програмыг үзье, энд exception үүссэн үед runtime орчин яаж боловсруулахыг жишээлэн үзүүлэв. Энэ нь сүүлд нь exception-г боловсруулахаар өөрчлөгдсөн байгаа. Үүссэн exception бол Number Format Exception. Энэ нь тэмдэг мөрийг бодит тоо руу хөрвүүлэх үед үүсдэг, тэмдэгт мөр нь нэг бол хоосон эсвэл зөв хэлбэрийн тоог агуулаагүй. Class NumForm Excp { -62- С.Ууганбаяр
  • 63.
    JAVA програмчлал public staticvoid main (String arge[ ]) { String str1=new String (“text12”); Int mm1= Integer.parseInt(str1); // тэмдэг мөрийн тоо руу хөрвүүлэх System.out.printen (mm1); } } Энэ програмын үр дүн нь: Exception in thread “main” java.lang.NumberFormatException: taxt12 At java.long.Integer.parseInt (Compiled code) At java.long.Integer.parseInt (Integer.java :458) At mmfornexcp.main (numformexcp.java :6) Дээрх програмд Str1 нь зөв тоон форматтай тоог агуулаагүй байна. Str1 тоо руу хөрвүүлэгдэхийг оролдох үед NumberFormatException төрлийн объект шидэгдэнэ. Энэ үед та энэ объектыг бариагүй учраас энэ нь runtime орчныг default exception handler-ээр боловсруулагдсан байна. Энэ нь стекийн мөрөөр орж ямар exception шидэгдсэн, ямар команд үүнийг үүсгэх болсон, мөн түүний үүссэн мөрийн дугаар методын дугаарыг хэвлэдэг. Доорхи програм нь энэ exception-г яаж боловсруулж болохыг үзүүлэв: Class NumFormExcp { public static void main (string args [ ]) { try { string str1=new String (“text12”); int num1=Integer.parseInt (str1); system.out.println (num1); } catch (NumberFormatException e) { system.out.println (“# # Wrong Number # # “); } } } Дээрхи жишээнд тохиолдсон exception нь ил тодорхой байна, ө.х. автоматаар шидэгддэг. Хэрэв та exception-г ил тодорхой шидэхийг хүсч байгаа бол та throw class-г хэрэглэх хэрэгтэй. Энэ нь та өөрийн exception-г үүсгэхийг хүсч, мөн тэднийгээ шидэхийг хүсэх үед хэрэглэгддэг. Системд тодорхойлогдсон бүх exception-ууд автоматаар шидэгддэг, харин хэрэглэгч тодорхойлсон exception- ууд throw class-г хэрэглэн шидэгдэх ёстой: Try { -63- С.Ууганбаяр
  • 64.
    JAVA програмчлал // бичиглэл thrownew Udef_Exception(); // бичиглэл } catch (Udef_Exception obj1) { system.out.println (“User defined exception caught”); } Udef_Exception нь exception-г боловсруулахаар тусгай хийгдсэн класс, мөн энэ нь хэрэглэгчийн тодорхойлсон шинжүүдийн зарим онцлог төрлүүдийг битүүмжилсэн. Хэрэглэгч тодорхойлсон exception үүсгэх зарчмыг сүүлд үзнэ. Энэ exception нь ил байдлаар throw clause-г ашиглан үүсгэгдэж байна. Та throw clause-н хамт Udef_Exception- ий объектыг дамжуулах хэрэгтэй. Нэгэн зэрэг catch clause нь ижил exception объектыг барихад бэлэн байдаг. Дараах жишээг үзье, энэ жишээнд throw clause-н үүргийг харуулахын тулд системийн exception-г зориуд шидсэн юм: Class Throw Clause { public static void main (string args [ ]) { try { throw new NullPointerException (); } catch (NullPointerException e) { System.out.println (“Invalid reference use”); } } } Дээрх жишээнд throw clause нь системд тодорхойлогдсон NullPointerException exception-ий объектыг шидэж байна. NullPointerException exception нь бодит хэрэгтээ объект null заагчийг агуулж байвал шидэгддэг. Үүний дараа, удалгүй exception үүсч catch блок түүнийг барьж авч мэдээлэл хэвлэж байна. ХЭрэв объект throwable классын удамшилд хамаардаг бол зөвхөн тэрээр шидэгдэж болно. String, Date г.м классууд throw-тэй хамааралтай ажиллаж чадахгүй. Лекц № 11 5.2.2 Throws Бид try блок дотор exception нь ил болон далд байдлаар шидэгддэгийг, мөн catch блок нь үүнийг барихад бэлэн байдгийг үзлээ. Гэвч exception-г шиддэг -64- С.Ууганбаяр
  • 65.
    JAVA програмчлал боловч түүнийгбиетэй кодоор барьдаггүй методууд байдаг. Энэ тохиолдолд exception-г шидэж байгаа метод нь тодорхойлолтдоо throws clause-г ашигласан байх ёстой. Throws clause нь сэрэмжлүүлэг мэдээ шиг байдлаар ажилладаг, ө.х дуудагч модуль нь шидэж байгаа exception-ээ өөрөө боловсруулахгүй гэдгээ мэддэг. Мөн энэ нь шидэгдэх exception-ээр боловсруулагдахаар байдаг. Ажиллах үеийн exception-уудын тохиолдолд тэднийг боловсруулахгүй орхиж байгаа метод нь throws clause –г ашиглах хэрэггүй байдаг, runtime орчин тэднийг боловсруулдаг. Дараах method_one () нэртэй методыг агуулсан классын бүтцэд анхаарлаа хандуулъя. Энэ метод нь exception объектыг шидэх, throws clause-г ашигласан байна. Энэ методод харгалзах catch clause байхгүйг анхаар. Энэ метод нь main () методоос дуудагдана, main () метод нь эргүүлээд exception –г method_one ()-р бариулна, учир нь exception-г боловсруулахгүй бол тэр нь throws clause руу хандаж чадах ба runtime орчноор боловсруулагдана. Class <class name> { static void method_one() throws <exception_one> { throw new <exception one> // method_one нь exsption-г ши дэх боловч барихгүй. } public static void main (string args [ ]) { try { method_one (); // main() метод нь exception-г шидээгүй, гэхдээ түүнийг // кодтой байна. } catch (<exception_one> object ) { // exception-г боловсруулах код } } } Дараах жишээнд анхааръя. Энэ жишээнд 2 статик метод байна: throwExcp() ба main () метод Throw Excp() метод нь IllegalAccess Exception exception-ий объектыг шиддэг бөгөөд түүнийг барьдаг. (IllegalAccessException нь халдах зөвшөөрөлгүй класс руу хандахыг оролдох үед шидэгддэг.) Гэвч catch блок дотор IllegalAccessException-ий объект дахин шидэгдэх ба энэ удаа тэр ямар нэг блок дотор баригдахгүй. Програмын хөрвүүлэх үед та алдааны мэдээлэл хүлээн авна. Class Throws_Clauses { static void throwExcp() -65- С.Ууганбаяр
  • 66.
    JAVA програмчлал { try { throw newIllegalAccessException(); // exception шидэгдэнэ. } catch (IllegalAccessException e ) // exception баригдана. { system.out.println(“catch блок”); throw new IllegalAccessException(); // exception дахин шидэгдэнэ. } } public static void main (string args [ ]) { throwExcp(); system.out.println (“coes not reach here”); } } Програмын үр дүн: Throws_Clauses.java:12:Exception java.lang.IllegalAccessException must caught, or it must throw new IllegalAccessException(); Ижил програмын өөрчилсөн хувилбарыг харъя. Throw Excp() функцийн тодорхойлолтод throws clause нэмэгдсэн байна. Энэ нь дуудагч функц нь exception-ий шидэхийг заадаг, гэвч түүнийг боловсруулахгүй. Компятор одоо throwExcp() функцийг exception боловсруулалтгүйгээр байхыг зөвшөөрнө, гэвч эсрэгээр дуудагч функцээс шаарддаг, ө.х main() exception-г боловсруулах ёстой. Тэгээд main() функц exception шууд шидэгдээгүйг үл харгалзан түүнийг боловсруулдаг. Throws clause нь үндсэндээ өргөн хүрээтэй зохиомжлолыг бүрдүүлдэг, үүсгэгч нь өөрийнхөөрөө exception-г боловсруулахгүй гэхдээ өөр методууд түүнийг дуудан өөрөөр exception-г боловсруулах боломж олгох зэргээр. Class Throws_Clauses { static void throwExcp() throws IllegalAccess Exception { throw new IllegalAccessException(); } public static void main (string args [ ]) { try { throwExcp(); } catch (IllegalAccessException e ) { -66- С.Ууганбаяр
  • 67.
    JAVA програмчлал system.out.println(“Exception caught”); } } } Програмынүр дүн: Exception caught 5.2.3 Finally Finally clause нь try –тэй хамт бичигддэг, try-н ардаас нэг бол catch эсвэл finally блок бичигдэх ёстой, мөн хоёулаа try-тэй хамт байх нь саадгүй /буруугүй/. Finally блокын ашиг нь тэр catch блокын дараа эсвэл метод гарахаас өмнө гарцаагүй биелдэг. Энэ нь дараах хэлбэртэй: Try { // бичиглэлүүд } finally { // бичиглэлүүд } эсвэл try { //бичиглэлүүд } catch (<exception> obj) { // бичиглэлүүд } finally { // бичиглэлүүд } Catch ба finally блоктой дараах жишээг авч үзье. Catch блок нь 0-д хуваах зэрэг арифметик алданы үед тохиолддог Arithmetic Exception –г барьдаг. Catch блокыг биелсний дараа finally мөн биелж хоёр блокоос мэдээлэл өгнө. Class Finally_Block { Static void division () { -67- С.Ууганбаяр
  • 68.
    JAVA програмчлал try { int num=34,den=0; int duot=num/den; } catch (ArithmeticException e) { system.ont.println(“Divide by zero”); } finally { system.ont.println(“In the finally block”); } } public static void main (string args [ ]) { division() } } Exception handling-тэй харьцаж байх үед програмын ажиллагааг олон удаа гэнэтийн хэвийн ажиллагааг саатуулах зүйлтэй тулгардаг. Энэ нь заримдаа хүсээгүй зарим үр дүнд хүргэдэг. Жнь: файл нээдэг, түүнрүү өгөгдөл бичдэг, хаадаг методыг тасладаг. Ийм байдалд finally clause нь урхидахад хэрэглэгддэг. Прогаммын бүтцийг дор харуулав. Class Write_To_Stream { public void open_Stream () { //урсгалыг нээх } public void writing_To_Stream () { try { // урсгал руу бичих } finally { // урсгалаас цагаас нь өмнө хаах } } public void close_Stream () { // урсгалыг хаах } public class IO { public static void main (string args[ ]) -68- С.Ууганбаяр
  • 69.
    JAVA програмчлал { // Write_To_Stream-нметодуудыг дуудах } } } 5.3 Олон Catch clauses-ууд Try блокоор хүрээлэгдсэн код үргэлж дан exception-г шийдэж байдаггүй. Хэрэв try блокод олон ялгаатай төрлийн exception шидэгдвэл тэдгээр бүх exception- уудыг боловсруулахын тулд олон catch блокыг тавьж болно. Exception шидэгдсэн үед энэ нь тохирох catch блок олдох хүртэл нэг нэгээр catch блокуудаар нэвтэрдэг. Тийм тохиолдолд програмын бүтэц: try { // бичиглэл } catch (<exception_one> obj) { // бичиглэл } catch (<exception_two> obj) { // бичиглэл } catch (<exception_three> obj) // бичиглэл } Ийм замаар та олон төрлийн exception-уудыг хослуулан боловсруулах боломжийг програмдаа бий болгоно. Мөн Exception класс гэж нэрлэгдэх ерөнхий exception класс байдаг. Тиймээс exception-г барих үед та exception-ий төрлийг засахыг хүсэхгүй бол ерөнхий exception тавьж болох ба ингэхэд дурын төрлийн exception-ийг боловсруулж болно. Class Gen_Exp { public static void main (String args [ ]) { try { int num =34, den=0; int quot = num/den; } catch (Exception e) { system.ont.println(“Error in the code”); } -69- С.Ууганбаяр
  • 70.
    JAVA програмчлал } } Ерөнхий exceptionкласс нь мөн олон блокод хэрэглэгдэж болно. Энэ тохиолдолд ерөнхий exception-г хамгийн сүүлийн catch блокт тавих нь зүйтэй. 5.4 Үүрлэсэн try блок Java нь exception боловсруулалтад зориулж хэд хэдэн built-н классуудыг тодорхойлсон байдаг. Эдгээр байх классууд java.long пакетын нэг хэсэг, энэ пакет нь амвтоматаар импорлогддог. Built-ийн exception классуудаас гадна та өөрийн exception классыг тодорхойлж болно. Энэ нь стандарт exception төрлүүдээс ялгаатай шинжүүдийг агуулсан exception төрлийг үүсгэхэд маш чухал, ялангуяа өөрийн праграмдаа баталгаа (validation) хийхийг хүссэн үед. Дор өгөгдсөн жишээ нь хэрэглэгч тодорхойлсон exception-г үүсгэж ашмгласан байна. Энэ жишээнд exception класс нэгэн ижил .java файлд үүсгэгдэж, ашиглагдаж байна, гэхдээ exception төрлүүдийг пакетуудад хадгалж, глобалиар ашиглаж болно. Class Validate_Range extendes Exception { String mesg; Validate_Range () { mesg=new String (“Enter between 20 and 100”); } public String to String () { return (mesg); } } public class My_Exception { public Static void main (String args [ ]) { try { int x=10; if (x<20 // x>100) throw new Validate_Range(); catch (Validate_Range e) { system.ont.println (“**” +e); } } } 5.5 Exception-уудыг хэдийд хэрэглэхгүй вэ? -70- С.Ууганбаяр
  • 71.
    JAVA програмчлал Exception боловсруулахмеханизм нь алдаанд хүргэх нөхцөлүүдийг зайлуулах тодорхой зам юм. Гэвч та үүгээр мэдээлэл хийх болон хүссэн газраа exception боловсруулалтыг хэрэглэж болохгүй. Тэд хянамгай төлөвлөгдөж, хэрэгжигдэх ёстой. Дараах тохиолдлуд хэзээ та exception-с зайлсхийх ёстойг зөвлөнө: Та алдаатай нөхцөлүүдээс exception handling-гээр бага хэмжээний кодоор хялбар зайлсхийж болно. Exception-с ашигладахд илүү дээр гэж үзвэл. Хэдийгээр exception handling нь програм зохиогчдод маш тохиромжтой санагддаг боловч энэ нь процессорт их хугацаа авдаг. Карим тохиолдолд exception handling нь маш хөнгөмсөг байдаг ба тэдний орших зорилгыг умартан үсрэлтийн механизм шиг ашиглагдсан байдаг. Энэ бол сайн програмчлалын арга биш, энэ нь сүүлд таны кодыг үймүүлдэг ба зааварлахад хэцүү болгодог. Мөн хэрэв кодын хэсэг зарим exception-г алдаж байгаа бол энэ нь зөв боловсруулагдсан байх ёстой. Exception-г барих нь зөвхөн тулд байдаг бөгөөд catch блокыг хоосон орхих нь тусгүй юм. Эргэж санахад, exception-ууд бол гарч болох алдаануудын хувьд сэрэмжүүлэг нь болдог. Лекц №12 Java дахь Mulmithreading 6.1 Multithreading Multithreading гэдэг нь програм thread гэж нэрлэгдэх 2 буюу дээшхи хэсгүүдэд хуваагдаж, тэдгээр бүх thread -үүд паралель ажиллах ойлголт юм. Multithreading нь програмуудыг уян хатан, үр ашигтай болгодог бөгөөд түүний бүтээмжийг бас дээшлүүлдэг. Жнь: өнөөдөр вэб хуудсууд дуут хөдөлгөөн, текст зэргийг бүгдийг нэгэн зэрэг дүрслэх хэрэгтэй байдаг. Хэрэв энэ нь уламжлалт Single- threaded үзэгдлийн давталтыг ашиглан хийгдвэл програм ачаалагдахад их хугацаа авдаг, харин хугацаа бол web програмуудын хувьд маш чухал шийдвэрлэх хүчин зүйл юм. Program P Thread 1 -71- С.Ууганбаяр
  • 72.
    JAVA програмчлал Програм ньmultithreading ашиглалгүй ажиллах үед event loop гэж нэрлэгдэх аргыг дагадаг. Энэ аргад нэг дан процесс удирдлагыг авч, дараа нь юу хийхийг шийдэж байдаг. Энэ нь үүнийг шийдэхийн тулд дан үзэгдлийн дарааллын механизмтэй хамт polling-г хэрэглэдэг. Нэгэнт polling механизм тодорхой бөгөөд бэлэн гэдгийг дохиолж буцаахад энэ нь хүсэлтийг тохирох үзүэгдэл боловсруулагч руу илгээдэг. Энэ үзэгдэл боловсруулагчаас буцах хүртэл юу ч болохгүй. Thread Thread 2 3 С ба С++ зэрэг дээр үеийн хэлүүд multithreading дэмждэггүй, учир нь тэр үеийн үйлдлийн ситемд үүнийг дэмждэггүй байсан. Microsoft windows, Apple Maantegh зэрэг үйлдлийн системүүд нь уламжлалт event loop загвараар хийгдсэн. 6.1.1 Яагаад Multithreading Multithreading нь програмын хугацаа шаардах даалгаврууд (tasks) бусад нөөцүүд сул болохыг хүлээх, эсвэл заримынх нь хугацаа хэтрэлт болохыг хүлээх тийм байдлуудад их ач холбогдолтой. Multithreading нь Single-processor орчинд явагддаг. Олон процессорын орчинд ялгаатай thread -үүд өөр өөр процессорууд дээр ажиглана. Зур. Ялгаатай процессорууд дээр ажиллаж буй thread-ууд -72- С.Ууганбаяр
  • 73.
    JAVA програмчлал Нэг процессортойсистемд эдгээр нь өөр замаар явагдана. Ийм системд олон thread-ууд CPU time-г хуваан эзэмшдэг. Үйлдлийн систем нь thread-уудад мүүдыг хувиарлах, төлөвлөх үүрэгтэй. Энэ зохион байгуулалт нь trhead үргэлж CPU time шаардах хэрэггүй бол маш ач холбогдолтой. Энэ хугацаанд бусад thread CPU-г авна. Өмнөх thread тухайн thread-г дуссаны дараа идэвхжнэ. 6.1.2. Multitasking ба Multithreading Олон орчин ү/с-д multitsking байдаг, олон хүмүүс multitasking-г multithreading- тэй эндүүрдэг. Multitasking ба multithreading нь бие биеэсээ маш ялгаатай. Maltitasking-д task бол heavy-weight (хүнд жингийн) процесс. Heavy-weight ба light-weight –н хоорондох ялгаа нь heavy-weight процесс нь ялгаатай хаяган орон зайд байдаг. Нөгөө талаас light-weight процесс нь ижил хаяган орон зайг хувааж эзэмшдэг. Нэг машин дээрх ялгаатай програмууд ажиллаж байгааг multitasking гэж ойлгож болно, ө.х J Builder ба Word хоёулаа нэг машин дээр ажиллаж байгаа нь multitasking. Харин Word текстийг хэлбэржүүлэх, scroll хийх нь нэгэн зэрэг явагддаг. Энэ бол multithreading. 6.1.3 Java-ийн Thread загвар (model) Java орчин нь multithread загвараар зохиогдсон. Үнэндээ, бүх классын сангууд multithreading-ээр зохиомжлогдсон. Хэрэв thread хэсэг хугацаанд зогсолтын байдалд орвол програмын амралтад энэ нь нөлөөлөхгүй. Төстэйгээр, animation давталт нь зургийг дүрслэхэд өдөөгдөж болно. Мөн кадруудын хоорондох секундэд амардаг. Энэ нь animation нь системийн амралтын ажиллагааг зогсоохгүй хугацааны нэг эгшинд thread дараах төлвүүдийн нэгэнд орсон байдаг. –new , ready, running, inactive, finished. Thread үүссэнийхээ дараа new төлөвт ордог. Эхэлсний дараа ready болно. Үүний дараа runing төлөвт орно. Thread ажиллаж байх үедээ блокод орж болно. Учир нь түүний хүссэн нөөц бэлэн бус эсвэл бусад шалтгаанаар түр зогсоогдож болно. Ийм тохиолдолд thrad inactive төлөв төрдөг. -73- С.Ууганбаяр
  • 74.
    JAVA програмчлал New FinishidReady Thread зэрэглэл Multithreadingорчинд нэг thread нөгөөгөөсөө илүү CPU шаардаж болно. Ийм тохиолдолд уг thread өндөр зэрэглэлтэй байх хэрэгтэй. Thread-н зэрэглэл нь нэг thread-с нөгөө рүү шилжих дүрмийг тодорхойлдог. Thread-н зэрэглэл бол 1-ээс 10 завсар дахь бүхэл тоон утгууд юм. 10 нь өндөр, 1 нь доогуур. Зэрэглэл гсэн ойлголт нь thread –н хурдан ажиллахтай эндүүрч болохгүй. Өндөр зэрэглэлтэй thread доогуур зэрэглэлтэй thread –ээс ямагт хурдан ажиллахгүй . Thread сайн дураараа шууд зогсоож, унтаж эсвэл I/ 0 –с шалтгаалан блоклогдож, эсвэл системийн тушаалаар pre-empted болж удирдлагыг орхиж болно. Эхний тохиолдолд процессор бүх thread-үүдийг шалгаж, удирдлагын Running Inactive -74- С.Ууганбаяр
  • 75.
    JAVA програмчлал өндөр зэрэглэлтэйthread –д удирдлагыг олгодог. Хоёр дахь тохиолдолд удирдлагыг орхиход бэлэн бус доогуур зэрэглэлийн thread өндөр зэрэглэлтэй thread-р түүний юу хийж байгааг нь үл харгалзан pre-empted болдог. Үүнийг pre-emptive multi-tasking гэдэг. Хоёр thread ижил зэрэглэлтэй тохиолдолд энэ нь зөвлүүштэй зүйл юм., Тэд удирдлагыг тэг байхаар тохиролцох ёстой. Synchronization Multithrasking нь програмын хувьд asynchronous шинжийг бий болгодог. Энэ нь бүх thread-ууд бие биендээ нөлөөлөхгүй үл хамаарах нэгжүүд байдлаар ажилладаг гэсэн утгатай. Гэхдээ зарим тохиолдолд энэ нь эдгээр thread-уудыг зайлшгүй синхронжуулах хэрэг болдог. Жнь: Синхронжуулалт нь 2 thread ижил хувьсагч буюу массивтэй адил өгөгдлийн бүтцүүдийг хамтран эзэмших үед хэрэглэгддэг. Мэдээ Multithreading орчинд нэгээс илүү thread байх үед inter-process харилцаа чухал болдог. Thread буюу thread-үүдтэй харицаж чаддаг байх ёстой. Thread-үүд бие биетэйгээ wait ба notify методуудыг ашиглаж ярьж чадна. 6.2 Thread үүсгэх Thread нь Java програмуудад 2 замаар үүсч бий болно. Thread классыг өргөтгөж,Runmable интерфэйсийг хэрэгжүүлэх. Програм Thread классыг өргөтгөх үед (удамших) уг классын run() методыг дарж тодорхойлох ёстой. Хэрэв програм Runnable интерфэйсийг ашигласан бол зөвхөн run() методыг хэрэгжүүлэх хэрэгтэй. Бид эдгээрийн тухай тус бүрд нь үзнэ, гэхдээ эхлээд main thread-н тухай яръя. 6.2.1 Main Thread Main метод нь Java програм ажиллах болгонд ажиллаж байдаг тийм thread-г заадаг. Үүнийг main thread гэж нэрлэдэг, учир нь энэ програм ажиллаж эхлэх үед эхлээд ажилладаг thread юм. Бусад thread –ууд энэ үндсэн thread-с гарч болно. Үндсэн thread нь програм дахь сүүлийн thread байх ёстой. Main thread зогсоход програмын ажиллагаа зогсоно. Main thread нь автоматаар үүсдэг, гэхдээ энэ нь thread объектыг ашиглан програмаар удирдагдаж болно. Thread объект нь Thread классын currentThread () методын тусламжтайгаар main thread-н заалтыг авч чадна. Доорхи жишээнд: main thread яаж удирдагдаж болохыг үзүүлэв: Class MainThread { Public static void main (String args [ ]){ Thread t = Thread.currentThread(); System.ont.println(“Current Thread : ” + t); System.ont.println(“Name : ” ++.getName()); System.ont.println(“ ” ); t.setName (“New Thread”); -75- С.Ууганбаяр
  • 76.
    JAVA програмчлал -76- С.Ууганбаяр System.ont.println(“After changingname”); System.ont.println(“Current Thread : ” + t); System.ont.println(“Name : ” + t.get Name ()); System.ont.println(“ ”); System.ont.println(“This thread first 10 numbers ”); Try { For (int I =1; I < = 10; I ++) { System.ont.print (i); Thread.sleep (1000); } } catch (Interrupted exception e) { } } } 6.2.2 Thread классаас удамшуулж thread үүсгэх Thread үүсгэх эхний арга бол Thread классын sub классыг үүсгэх. Энэ класс нь run() методыг дарж тодорхойлох ёстой, мөн бусад методуудыг бас дарж болно. Дараа нь уг классын объектыг үүсгэж болно. Энэ алхмуудыг доорхи зурагт харуулав. h тооны тэмдэгт мөр хэвлэдэг thread үүсгэх програмын жишээг авъя. Энэ програм Thread классыг өргөтгөж thread үүсгэсэн. Class PrintString 1 { Public Static void main (String args [ ] ) { String Thread1 t = new StringThread 1 (“Java”, 50); t.Start (); } } classes StringThread1 extends Thread { private String str; private int num; StringThread1 (String s, int n ) { Str = new String (s); Class My Thread extends Thread { My Thread ( ) { …….. …….. } public void run () { ….. ….. } ….. } Class Example tic void main () { My Thread t=new My Thread (); …. t (); …… } } { public sta t.Star
  • 77.
    JAVA програмчлал Num =n ; } public void run () { for (int I = 1; I c = num; I++) system.ont.print(str+” ”); } } 6.2.3 Runnable интерфэйсийг хэрэгжүүлж thread үүсгэх Өмнө хэлснээр, thread нь Runnable интерфэйсийг хэмэргжүүлснээр мөн үүсч болно. Эндээс эдгээр аргуудын алийг нь thread үүсгэхэд ашиглах вэ? гэсэн асуулт гарна. Хэрэв таны үүсгэж байгаа thread класс бусад классын sub класс бол энэ нь thread классаас удамшиж чадахгүй. Учир нь Java нэгээс дээш классаас удамшихыг зөвшөөрдөггүй. Ийм үед Runnable интерфэйсийг ашигладаг. Өмнөх програмыг Runnable интерфэйсийг ашигласан байдлаар өөрчилье. Class PrintString 2 { Public Static void main (String args [ ] ) { String Thread 2 t = new StringThread (“Java”, 50); New Thread (+).Start (); } } classes StringThread 2 implements Runnable { private String str; private int num; StringThread 2 (String s, int num ) { Str = new String (s); Num = n ; } public void run () { for (int I = 1; I c = num; I++) system.ont.print(str+” ”); } } Өмнөх болон энэ програмын хоорондох ялгаа бол Thread классаас удамшуулан thread үүсгэх үед шууд t.Start () гэж байсан. Учир нь String Thread1 бол Thread классын sub класс, тиймээс тэр thread-н бүх боломжуудыг агуулсан байна. Runnable –г ашиглан thread үүсгэх үед Thread объект PrintString2 классынхтай адилаар ил үүсгэгдэнэ. Дараа нь String thread 2 объктыг түүнд параметр болгон дамжуулж ажиллуулна. Энэ нь String Thread 2 классын run() методыг ажиллуулахын тулд хийж байгаа хэрэг. Мөн дээрхи програм Runnable интерфэйсийг хэрэгжүүлэн, мөн StringThread 3 классын дотор Thread объектыг үүсгэж өөрчлөгдөн бичигддэг. Class PrintString 3 { Public Static void main (String args [ ] ) { -77- С.Ууганбаяр
  • 78.
    JAVA програмчлал New stringThread 3 (“Java”, 50); } } class StringThread 3 implement Runnable { private String str; private int num; StringThread3 (String s, int n ) { Str = new String (s); Num = n Thread t =new Thread (this); T. start(); } public void run () { for (int I = 1; I c = num; I++) system.ont.print(str+” ”); } } 6.2.4 Олон thread үүсгэх, удирдах 3 thread үүсгэе- нэг нь “Java”-г 100 удаа хэвлэдэг, нөгөө нь “Cafe”-г 100 удаа хэвлэдэг, гурав дахь нь 150-с баг а анхны тоо хэвлэдэг. Class MultiThread { Public Static void main (String args [ ] ) { new Thread(new StringThread (“Java”,100)).Start (); new Thread(new StringThread (“Cafe”,100)).Start (); new Thread(new PrimeThread (150)).Start (); } } classPrimeThread inylementsRunnable { private int Castval; primeThread ( int n ) { Castval= n; } public void run () { int I, j; booloon flag; for (I=2; I<= n; I++) { flag = false ; for ( j2; j<=i/2; j++) if (i%j==0) flag=true; if (flag==false) system.ont.print (it+” ”); } } -78- С.Ууганбаяр
  • 79.
    JAVA програмчлал } class StringThread implements Runnable { private string str; private int num; stringThread (String s, int n) { str = new String (s); num = n; } public void run () { for (int i=1; i<=num; i++) System.ont.print (str+ “ “); } } } 6.3 Thread-н зэрэглэл Thread класс нь MIN_PRIORITY. NORM_PRIORITY, MAX_PRIORITY утгуудыг тодорхойлсон байдаг бөгөөд тус бүр нь харгалзан 1,5,10 утгууд авдаг. Thread default-оороо NORM_PRIORITY-тэй байдаг. Java нь доогуур зэрэглэлтэй thread –ээс өндөр зэрэглэлтэй thread-г дээгүүр тавьдаг. Хэрэв 2 буюу түүнээс дээш thread-ууд ижил зэрэглэлтэй бол CPU нь тэдэнд round-robin маягаар хувиарлагддаг. Бид StringThread классын жишээг үзсэн. Одоо 4 thread үүсгээд тэдэнд 5,6,7,8 зэрэглэлүүдийг харгалзан тогтоож яаж ажиллахыг харъя. Import String Thread; Class PriorityThread { Public static void main (String args [ ] ) { Thread t 1=new Thread (new String Thread (“Java”, 25)); Thread t 2=new Thread (new String Thread (“Cafe”, 25)); Thread t 3=new Thread (new String Thread (“Symantic”, 25)); Thread t 4=new Thread (new String Thread (“Platform2”, 25)); t1.setPriority (Thread.NORM_PRIORITY); t1.setPriority (Thread.NORM_PRIORITY +1); t1.setPriority (Thread.NORM_PRIORITY+2); t1.setPriority (Thread.NORM_PRIORITY+3); t1.start (); t 2.start (); t3.start (); t4.start (); } } Thread-үүд бүгд 25 удаа тэмдэгт мөр хэвлэнэ. “Pleatform 2” –г хэвлэж байгаа thread өндөр зэрэглэлтэй болохоор хамгийн эрт дуусна, г.м -79- С.Ууганбаяр
  • 80.
    JAVA програмчлал Лекц №13 6.4synchronization Бид өмнө синхронжуулалтын тухай ярьсан. Энэ нь 2 буюу түүнээс дээш тооны thred-ууд ижил хувьсагч, обьект руу хандахыг оролдох үед яригддаг. Энэ нь monitor гэсэн ойлголтыг inter-process синхронжуулалтад хэрэглэдэг. Monitor Нь хугацааны эгшинд зөвхөн 1 thread-ыг багааж байдаг хайрцаг адилаар ажилладаг. Хэрэв 1 thread-ыг агуулсан бол бусад бүх thread-үүд эхний thread- ыг гартал нь хүлээх ёстой. Monitor нь хамтран эзэмшиж байгаа хувьсагч өгөдөлийн бүтэц буюу түүнээс дээшthread-үүдэд ашиглагдаж байгаа байдлаар зохион байгуулдаг. Гэвч Java-д обьектыг үүсгэж болох monitor класс байхгүй. үүний оронд обьект бүр нь тодорхой синхронжсон методуудаар хангагддаг. Обьект бүр эдгээр синхронжсон методуудаас аль нэгийг дуудаж өөрийн monitor-д орж болно. Нэрэв thread обьект дахь синхронжсон методуудыг дуудагч буюу thread-үүд тэр обьект дахь синхронжсон методыг дуудаж чадахгүй. • Үүнийг сайн ойлгохын тулд жишээ авъя. Бидэнд 2 хувьсагчтай Accout класс бичих гэж үзье.(account number Ба balance) мөн Negative Amount Exception, Insufficient Fund Exception нэртэй 2 класс байна гэе. Энэ 2 класс хоёулаа нийт дүн 0-ээс бага бол, мөн балансаас илүү гарах үед үүсэх асуудлыг шийдэхэд зориулж үүссэн. Account Класс нь методуудтай. • Get balance-Тооцооны нийт балансыг буцаана. • Set balance -Балансыг тогтооно. • Deposit -Нийт дүнг авах, түүнийгээ тооцооны баланс дээр нэмнэ. Энэ метод нь хэрэв нийт хадгаламж 0-ээс бага байвал Negative Amount Exception үүснэ. • With draw-Нийт дүнг авч, түүнийг балансаас хасна. Энэ метод нь 2 Exception-ийг үүсгэнэ. Хэрэв хадгаламж 0-ээс бага бол Negative Amount Exception , хэрэв буцааж авсан дүн нь балансаас хэтэрвал Insufficient Fund Exception. Class account1 Int account no; Float balance; Account (int ac, float bal){ Account no=ac; Balance=bal; } float get balance () { return balance; } void set balance( float balance){ balance= bal; } void deposit (float amount) throw negative Amount Exception{ if (amount < 0) throw now Negative Amount Exception() ; balance = balance +amount ; } -80- С.Ууганбаяр
  • 81.
    JAVA програмчлал void withdraw (float amount) throw Negative Amount Exception, Insufficient Fund Exception { if (amount < 0) throw now Negative Amount Exception(); if (balance < amount ) throw now Insufficient Fund Exception(); balance = balance – amount; } class negative amount exception extend exception{ negative amount exception () ; super (“negative amount”); } } class insufficient fund exception extend exception{ insufficient fund exception(); super (“Insufficient Fund”); } } import account; class nosync { public static void main ( string args [ ] ); account a1 = new account (1,1000) account a2 = new account (1,0 ) thread +1 [ ] =new thread {100 } thread +2 [ ] =new thread {100 } threadgroup g1 = new threadgroup(“group1”) threadgroup g2 = new threadgroup(“group2”); for ( int I= 0; I<100; I ++){ t1 [ I]= new thread (g1, new transforthread ( a2,a1,1), “t1”) t1 [ I].star+ ( ); } for ( int I= 0; I<100; I ++){ t2 [ I]= new thread (g2, new transforthread ( a2,a1,1), “t2”) t2 [ I].star+ ( ); } while ( true) { if ( g1. activecount ( )==0)&& ( g2. activecount ( )==0) break; system.out.println (“balance in account1”+ a1.getbalance( ) ); system.out.println (“balance in account2”+ a2.getbalance( ) ); } } } class transferthread extends thread1 account from account, to account; float amount; transferthread (account a1, account a2, float amt){ fromaccount = a1; toaccount = a2; -81- С.Ууганбаяр
  • 82.
    JAVA програмчлал amount =amt; } public void um ( ) { transfer ( fromaccount, toaccount, amount); } void transfer ( account from, account to, float amt) { float formprior = from.get balance ( ); float toprier = to. Get balance ( ); try { sleep (1000) } catch ( interrupted exception e ) { } try { to deposit (amt); from.withdraw (amt) } catch (negative amount exeption e ) { from.set balance (fromprior ); to,setbalance (toprior); } catch (insufficientfund exeption e){ from.set balance (from prior); to.setbalance( toprior); } } } Програиыг одоо эхлээд атигоё. Энэ програмд Threadgroup гэж нэрлэгдэх класс ашиглагдсан бна. Threadgroup Нь thread-үүдийн бүлэг. Thread -Ийг хамтад нь бүлэглэхийн давуу тал нь нэгэн зэрэг бүлэг дэх бүх thrad-үүдийг түр зогсоох буюу буцаан идэвхжүүлж болно. Энэ програм нь thread обьектын 2 массив үүсгэж байна. +1;+2 мөн “g1” “g2” нэртэй 2 обьект үүсгэж байна. тэгээд тэдгээрт харгалзан group1, group2 нэрүүд оноож байна. энэ нь а1-а2 руу re1ийг дамжуулах 100 thread-үүдийг үүсгэж тэднийг “g1”рүү нэмж эхлүүлж байна. мөн “g2” адил. Дараа нь програм төгсгөлтэй давталтанд орж байна.Энэ давталт нь бүх thread-үүд ажлаа дуусган хүртэл ажиллана.Энэь threadgroup дэх идэвхтэй thread-үүдийн тоог тодорхойлох activecount метоор хйигдэнэ. Thread үүсгэхэд програм transferthread обьектыг ашигласан.Энэ класс нь байгуулагч метод thread run нь эргүүлээд методыг дуудна. Thread-үүд бие биеээсээ үл хамааран ажиллаж байгаа тул өгөгдлийн гэмиэл гарна.Асуудлыг шийдэх зам тал буюу 2 түүнээс дээш thread-ээр хангагдаж байгаа нөөцийн хувьд synchronized гэж тодорхойлох хэрэгтэй.Дээрх програмд transfer метод нь өгөгдлийг зөв шилжүүлэхийн тулд synchronized байх ёстой. Тиймээс transfer метод дараах байдлаар тодорхойлогдох ёстой. Synchronized void transfer (account from accoun to float amt) Метод synchronized гэж зарлагдсаны үр дүнд энэ метод нь түүнийг эхний thread дуудах үед monitor-руу ордог. Тэгээд бусад thread-үүд эхний thread-ийг гартал түүнрүү хандаж чадахгүй. 6.5 inter thread communication методод synchronized түлхүүр үгийг хэрэглэсэнээр бусад thread-үүд дуртай цагтаа уг методруу хандахыг блоколдог. үүнийг т аметодын тусламжтайгаар хийж болно. Энэ метод нь идэвхтэй ийг мониторруу өгөх ба бусад методууд тэр мониторруу орох хүртэл түр зогссон байдаг.мөн notify методыг дуудна. Энэ нь -82- С.Ууганбаяр
  • 83.
    JAVA програмчлал ижил обьектдээр wait-ийг дуудсан тэр эхний thread-ийг сэргээнэ. Эн этохиолдолд олон thread-үүд wait-ийг ижил обьект дээр хэрэглэн түр зогссон байх ба та тэднийг notify all методыг ашиглан буцааж болно. Эдгээр бүх методууд нь зөвхөн synchronized методоос дуудагдана. Ийн хэрэгцээг ойлгохын тулд жишээ үзье.produser consumer-ийн асуудлыг харуулсан жишээ авъя. 2 методтой дараалал байг. –put Ба –get. Put метод нь дараалалд байх тоо оруулдаг, get нь авдаг. Produser Класс нь дарааллын эхний утгыг тогтоож, дараалалд нэгээс эхлэн төгсгөлгүй бүхэл утгуудыг тавих thread- ийг эхлүүлдэг. Consumer Класс нь мөн дарааллын эхний утгыг тогтоож дараалал дахь утгуудыг авдаг thread-ийг эхлүүлдэг байг. Дараахь код байг. Class queen 1 Int n; Synchronized int get () { System out printin ( “ got:” +n); Return n; } synchronized void put ( int n) { this.n=n; system.out.println (“put:”+n); } } class produser implements runnable{ queen q; produser (queen q){ this.q=q; new thread (this, “produser”).start+( ); } public void run ( ) { int i=0; while ( true) { q.put (I++); } } } class consumer implements runnable { queen q; produser (queen q){ this.q=q; new thread (this, “produser”).start+( ); } public void run ( ) { while( true) { q.get ( ) } } } class interthread { public static void main ( string args) { queen q= new queen( ); -83- С.Ууганбаяр
  • 84.
    JAVA програмчлал new produver(q); new consumer (q); } } Үр дүнд нь: put :27 get :27 put :28 get :28 get :28 put :29 get :29 put( ) get( ) методууд нь хүёулаа synchronized гэж тодорхойлогдсон. Гэвч 28 тоо 2 удаа хэвлэгдсэн байна. энэ нь үл хамааарах методууд synchronized зарлагдана гэсэн үг. consumer дараалан 2 удаа авах эсвэл producer consumer – аас илүү гарч ажиллах зэргийг зогсоох зам байхгүй. Энэ нь дээр хэлсэнээс харагдаж байна. producer дараалалд 28 тоог тавьсан, consumer тэр утгыг 2 удаа авч байна. бид энэ програмыг зөвхөн тавьж дууссаны дараа дараалал руу хандахаар мөн хандсаны дараа утгыг тавихаар өөрчилөе. Ингэж өөрчлөхийн тулд классад зарим өөрчилөлт хийнэ. Class queen { Int n; Boolean flay= false; Synchronized int get ( ) { If ( flay==false ) Try { Wait ( ); } catch ( interrupted exception e ) { } system.ant.printen (“got:”+n ); flag= false; modify ( ); return n ; } synchronized void put (int n) { if (flay== true) try{ wait ( ); } catch (iterruped exception e) { } this.n = n; flag=true; system.out.println ( “put:”+n); modify( ); } } 6.6 Thread ашиглан animation үүсгэх animation гэдэг бол зураг, дуу авиа, текст гэх мэтийг байрлуулсан frame-ийн процесс юм. Энэ frame нь дараа нь дэлгэц дээр зурагдана. Frame үүсгэх энэ процесс ба тэдгээрийг дэлгэц дээр зурах нь хуурмаг хөдөлгөөн үүсгэхийн тулд давтагддаг. Frame бүрийн хооронд нийт хугацаа нь ялгаатай байж болдог. -84- С.Ууганбаяр
  • 85.
    JAVA програмчлал Animation үүсгэхийнхэрэгцээг ойлгохын тулд цэг дүрсэлдэг дараах жишээг авъя. inport java.util.Gregorian calendar; import java.text.dateformat; import java.awt.x public class clock extends java аплет.аплет{ int xcontre ycentre, clock radins; dateformat df; gregoriancalendar col; public void init ( ){ df=dateformat.getdatetime instance ( ); clockradins=(int) ((getsize( ).width( )*0.5*0.7) xcentre= (getsize( ).width( )/2; ycentre= (getsize( ).width( )/2; } public void point (graphics g){ g.setcolor (color.black); g.draworal (vcentre.clockradins, ycentre-clockradins, 2*clockradins); g.drawstring (“12”, xcentre-5, ycentre-clockradins); g.drawstring(“3”, xcentre+dookradins, ycentre+3); g.drawstring(“6”, xcentr-2, ycentre+ dookradins+10); g.drawstring(“3”, xcentr- dookradins -10, ycentre+3); col= new Gregorian calendar; int s= (int ) col.get (Gregorian calendar.second); int strength= (int) (dookradins*0.9); int secondx= (int) (math.cos((s/60.0)+2*math.pi-math.pi/2)*slenght+xcentre); int secondy= (int) (math.sin || s/60)*2*math.pi-math.pi/2)*slenght+ycentre); g.setcolor (color.green); g.draw.line (xcentre. Ycentre, secondx, secondy); int m=(int)col.get (Gregorian calendar~minute); int m length= (int) (calendar radius*0.8); int minutex=(int)(math.cos((m/60.0)*2*math.pi-math.pi/2)*mlenght+xcentre); int minutey= (int) (math.sin((m/60.0)*2*math.pi-math.pi/2)*mlenght+ycentre); g.setcolor( color.blue); g.drawlink(xcentre, ycentre, minutex, minutey); int h= (int) col.get (Gregorian calendar.hour_of_day); int hlenght=(int)( dookradius*0.7); konble hourangle=(h/12.0)*2*math.pi+(m/60.0)*(2*math.pi/60.0)-math.pi/2; int hourx=(int) (math.cos (hourangle)*hlenght+xcentre); int houry=(int) (math.sin (hourangle)*hlenght+ycentre); g.setcolor (color.red); g.drawline(xcentre, ycentre, hourx, houry); string today= ds.format(col.gettime() ); font metrics sin =g.setfontmetrics(); g.drawstring(today,(getsize().width—sin.stringwidth (today))/2, ycentre+clockradius+30); } } -85- С.Ууганбаяр
  • 86.
    JAVA програмчлал Бид гэжюу болох, ямар нөхцөлд ийг хэрэглэхийг мэднэ. Animation бол thread- ийн бодит зорилго юм. Thread-үүднь давтагдан үргэлжилсэн үйлдэл, жишээлбэл gnimation адил зурах үйлдлүүдийн нөхцөлд чухал зүйл болдог. Thread-тэй аплет үүсгэхийн тулд програмд дараах өөрчлөлтүүдийг хийх ёстой. 1.класс зорилт нь Implements runnable class-ийг агуулах 2.програм Thread обьект үүсгэх ёстой 3.Thread үүсгэх аплет-ийн start методыг дарж тодорхойлох, түүнийг ажлуулж эхлүүлэх 4.Thread-ийн ажиллагааг зогсоох аплет-ийн stop методыг драж тоодорхойлох 5.hread-ийн ажиллагаанд зориулсан run методыг үүсгэх, энэ метод нь repaint методыг дахин дахин дуудах ёстой. Бид идэвхтэй цагийг дүрсэлдэг програм зохиосон, одоо түүнийгээ дэд класс болох animation үүсгэх класс байгуулъя. Inport java.out.x; Public void start( ) { If (t==null) { T=new thread (this); t.start( ) ; } } public void run( ) { htread this thread=thread.currentthread( ); while (t==thisthread) { repaint ( ); try{ thread.sleep (1000); }catch (interrupte1exception e) { } } } public void stop ( ) { if (T!=null) t=null; } } Дээрх жишээнд тухайн йззлжэ-ийг параметр болгон авдаг. Thread обьектыг үүсгэж байна. аплет-ийн start метод thread-ийг үүсгэж, эхлүүлдэг. Stopt метод нь Thread обьектод null утга олгоод thread-ийн биелэлтийг зогсооно.thread-ийн start тетод нь run методыг дуудна.run метод point методыг дуудаж аплет-ийн дэлгэцийг дахин дуудна. Энэ ньwhile (+==thisthread) давталтаар хийгдэнэ. Internet ба intranet-ээс gpplet-д хандах хандлага inport java.awt.image; import java.аплет.*; public class Myanimator extends аплет implements runnable { MediaTracker mediatracker=null; Image imagae[ ]=new image [3]; Int index; Thread ani=null; Public void init( ) { Mediatracker=new mediatracker (this); -86- С.Ууганбаяр
  • 87.
    JAVA програмчлал For (intI=0; I++) { Image [I]=get image( getdocument base ( ),”fr”+I+”jpg”); Mediatracker.addimage (image[I],0); } } public void start( ) { if (ani==null { ani=new thread (this); ani.start ( ); } } public void stop ( ) { if (ani!=null) { ani.stop ( ) ; ani.null : } } public void run ( ) { for (;;) { if ( index<3) index++; else index=0; repaint ( ); try { ani.sleep (1000); } catch (exception e) { { } } public void paint (graphics g) { if ( mediatravker.check ID (0,true)) g.drawimage (image index, 0,0,this); } public void update( graphics g) { paint (g); } { дээрх програмд mediatracker классыг ашигласан. Mediatracker Бол “java.awt” какет дэх утилит класс бөгөөд images зэрэг media обьектуудын төлвийг удирдахад хэрэглэдэг. Mediatracker Обьектын хэрэглэхийн тулд imageobserver- ийн заалтыг дамжуулдаг. Зураг бүр “addimage” метод дээр даралтанд ордог, өөрөөр хэлбэл дуудагдана. Зургуудад ID оноодог. Энэ утга нь олон зургуудад ашиглагдаж болно. Тэгээд хэрэв харахыг хүсвэл зургийн байдлыг дүрслэхэд бэлэн бол түүнийг ID-ээр нь удирдаж болно. “check ID(0,true) Метод нь 0 дугаартай бүх зургууд ачаалагдсан эсэхийг шалгана, хоёр дах аргумент load flag нь бол таалагдаагүй байгаа зургуудыг ачаалж эхэлдэг. Animaation-Ний нэг хэсэг болж багтах зургууд бол “fro.jpg” “frd.jpg” “fr2.jpg”. Энэ аплет-руу хандах html file бий <аплет code= “myanimator.class” width=500, hight=500> -87- С.Ууганбаяр
  • 88.
    JAVA програмчлал </аплет> Үүнийг Intranetserver дээр ачаалахын тулд “myanimator.class” “fro.jpg” “frd.jpg” “fr2.jpg” “html” файлуудыг ёерверийн үндэс каталогруу жишээлбэл: NT server – д “innetpubviewroot” хуулна.Килентүүд энэ файлруу хандахын тулд сервер хаягийн ардаас ”/html” файлын нэрийг залгаж бичнэ. Жишээ нь: http://163.122.882170/animation.html энд 163.122.88.170 нь сервер хаяг. Адилхан internet-д ачаалахын тулд webserver-д өгөгдөлийг ачаалах эрх байх ёстой. Та өөрийн эрхээр ftp”server name” гэж хандана. C:mydir>ftp 163.122.88.170 Connected to 163.122.88.170 User: Password: Ftp>bin ftp>put byanimator.class ftp>put animation.html ftp>put fr0.jpg ftp>put fr1.jpg ftp>put fr2.jpg ftp>byl Машины нэрийг зааж ftp командын тусламжтайгаар алсын машинтай холбогдоно. “fit” командаар горим тогтооно. Дараань “put file name” командаар серверрүү бүх файлаа тавина. Layout хийхийн тулд “bye” гэж бичиж enter дарна. Нэгэнт таны класс файл Internet сервер дээр ачаалагдсан болохоор та http://siteaddress/html.filename гэж бичиж болно. Мэдээлэлийг дэлгэцэн дээгүүр хөдөлгөх Animation үүсгэх өөр програм бичие. Дэлгэцэн дээр мэдээлэлийг хөдөлгөх. Энэ програм нь мэдээлэлийг дэлгэцэн дээр хүрээнүүдээр зурна. Хүрээ бүр нь хөдөлгөх эффект үүсгэхийн тулд нэг текстийг ялгаатай өнгүүдээр дүрсэлнэ. Энэ зорилгоор бид бүх өнгүүдийг агуулсан color обьектуудын массивыг ашиглан үүнийг аплет зурагдах болгонд хэрэглэнэ. Import java.awt,a; Public class flash extends java.аплет.Аплет.implements runnable { Font f; Color colore [ ]=new color [150]; Thread t=null; Public void init ( ) { F= new font (“timeroman”, font.bold,28); } public void start ( ) { if (t==null){ t= new thread (this); t.start; } } public void stop( ) { if (t!=null) t=null; } public void paint (graphics g) { -88- С.Ууганбаяр
  • 89.
    JAVA програмчлал g.setfont (f); g.drawstring(“welcome to java2 platform:,10,40); } public void run ( ) { float c=0.0f; for (int I=0; I<colors length; I++){ if (I<50) colors [I]=color.get HSBcolor (c,1.0f,1.0f); if (I>=50 xx I<100) colors [I]=color.get HSBcolor (0.0f,c,1.0f,); if (I>=50 xx I<100) colors [I]=color.get HSBcolor (1.0f,0.0f,c); if (;%50==0) c=0.0f else c=c+0.2f; } int I=0; thread thisthread=thread.currentthread ( ); while ( t==thisthread) { setforeground (colors [ I]); repaint ( ); I++; If (I==colors.length) I=0; Try{ +.sleep (10); }catch (interrupted exception e ) { } } } } } Энэ програм нь color обьект үүсгэхэд getHSBcolor методыг ашиглаж байна. 6.7 Thread ашиглан animation-д дуу авиа нэмэх animation аплет thread animation thread import java.awt.* import java.аплет.audioclip; publc class imageanim extends java.аплет.Аплет.implements runnable; image pics [ ] =new image [10] image currimage audioclip c1; thread timage; public void init ( ); string picsource [ ] ={“t1.gif”, “t2.gif”, “t3.gif”, “t4.gif”, “t5.gif”, “t6.gif”, “t7.gif”, “t8.gif”, “t9.gif”, “t10.gif”, for int I=0; I<10;I++); Add() функцийн тусгай хэлбэрийг ашиглан нэмэгддэг, add() функцийн эхний аргумент нь муж, хоёр дахь нь нэмэх компнент. Байгуулагчид: Public BorderLayout (); -89- С.Ууганбаяр
  • 90.
    JAVA програмчлал Public BorderLayout(iint horizontal gap, int vertica gap) Жишээ: Import java.awt.*; Import java.аплет.*; Public class borderlayout extends Аплет { BorderLayout b=1 new BorderLayout (); Button est, wst, nrth, sth; Text Area cen; Public void init () { est =new Button (“East”); wst =new Button (“Wst”); nrth =new Button (“North”); stn =new Button (“South”); cen =new Text Area (); set Layout (L1); add (“East”, est); add (“West”, wst); add (“North”, nrth); add (“South”, sth); add (“Center”, cen); } } 7.3.3 Card Layout -90- С.Ууганбаяр