25
1 Объект хандлагат Объект хандлагат програмчлалын хэл програмчлалын хэл Java Java Хичээл Хичээл : : SW203 SW203 Улирал Улирал : : 2009 2009 оны хавар оны хавар Багш Багш: Д.Энхжаргал Д.Энхжаргал Төрөл хувиргалт: автомат ба механик төрөл хувиргалт Mongolia University of Science & Mongolia University of Science & Technology Technology

Lecture10 1239357245

Embed Size (px)

Citation preview

Page 1: Lecture10 1239357245

1

Объект хандлагат Объект хандлагат програмчлалын хэл програмчлалын хэл JavaJava

ХичээлХичээл: : SW203SW203УлиралУлирал: : 2009 2009 оны хавар оны хавар

БагшБагш:: Д.ЭнхжаргалД.Энхжаргал

Төрөл хувиргалт: автомат ба механик төрөл хувиргалт

Mongolia University of Science & TechnologyMongolia University of Science & Technology

Page 2: Lecture10 1239357245

2

Java Java хэлний өгөгдлийн үндсэн төрлүүдхэлний өгөгдлийн үндсэн төрлүүд

Page 3: Lecture10 1239357245

3

Аливаа програмчлалын хэлний хувьд төрөл хувиргалтын асуудал яригддаг. Иймд ямар нэг програмчлалын хэл дээр амжилттай програм бичихийн тулд тухайн хэлний төрөл хувиргах зарчмын талаар тодорхой ойлголттой байх нь чухал.

Java компилятор нь төрлүүдийг хооронд нь хөрвүүлэх дараах 2 хэлбэрээр хангагдсан. Үүнд:

Автоматаар (Automathic): Хэрэв тухайн 2 төрөл нэг бүлэгт багтаж байвал тэдгээрийг хоорондоо нийцтэй төрлүүд (compatible types) гэж үзээд Java компилятор нь түүнийг автоматаар хөрвүүлдэг.

Гар аргаар (Manual): Хэрэв тухайн 2 төрөл хоорондоо нийцгүй (incompatible) байвал төрлийг автоматаар хөрвүүлэх боломжгүй тул хөрвүүлэлтийг гар аргаар (төрөл хувиргалт /type cast/-ыг) хийх шаардлагатай. Мөн нийцтэй төрлүүдийн зарим онцгой тохиолдолд мөн төрөл хувиргалтыг гүйцэтгэнэ.

Java Java хэлний Төрөл хөрвүүлэх зарчимхэлний Төрөл хөрвүүлэх зарчим

Page 4: Lecture10 1239357245

4

Java хэлэнд дараах 2 хэлбэрийн өгөгдлийг тодорхойлж ашигладаг болохыг бид мэднэ. Үүнд: Primitive data type энгийн буюу Өгөгдлийн Үндсэн Төрөл (ӨҮТ)

ТайлбарТайлбар:: Java хэлний ӨҮТ-д byte, short, int, long, char, float, double болон boolean гэсэн найман үндсэн төрөл багтдаг. Эдгээр энгийн буюу үндсэн өгөгдлийн төрлүүд нь дандан хувьсагчийг тодорхойлдог. Өгөгдлийн бүх төрлүүд нь ашиглаж байгаа битээсээ хамааран тодорхой интервалд утга нь хэлбэлздэг.

Object reference data type заалт буюу Өгөгдлийн Хийсвэр Төрөл (ӨХТ)Тайлбар:Тайлбар: Java хэл нь объект хандлагат програмчлалын хэл учраас түүнд class, interface гэх мэтийн үүссэнүүссэн буюу ӨХТ-үүдийг өргөн ашигладаг.

Иймд төрлийн хөрвүүлэлтийн тухай авч үзэхийн тулд бид дараах 4 хэлбэрийг ярих шаардлагатай. Үүнд:

ӨҮТ-ийг хөрвүүлэх (conversion) ӨҮТ-ийг хувиргах (casting) ӨXТ-ийг хөрвүүлэх (conversion) ӨXТ-ийг хувиргах (casting)

Java Java хэлний өгөгдлийн төрлүүдхэлний өгөгдлийн төрлүүд((Үндсэн ойлголт сэргээх нь)

Page 5: Lecture10 1239357245

5

ӨҮТ-ийн хөрвүүлэлт ӨҮТ-ийн хөрвүүлэлт (Conversion of primitives(Conversion of primitives)) ӨҮТ-ийн хувьд хөрвүүлэлт хийхдээ дараах 3 тохиолдлыг авч

үзнэ. Үүнд: Утга олголт (Assignment) Функц дуудалт (Method call) Арифметик үйлдэл (Arithmetic promotion)

ӨҮТ-ийн хувьд хийгдэх аливаа төрөл хөрвүүлэлт нь компиляцын үед хийгддэг. Учир нь компиляцын үед тухайн төрөл хөрвүүлэлтийг дүрмийн дагуу эсвэл дүрэм зөрчсөн эсэхийг тогтоох бөгөөд хэрэв дүрмийн дагуу зөв хийгдээгүй бол алдааны мэдээлэл өгнө.

Санамж: Булийн төрлөөс бусад төрөл рүү, бусад төрлөөс булийн төрөл рүү хөрвүүлэлт хэзээ ч хийгдэхгүй

Page 6: Lecture10 1239357245

6

Энгийн төрлийн хөрвүүлэлт: Утга Энгийн төрлийн хөрвүүлэлт: Утга олголтолголт

Одоо Утга олголт (Assignment)-ийг авч үзье. Жишээ 1:

int i; double d; i=10; d=i;

Дээрх жишээний d=i; гэсэн мөрөнд i гэсэн int хувьсагчийн утгыг double төрлийн d хувьсагчид олгож байна. int төрлийн өргөн нь double төрлийн өргөнөөс ихгүй тул Java компилятор int төрлийг double төрөл рүү автоматаар хөрвүүлнэ. Жишээ 2:

double d; short s; d=1.2345; s=d;

Дээрх жишээний s=d; гэсэн мөрөнд d гэсэн double хувьсагчийн утгыг short төрлийн s хувьсагчид олгож байна. double төрлийн өргөн нь short төрлийн өргөнөөс их тул Java компилятор алдаа заана.

Page 7: Lecture10 1239357245

7

Компилятор энд алдаа заана !!!double төрлийн утгыг short төрөл рүү хөрвүүлж dайна

ӨҮТ-ийн хувьд утга олгох үед хөрвүүлэлт хийхдээ дараах дүрмийг баримтална. Буллийн хувьсагчийн утгыг бусад төрлийн хувьсагчид

оноох боломжгүй. Буллийн бус хувьсагчийн утгыг өөр буллийн бус

хувьсагчийн утга руу хөрвүүлэх боломжтой бол түүнийг өргөтгөсөн хөрвүүлэлтөргөтгөсөн хөрвүүлэлт (widening conversion)(widening conversion) гэнэ. Жич: Энд утга олгох гэж буй төрлийн өргөн нь утга олгогдох гэж буй төрлийн өргөнөөс ихгүй байна

int i; double d; i=10; d=i;

Буллийн бус хувьсагчийн утгыг өөр буллийн бус хувьсагчийн утга руу хөрвүүлэх боломжгүй бол явцуу хөрвүүлэлтявцуу хөрвүүлэлт (narrow (narrow conversion)conversion) гэнэ. Жич: Энд утга олгох гэж буй төрлийн өргөн нь утга олгогдох гэж буй төрлийн өргөнөөс их байна

double d; short s; d=1.2345; s=d;

Энгийн төрлийн хөрвүүлэлт: Утга Энгийн төрлийн хөрвүүлэлт: Утга олголтолголт

int төрлийн утгыг double төрөл рүү хөрвүүлж байна

Page 8: Lecture10 1239357245

8

“Өргөтгөсөн хөрвүүлэлтийн үед утга олгох гэж буй төрлийн өргөн нь утга олгогдох гэж буй төрлийн өргөнөөс ихгүй байна” гэсэн мөрдлөгийг дэлгэрэнгүй тайлбарлъя.

Дээрх зурагт java хэлний өгөгдлийн үндсэн төрлүүдийг битийн хэмжээнээс нь хамааруулан зүүнээс баруун тийш жагсааж байрлуулан сумтай шугамаар холбосон байна.

Тухайлбал: int төрөл нь byte, short, char гэсэн 3 төрлөөс том төрөл гэсэн үг. Иймд byte, short, char төрлийн хувьсагчдыг int төрөл рүү автоматаар хөрвүүлэх боломжтой. Иймд утга олгогдох төрлийн өргөн нь эх төрлийнхөөс багагүй байх тохиолдолд хөрвүүлэлтийг автоматаар хийх боломжтой болох нь харагдаж байна.

Энгийн төрлийн хөрвүүлэлт: Утга Энгийн төрлийн хөрвүүлэлт: Утга олголтолголт

char

shortbyte

int long float double

Page 9: Lecture10 1239357245

9

Эндээс дараах дүрмийг гаргаж болно.

Өргөтгөсөн хөрвүүлэлт Өргөтгөсөн хөрвүүлэлт (widening conversion)(widening conversion)-ийн үед-ийн үед byte төрлөөс short, int, long, float, double төрөл рүү short төрлөөс int, long, float, double төрөл рүү int төрлөөс long, float, double төрөл рүү long төрлөөс float, double төрөл рүү float төрлөөс double төрөл рүү тус тус автоматаар тус тус автоматаар

хөрвүүлэх боломжтойхөрвүүлэх боломжтой

Иймд өргөтгөсөн хөрвүүлэлт Иймд өргөтгөсөн хөрвүүлэлт (widening conversion)(widening conversion)-ийн үед -ийн үед мэдээллийн алдагдал гарахгүй гэсэн дүгнэлтэнд хүрч байна.мэдээллийн алдагдал гарахгүй гэсэн дүгнэлтэнд хүрч байна.

Энгийн төрлийн хөрвүүлэлт: Утга Энгийн төрлийн хөрвүүлэлт: Утга олголтолголт

Page 10: Lecture10 1239357245

10

Харин сумны эсрэг чиглэлд бол боломжгүй. Өх: int төрлийн хувьсагчийн byte төрөл рүү хөрвүүлвэх боломжгүй. Учир нь byte төрөл нь 1 байт, int төрөл 4 байтын хэмжээтэй тул өргөн нь бага хэмжээтэй төрөл рүү хөрвүүлэхэд зарим орон хаягдахад хүрнэ. Эндээс дээрх зурагны сумтай шугамны зүүн гар талд орших төрлийг түүний баруун гар талд орших ямар ч төрөл рүү хөрвүүлэх боломжтой. Харин эсрэгээр өгөгдлийн төрлийг түүний зүүн гар талд орших ямарч төрөл рүү хөрвүүлэх боломжгүй байдаг тул компилятор түүнийг алдаанд тооцдог. Алдааг засахыг тулд төрөл хувиргалт буюу “type casting” хийнэ.

char

shortbyte

int long float double

Энгийн төрлийн хөрвүүлэлт: Утга олголтЭнгийн төрлийн хөрвүүлэлт: Утга олголт

Page 11: Lecture10 1239357245

11

Эндээс дараах дүрмийг гаргаж болно.

Явцуу хөрвүүлэлт Явцуу хөрвүүлэлт (narrow conversion)(narrow conversion)-ийн үед-ийн үед byte төрлөөс char төрөл рүү short төрлөөс byte, char төрөл рүү char төрлөөс byte, short төрөл рүү int төрлөөс byte, short, char төрөл рүү long төрлөөс byte, short, char, int төрөл рүү float төрлөөс byte, short, char, int, long төрөл рүү double төрлөөс byte, short, char, int, long, float төрөл рүү тус тус тус тус

автоматаар хөрвүүлэх боломжгүй. Учир нь мэдээллийн автоматаар хөрвүүлэх боломжгүй. Учир нь мэдээллийн алдагдалд орох аюултай тул Явцуу хөрвүүлэлт алдагдалд орох аюултай тул Явцуу хөрвүүлэлт (narrow (narrow conversion)conversion)-ийн үед -ийн үед төрөл хувиргалт төрөл хувиргалт (type cast)(type cast)-ыг хийнэ.-ыг хийнэ.

CastingCasting гэдэг нь нэг ёсондоо гэдэг нь нэг ёсондоо явцуу хөрвүүлэлтийн үед мэдээллийн явцуу хөрвүүлэлтийн үед мэдээллийн алдагдалд орох эрсдлээс сэргийлэхийг компиляторт анхааруулж алдагдалд орох эрсдлээс сэргийлэхийг компиляторт анхааруулж буй хэрэг юм.буй хэрэг юм.

Энгийн төрлийн хөрвүүлэлт: Утга Энгийн төрлийн хөрвүүлэлт: Утга олголтолголт

Page 12: Lecture10 1239357245

12

Явцуу хөрвүүлэлт Явцуу хөрвүүлэлт (narrow conversion)(narrow conversion)–ийн жишээ–ийн жишээshort s=259;

byte b= s; // Энд компилятор алдаа заанаSystem.out.println(“s=”+s+”, b=”+b);

Алдааг засахдаа төрөл хувиргах үйлдэл хийнэ.Алдааг засахдаа төрөл хувиргах үйлдэл хийнэ.short s=259;byte b=(byte) s; // Төрөл хувиргалтSystem.out.println(“b=”+b);

Ийнхүү төрөл хувиргалтыг хийхдээ дугуй хос хаалт Ийнхүү төрөл хувиргалтыг хийхдээ дугуй хос хаалт ашиглана. ашиглана.

Одоо b хувьсагч ямар утга авах вэ? Одоо b хувьсагч ямар утга авах вэ? хэрэв s хувьсагчийн утга byte төрлийн тодорхойлогдох мужаас (256) хэтэрсэн байвал тодорхойлогдох мужийн хамгийн их утгыг модулиар жишиж авна. s хувьсагчийн утга 259 (хоёртоор 100000011) бөгөөд түүнийг 256 модулиар жишихэд 3 тул b=3; болно.

Төрөл хувиргалтТөрөл хувиргалт (Casting) (Casting)

Page 13: Lecture10 1239357245

13

Зураг: short төрлийг byte төрөлд хувиргах

Төрөл хувиргалтТөрөл хувиргалт (Casting) (Casting) Эндээс харахад тоо нь хөрвөх

төрлийнхөө тодорхойлогдох мужаас хэтэрвэл хөрвөх төрлийн тодорхойлогдох мужийн хамгийн их утгыг модулиар жишиж авна.

Харин бодит тоог бүхэл тоо руу хөрвүүлэхдээ хэрчигдсэн (transaction) хувиргалтыг хийнэ. ӨХ: бодит тоог бүхэл тоо руу хөрвүүлэхдээ түүний бутархай хэсгийг хэрчин хаяж бүхэл хэсгийг нь авч ашиглах бөгөөд уг бодит тоо нь хөрвөх төрлийнхөө тодорхойлогдох мужаас хэтэрвэл мөн л хөрвөх төрлийн тодорхойлогдох мужийн хамгийн их утгыг модулиар жишиж авна.

Page 14: Lecture10 1239357245

14

ӨҮТ-ийн хөрвүүлэлт: Функц ӨҮТ-ийн хөрвүүлэлт: Функц дуудалтдуудалт Төрөл хөрвүүлэлтийн өөр нэг хэрэглээ бол функц Төрөл хөрвүүлэлтийн өөр нэг хэрэглээ бол функц

дуудалт юм. Энэ нь функцыг дуудахдаа зарлагдсан дуудалт юм. Энэ нь функцыг дуудахдаа зарлагдсан төрлөөс нь өөр төрлийн аргументтай дуудах үед төрлөөс нь өөр төрлийн аргументтай дуудах үед яригдана. яригдана.

Дараах нөхцөлд функцыг дуудахдаа түүний Дараах нөхцөлд функцыг дуудахдаа түүний аргументын төрлөөс өөр төрлийн аргументтай аргументын төрлөөс өөр төрлийн аргументтай дуудаж болдог. Үүнд:дуудаж болдог. Үүнд: дуудаж буй аргументын дуудаж буй аргументын төрөл нь уул функцын аргументын төрлөөс төрөл нь уул функцын аргументын төрлөөс өргөнөөрөө ихгүй байх ёстой. өргөнөөрөө ихгүй байх ёстой.

Жишээ нь:Жишээ нь: float frads=2.34567f; double d; d= Math.cos(frads); System.out.println("d="+d);

Math.cos() нь double төрлийн 1 аргументтай стандарт функц билээ .

Энд түүнийг float төрлийн аргументтай дуудаж байна. float төрлийн өргөн double төрлийн өргөнөөс ихгүй тул төрлийг автоматаар хөрвүүлэх учраас компилятор алдаа заахгүй

Page 15: Lecture10 1239357245

15

Энгийн төрлийн хөрвүүлэлт: Функц Энгийн төрлийн хөрвүүлэлт: Функц дуудалтдуудалт Харин функцыг дуудаж буй аргументын төрөл нь уул Харин функцыг дуудаж буй аргументын төрөл нь уул

функцын аргументын төрлөөс өргөнөөрөө их байвал функцын аргументын төрлөөс өргөнөөрөө их байвал компилятор алдаа заах бөгөөд энэ тохиолдолд төрөл компилятор алдаа заах бөгөөд энэ тохиолдолд төрөл хувиргалт хувиргалт (casting)(casting) хийнэ. хийнэ. Жишээ: Жишээ: class A{ public int inc(int i){ return i+1; } } public class test2{ public static void main(String args[]){ double d=12.0; int k; A a= new A(); k=a.inc(d); System.out.println("K="+k); } }

int төрлийн 1 аргументтай

double төрлийн 1 аргументтай дуудахад компилятор алдаа заана.

k=a.inc((int)d); болгож өөрчлөх замаар Casting хийх

Page 16: Lecture10 1239357245

16

Төрөл хөрвүүлэлтийн өөр нэг хэрэглээ бол арифметик Төрөл хөрвүүлэлтийн өөр нэг хэрэглээ бол арифметик илэрхийлэл юм. Ямар нэг илэрхийллийн үр дүнг илэрхийлэл юм. Ямар нэг илэрхийллийн үр дүнг хувьсагчид олгох үед төрөл таарахгүй бол хувиргалт хувьсагчид олгох үед төрөл таарахгүй бол хувиргалт хийдэг. Үүнийг илэрхийллийн төрөл хувиргалт гэнэ. хийдэг. Үүнийг илэрхийллийн төрөл хувиргалт гэнэ.

Илэрхийлэлд орсон үйлдлээс хамааран гахах утгын Илэрхийлэлд орсон үйлдлээс хамааран гахах утгын нарийвчлал янз бүр айдаг. Жишээ нь.нарийвчлал янз бүр айдаг. Жишээ нь.

byte a=60; byte b=50; byte c=100; int d=a*b/c;

a*ba*b гэсэн завсрын үйлдлийн үр дүн гэсэн завсрын үйлдлийн үр дүн bytebyte төрлийн мужаас төрлийн мужаас хэтэрнэ. Иймд хэтэрнэ. Иймд Java Java хэлэнд бүххэлэнд бүх byte byte болон болон shortshort төрлийн төрлийн хувьсагчид орсон операндын үр дүнг автоматаар өргөтгөн хувьсагчид орсон операндын үр дүнг автоматаар өргөтгөн int int төрөлд хөрвүүлэн үр дүн болох 3000 гэсэн утгыг завсрынтөрөлд хөрвүүлэн үр дүн болох 3000 гэсэн утгыг завсрын intint төрлийн хувьсагчид хадгална. Ийнхүү автомат төрөл төрлийн хувьсагчид хадгална. Ийнхүү автомат төрөл хувиргалтыг дээрх илэрхийллийн хувьд хэрэгжүүлж байна. хувиргалтыг дээрх илэрхийллийн хувьд хэрэгжүүлж байна.

Энгийн төрлийн хөрвүүлэлт: Энгийн төрлийн хөрвүүлэлт: ИлэрхийлэлИлэрхийлэл

Page 17: Lecture10 1239357245

17

Java хэлэнд илэрхийллийн төрлийг өргөтгөхдөө илэрхийлэл дэх оператор нь унар оператор уу, бинар оператор уу гэдгээс хамаардаг.

Byte болон short операнд орсон илэрхийллийн үр дүнг автоматаар өргөтгөн int төрөлд хөрвүүлэхдээ дараах хэдэн зарчмыг баримтална. Үүнд: Õýðýâ 2 òûí îïåðàòîð á¿õèé èëýðõèéëëèéí àëü íýã îïåðàíä íü

double áîë íºãºº îïåðàíäûã íü double òºðºë ð¿¿ ºðãºòãºíº. ¯ã¿é áîë õýðýâ 2 òûí îïåðàòîð á¿õèé èëýðõèéëëèéí àëü

íýã îïåðàíä íü float áîë íºãºº îïåðàíäûã íü float òºðºë ð¿¿ ºðãºòãºíº. ¯ã¿é áîë õýðýâ 2 òûí îïåðàòîð á¿õèé èëýðõèéëëèéí

àëü íýã îïåðàíä íü long áîë íºãºº îïåðàíäûã íü long òºðºë ð¿¿ ºðãºòãºíº. ¯ã¿é áîë 2 îïåðàòîðûã õî¸óëàíãèé íü int òºðºë

ð¿¿ ºðãºòãºíº.

Энгийн төрлийн хөрвүүлэлт: Энгийн төрлийн хөрвүүлэлт: ИлэрхийлэлИлэрхийлэл

Page 18: Lecture10 1239357245

18

Ïðîãðàìûí double result=((f*b)+(i/c)-(d*s)); ãýñýí ìºðºíä òàéëáàð õèéå.

(f*b) èëýðõèéëýëä b îïåðàíäûí òºðëèéã float òºð뺺ð ºðãºòãºí ¿ð ä¿í íü float òºðºë ãàðíà. (i/c) èëýðõèéëýëä c îïåðàíäûí òºðëèéã int òºð뺺ð ºðãºòãºí ¿ð ä¿í íü int òºðºë ãàðíà. (d*s) èëýðõèéëýëä s îïåðàíäûí òºðëèéã double òºð뺺ð ºðãºòãºí ¿ð ä¿í íü double òºðºë ãàðíà.

Энгийн төрлийн хөрвүүлэлт: Энгийн төрлийн хөрвүүлэлт: ИлэрхийлэлИлэрхийлэл

Page 19: Lecture10 1239357245

19

Äýýðõ äýä èëýðõèéëëèéí ¿ð ä¿í áîëîõ float, int áîëîí double òºðëèéí îïåðàíäóóä äýýð ¿éëäýë õèéõäýý float, int îïåàðàíäóóäûí íèéëáýðèéí ¿ð ä¿í float òºðºë ãàðíà.float, double îïåàðàíäóóäûí íèéëáýðèéí ¿ð ä¿í double òºðºë ãàðíà.Èéíõ¿¿ result õóâüñàãч íü èëýðõèéëëèéí ýöñèéí ¿ð ä¿í áîëîõ double òºðºë õ¿ðòýë ºðãºòãºãäàí ãàðч áàéíà.

Энгийн төрлийн хөрвүүлэлт: Энгийн төрлийн хөрвүүлэлт: ИлэрхийлэлИлэрхийлэл

Page 20: Lecture10 1239357245

20

Заалт төрлийн дараах хэлбэрүүд байдаг. Үүнд:Заалт төрлийн дараах хэлбэрүүд байдаг. Үүнд: Клас Интерфейс Массив

Утга олгохУтга олгох1. Oldtype x= new Oldtype;2. Newtype y=x; // Заалт төрлийн хувьсагчдын утга олголт

OldtypeOldtype нь Класс ,Интерфейс, Массив байх боломжтойгоос нь Класс ,Интерфейс, Массив байх боломжтойгоос гадна гадна NewtypeNewtype нь мөн Класс ,Интерфейс, Массив байх нь мөн Класс ,Интерфейс, Массив байх боломжтой бөгөөд энд тэдгээрийн комбинаци болох 3*3боломжтой бөгөөд энд тэдгээрийн комбинаци болох 3*3=9 =9 тохиолдлыг авч үзэх шаардлагатай.тохиолдлыг авч үзэх шаардлагатай.

Заалт төрлийн хөрвүүлэлтЗаалт төрлийн хөрвүүлэлт

Page 21: Lecture10 1239357245

Заалт төрлийн хөрвүүлэлтЗаалт төрлийн хөрвүүлэлтOldtypeOldtype нь нь класскласс болбол

OldtypeOldtype нь нь интерфейсинтерфейс бол бол

OldtypeOldtype нь нь массив массив болбол

NewtypeNewtype нь нь класскласс бол бол

OldtypeOldtype нь нь NewtypeNewtype-ийнхаа хүү класс байна

NewtypeNewtype нь нь ObjectObject байх ёстойбайх ёстой

NewtypeNewtype нь нь ObjectObject байх байх ёстойёстой

NewtypeNewtype нь нь интерфейс интерфейс болбол

OldtypeOldtype нь нь NewtypeNewtype интерфейсийг интерфейсийг хэрэгжүүлэгч байнахэрэгжүүлэгч байна

Oldtype нь Newtype интерфейсийн дэд интерфейс байна

NewtypeNewtype нь нь Cloneable байх байх ёстойёстой

NewtypeNewtype нь нь массивмассив бол бол

Компилятор алдаа заана

Компилятор алдаа заана

Newtype нь Oldtype- руугаа автоматаар хөрвүүлэгдэх боломжтой.

Хуучин төрлийг шинэ төрөл рүү хөрвүүлэх нь

Page 22: Lecture10 1239357245

22

Заалт төрлийн хөрвүүлэлтЗаалт төрлийн хөрвүүлэлт Дээрх хүснэгтээс дараах дүгнэлтийг хийж болно. Дээрх хүснэгтээс дараах дүгнэлтийг хийж болно.

Интерфейсийг 1. интерфейс рүү 2. Object класс руу хөрвүүлэх боломжтой

Классыг 1. Класс руу автоматаар хөрвүүлж болно. Гэхдээ хуучин төрөл нь

шинэ төрлийнхээ хүү класс байна. Эндээс “Эх классын заалтаар хүү классын объектыг заалгаж болно. Харин эсрэгээр хүү классын заалтаар эх классын объектыг заалгавал компилятор алдаа заах бөгөөд энд төрөл хувиргалт (cast)-ыг хийх шаардлагатай” гэсэн дүгнэлтийг хийж болно.

2. Интерфейс автоматаар рүү хөрвүүлж болно. Гэхдээ хуучин төрөл нь шинэ төрлийн интерфейсийг хэрэгжүүлэгч класс байна

Массивыг1. Object класс руу хөрвүүлэх боломжтой 2. Cloneable эсвэл Serialazable интерфейс рүү хөрвүүлэх боломжтой3. Массив руу хөрвүүлэх боломжтой. Гэхдээ хуучин төрөл нь шинэ төрөл рүүгээ

автоматаар хөрвөгдөх үед л энэ нь боломжтой.

Page 23: Lecture10 1239357245

Жишээ болгож дараах иерархийг авч үзье.Жишээ болгож дараах иерархийг авч үзье.Заалт төрлийн хөрвүүлэлтЗаалт төрлийн хөрвүүлэлт

Object

Animal

BirdImplements

Flyable

Tagtaa Boljmor Haraatsai

Хуучин төрөл Tagtaa нь Bird гэсэн шинэ төрлийнхөө хүү класс нь тул хөрвүүлэлтийг автоматаар хийнэ

Page 24: Lecture10 1239357245

Жишээ болгож дараах иерархийг авч үзье.Жишээ болгож дараах иерархийг авч үзье.Заалт төрлийн хөрвүүлэлтЗаалт төрлийн хөрвүүлэлт

Object

Animal

BirdImplements

Flyable

Tagtaa Boljmor Haraatsai

Хуучин төрөл Bird нь Tagtaa гэсэн шинэ төрлийнхөө хүү нь биш эх класс нь тул компилятор алдаа заана

Асуудлыг хэрхэн шийдэх вэ???

Мөрийг tagtaa = (Tagtaa)bird; мөрөөр солих. Ингэснээр compiletime алдаа заахгүй боловч runtime алдаа заана

Page 25: Lecture10 1239357245

25

Өмнөх хуудсанд дурдагдсан Өмнөх хуудсанд дурдагдсан runtime errorruntime error яагаад үүсч яагаад үүсч байна вэ? гэсэн асуулт тавигдана. Үүнийг байна вэ? гэсэн асуулт тавигдана. Үүнийг тайлбарлахын тулд дараах жишээг авч үзье.тайлбарлахын тулд дараах жишээг авч үзье.

ClassCastExceptionClassCastException

No error in CompileTime RunTime Error