2.1.5 K\u1ebft H\u1ee3p V\u1edbi Java<\/strong><\/span><\/h4>\nKhi b\u1eaft \u0111\u1ea7u s\u1eed d\u1ee5ng Kotlin, l\u1eadp tr\u00ecnh vi\u00ean kh\u00f4ng nh\u1ea5t thi\u1ebft ph\u1ea3i chuy\u1ec3n \u0111\u1ed5i to\u00e0n b\u1ed9 code hi\u1ec7n c\u00f3. Kotlin cho ph\u00e9p t\u00edch h\u1ee3p linh ho\u1ea1t v\u1edbi c\u00e1c d\u1ef1 \u00e1n Java \u0111ang ch\u1ea1y, t\u1ea1o \u0111i\u1ec1u ki\u1ec7n \u0111\u1ec3 ph\u00e1t tri\u1ec3n c\u00e1c t\u00ednh n\u0103ng m\u1edbi b\u1eb1ng Kotlin trong khi v\u1eabn gi\u1eef nguy\u00ean c\u1ea5u tr\u00fac code Java c\u0169.<\/p>\n
S\u1ef1 t\u01b0\u01a1ng th\u00edch xu\u1ea5t ph\u00e1t t\u1eeb vi\u1ec7c Kotlin \u0111\u01b0\u1ee3c thi\u1ebft k\u1ebf \u0111\u1ec3 ho\u1ea1t \u0111\u1ed9ng song h\u00e0nh v\u1edbi Java. V\u1ec1 b\u1ea3n ch\u1ea5t, code Kotlin \u0111\u01b0\u1ee3c bi\u00ean d\u1ecbch th\u00e0nh bytecode Java, \u0111\u1ea3m b\u1ea3o s\u1ef1 t\u01b0\u01a1ng th\u00edch v\u1edbi h\u1ec7 sinh th\u00e1i Java. \u0110\u1eb7c \u0111i\u1ec3m n\u00e0y mang l\u1ea1i l\u1ee3i th\u1ebf cho c\u00e1c t\u1ed5 ch\u1ee9c \u0111\u00e3 \u0111\u1ea7u t\u01b0 nhi\u1ec1u v\u00e0o h\u1ea1 t\u1ea7ng, \u1ee9ng d\u1ee5ng Java, cho ph\u00e9p h\u1ecd \u00e1p d\u1ee5ng Kotlin m\u1ed9t c\u00e1ch t\u1eeb t\u1eeb v\u00e0 hi\u1ec7u qu\u1ea3 m\u00e0 kh\u00f4ng c\u1ea7n thay \u0111\u1ed5i \u0111\u1ed9t ng\u1ed9t.<\/p>\n
\u01afu – Nh\u01b0\u1ee3c \u0110i\u1ec3m C\u1ee7a Ng\u00f4n Ng\u1eef Kotlin<\/em><\/center><\/center><\/figcaption><\/figure>\n2.2 Nh\u01b0\u1ee3c \u0110i\u1ec3m<\/strong><\/span><\/h3>\nB\u00ean c\u1ea1nh nh\u1eefng \u01b0u \u0111i\u1ec3m v\u01b0\u1ee3t tr\u1ed9i nh\u01b0 tr\u00ean th\u00ec Kotlin v\u1eabn c\u00f2n t\u1ed3n t\u1ea1i m\u1ed9t s\u1ed1 h\u1ea1n ch\u1ebf nh\u01b0:<\/p>\n
2.2.1 Ch\u01b0a C\u00f3 Ki\u1ec3u Aliases<\/strong><\/span><\/h4>\nNh\u01b0\u1ee3c \u0111i\u1ec3m \u0111\u1ea7u ti\u00ean c\u1ee7a ng\u00f4n ng\u1eef Kotlin l\u00e0 hi\u1ec7n t\u1ea1i v\u1eabn ch\u01b0a h\u1ed7 tr\u1ee3 ki\u1ec3u aliases (type aliases) m\u1ed9t c\u00e1ch \u0111\u1ea7y \u0111\u1ee7 nh\u01b0 m\u1ed9t s\u1ed1 ng\u00f4n ng\u1eef kh\u00e1c. Ki\u1ec3u aliases cho ph\u00e9p \u0111\u1eb7t t\u00ean t\u1eaft cho c\u00e1c ki\u1ec3u d\u1eef li\u1ec7u ph\u1ee9c t\u1ea1p, gi\u00fap m\u00e3 ngu\u1ed3n d\u1ec5 \u0111\u1ecdc, duy tr\u00ec h\u01a1n. D\u00f9 Kotlin c\u00f3 h\u1ed7 tr\u1ee3 c\u01a1 b\u1ea3n cho type aliases, nh\u01b0ng ch\u00fang kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng gi\u1ed1ng nh\u01b0 c\u00e1c type aliases trong ng\u00f4n ng\u1eef nh\u01b0 Swift hay Haskell v\u00e0 kh\u00f4ng cho ph\u00e9p t\u1ea1o c\u00e1c ki\u1ec3u ho\u00e0n to\u00e0n m\u1edbi t\u1eeb alias.<\/p>\n
\u0110i\u1ec1u n\u00e0y c\u00f3 th\u1ec3 l\u00e0m gi\u1ea3m t\u00ednh ti\u1ec7n d\u1ee5ng khi x\u1eed l\u00fd c\u00e1c ki\u1ec3u d\u1eef li\u1ec7u ph\u1ee9c t\u1ea1p trong c\u00e1c d\u1ef1 \u00e1n l\u1edbn, v\u00ec l\u1eadp tr\u00ecnh vi\u00ean v\u1eabn ph\u1ea3i \u0111\u1ed1i m\u1eb7t v\u1edbi c\u00e1c ki\u1ec3u d\u1eef li\u1ec7u d\u00e0i d\u00f2ng m\u00e0 kh\u00f4ng c\u00f3 c\u00e1ch n\u00e0o \u0111\u1ec3 l\u00e0m cho ch\u00fang \u0111\u01a1n gi\u1ea3n h\u01a1n ho\u1eb7c ng\u1eafn g\u1ecdn h\u01a1n trong m\u1ed9t s\u1ed1 tr\u01b0\u1eddng h\u1ee3p.<\/p>\n
2.2.2 C\u00e1c M\u1eb7c \u0110\u1ecbnh Class Trong Kotlin L\u00e0 Final<\/strong><\/span><\/h4>\nL\u1eadp tr\u00ecnh vi\u00ean ph\u1ea3i th\u00eam t\u1eeb kh\u00f3a “open” \u0111\u1ec3 bi\u1ebfn m\u1ed9t class final th\u00e0nh class th\u00f4ng th\u01b0\u1eddng nh\u01b0 trong Java. S\u1ef1 kh\u00e1c bi\u1ec7t c\u00f3 th\u1ec3 g\u00e2y ra m\u1ed9t s\u1ed1 v\u1ea5n \u0111\u1ec1 trong c\u00e1c d\u1ef1 \u00e1n k\u1ebft h\u1ee3p Kotlin v\u00e0 Java. M\u1ed9t s\u1ed1 Java Framework c\u00f3 xu h\u01b0\u1edbng b\u1ecf qua t\u1eeb kh\u00f3a “final” trong m\u00e3 Kotlin, d\u1eabn \u0111\u1ebfn vi\u1ec7c ch\u01b0\u01a1ng tr\u00ecnh kh\u00f4ng ho\u1ea1t \u0111\u1ed9ng \u0111\u00fang nh\u01b0 mong \u0111\u1ee3i c\u1ee7a l\u1eadp tr\u00ecnh vi\u00ean. \u0110i\u1ec1u n\u00e0y \u0111\u1eb7t ra th\u00e1ch th\u1ee9c trong vi\u1ec7c \u0111\u1ea3m b\u1ea3o t\u00ednh nh\u1ea5t qu\u00e1n v\u00e0 d\u1ef1 \u0111o\u00e1n \u0111\u01b0\u1ee3c c\u1ee7a m\u00e3 khi l\u00e0m vi\u1ec7c v\u1edbi c\u1ea3 hai ng\u00f4n ng\u1eef.<\/p>\n
2.2.3 C\u1ed9ng \u0110\u1ed3ng H\u1ed7 Tr\u1ee3 H\u1ea1n Ch\u1ebf<\/strong><\/span><\/h4>\nM\u1ed9t trong nh\u1eefng nh\u01b0\u1ee3c \u0111i\u1ec3m c\u1ee7a ng\u00f4n ng\u1eef Kotlin l\u00e0 c\u1ed9ng \u0111\u1ed3ng ng\u01b0\u1eddi d\u00f9ng v\u1eabn c\u00f2n h\u1ea1n ch\u1ebf so v\u1edbi c\u00e1c ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh ph\u1ed5 bi\u1ebfn nh\u01b0 Java hay Python. D\u00f9 Kotlin \u0111ang ng\u00e0y c\u00e0ng ph\u00e1t tri\u1ec3n v\u00e0 \u0111\u01b0\u1ee3c s\u1eed d\u1ee5ng r\u1ed9ng r\u00e3i, \u0111\u1eb7c bi\u1ec7t trong ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng Android, nh\u01b0ng v\u00ec ng\u00f4n ng\u1eef n\u00e0y c\u00f2n t\u01b0\u01a1ng \u0111\u1ed1i m\u1edbi (ra m\u1eaft v\u00e0o n\u0103m 2011), n\u00ean ngu\u1ed3n t\u00e0i li\u1ec7u, di\u1ec5n \u0111\u00e0n h\u1ed7 tr\u1ee3, c\u00e1c th\u01b0 vi\u1ec7n phong ph\u00fa ch\u01b0a th\u1ec3 so s\u00e1nh v\u1edbi nh\u1eefng ng\u00f4n ng\u1eef l\u00e2u \u0111\u1eddi h\u01a1n. C\u00e1c l\u1eadp tr\u00ecnh vi\u00ean th\u01b0\u1eddng g\u1eb7p kh\u00f3 kh\u0103n h\u01a1n trong vi\u1ec7c t\u00ecm ki\u1ebfm gi\u1ea3i ph\u00e1p cho c\u00e1c v\u1ea5n \u0111\u1ec1 ph\u1ee9c t\u1ea1p ho\u1eb7c c\u1ea7n tr\u1ee3 gi\u00fap t\u1eeb c\u1ed9ng \u0111\u1ed3ng.<\/p>\n
2.2.4 Kotlin Kh\u00f4ng T\u1ef1 \u00c9p Ki\u1ec3u D\u1eef Li\u1ec7u<\/strong><\/span><\/h4>\nKotlin kh\u00f4ng t\u1ef1 \u0111\u1ed9ng \u00e9p ki\u1ec3u v\u1edbi d\u1eef li\u1ec7u \u0111\u00f2i h\u1ecfi l\u1eadp tr\u00ecnh vi\u00ean ph\u1ea3i ch\u00fa \u00fd h\u01a1n trong qu\u00e1 tr\u00ecnh x\u1eed l\u00fd d\u1eef li\u1ec7u. Tuy nhi\u00ean, kh\u00f4ng th\u1ec3 ph\u1ee7 nh\u1eadn r\u1eb1ng Kotlin \u0111ang ng\u00e0y c\u00e0ng \u0111\u01b0\u1ee3c \u01b0a chu\u1ed9ng trong c\u1ed9ng \u0111\u1ed3ng ph\u00e1t tri\u1ec3n. V\u1edbi nhi\u1ec1u t\u00ednh n\u0103ng n\u1ed5i b\u1eadt h\u01a1n so v\u1edbi Java, Kotlin \u0111ang d\u1ea7n chi\u1ebfm l\u0129nh th\u1ecb tr\u01b0\u1eddng, \u0111\u1eb7c bi\u1ec7t trong l\u0129nh v\u1ef1c ph\u00e1t tri\u1ec3n \u1ee9ng d\u1ee5ng Android. Ng\u00e0y c\u00e0ng c\u00f3 nhi\u1ec1u doanh nghi\u1ec7p v\u00e0 l\u1eadp tr\u00ecnh vi\u00ean l\u1ef1a ch\u1ecdn Kotlin cho c\u00e1c d\u1ef1 \u00e1n m\u1edbi, th\u1ec3 hi\u1ec7n xu h\u01b0\u1edbng chuy\u1ec3n d\u1ecbch trong ng\u00e0nh c\u00f4ng nghi\u1ec7p ph\u1ea7n m\u1ec1m.<\/p>\n
3. C\u00e1c C\u00fa Ph\u00e1p C\u01a1 B\u1ea3n C\u1ee7a Ng\u00f4n Ng\u1eef Kotlin<\/strong><\/span><\/h2>\nKotlin, v\u1edbi t\u01b0 c\u00e1ch l\u00e0 m\u1ed9t ng\u00f4n ng\u1eef hi\u1ec7n \u0111\u1ea1i, linh ho\u1ea1t, cung c\u1ea5p nhi\u1ec1u c\u00fa ph\u00e1p \u0111\u01a1n gi\u1ea3n nh\u01b0ng m\u1ea1nh m\u1ebd, gi\u00fap l\u1eadp tr\u00ecnh vi\u00ean vi\u1ebft code ng\u1eafn g\u1ecdn v\u00e0 d\u1ec5 \u0111\u1ecdc h\u01a1n. H\u00e3y c\u00f9ng t\u00ecm hi\u1ec3u chi ti\u1ebft h\u01a1n nh\u1eefng c\u00fa ph\u00e1p c\u01a1 b\u1ea3n v\u00e0 quan tr\u1ecdng nh\u1ea5t.<\/p>\n
3.1 Khai B\u00e1o Package V\u00e0 Import<\/strong><\/span><\/h3>\n\n\n\npackage my.demo<\/p>\n <\/p>\n import kotlin.text.*<\/p>\n <\/p>\n \/\/ …<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n 3.2 \u0110i\u1ec3m B\u1eaft \u0110\u1ea7u (Entry Point)<\/strong><\/span><\/h3>\n\n\n\nfun main() {<\/p>\n <\/p>\n println(“Hello world!”)<\/p>\n <\/p>\n }<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n 3.3 M\u1ed9t D\u1ea1ng Main Kh\u00e1c Ch\u1ea5p Nh\u1eadn S\u1ed1 L\u01b0\u1ee3ng \u0110\u1ed1i S\u1ed1 Chu\u1ed7i (Sting) Thay \u0110\u1ed5i<\/strong><\/span><\/h3>\n\n\n\nfun main(args: Array<String>) {<\/p>\n <\/p>\n println(args.contentToString())<\/p>\n <\/p>\n }<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n 3.4 Ghi \u0110\u1ea7u Ra (Standard Output)<\/strong><\/span><\/h3>\n\n\n\nprint(“Hello “)<\/p>\n <\/p>\n print(“world!”)<\/p>\n <\/p>\n C\u00e2u l\u1ec7nh println ho\u1ea1t \u0111\u1ed9ng t\u01b0\u01a1ng t\u1ef1 print nh\u01b0ng s\u1ebd xu\u1ed1ng d\u00f2ng.<\/p>\n <\/p>\n println(“Hello world!”)<\/p>\n <\/p>\n println(42)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n 3.5 H\u00e0m (Function)<\/strong><\/span><\/h3>\n\n- M\u1ed9t h\u00e0m v\u1edbi 2 lo\u1ea1i tham s\u1ed1 int (parameters) v\u00e0 int tr\u1ea3 v\u1ec1 (return):<\/li>\n<\/ul>\n
\n\n\nfun sum(a: Int, b: Int): Int {<\/p>\n <\/p>\n return a + b<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n \n- Th\u00e2n h\u00e0m c\u00f3 th\u1ec3 l\u00e0 m\u1ed9t bi\u1ec3u th\u1ee9c. Ki\u1ec3u tr\u1ea3 v\u1ec1 c\u1ee7a n\u00f3 \u0111\u01b0\u1ee3c suy ra (inferred):<\/li>\n<\/ul>\n
\n\n\nfun sum(a: Int, b: Int) = a + b<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n- M\u1ed9t h\u00e0m tr\u1ea3 v\u1ec1 kh\u00f4ng gi\u00e1 tr\u1ecb:<\/li>\n<\/ul>\n
\n\n\nfun printSum(a: Int, b: Int): Unit {<\/p>\n <\/p>\n println(“sum of $a and $b is ${a + b}”)<\/p>\n <\/p>\n }<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n 3.6 Bi\u1ebfn (Variables)<\/strong><\/span><\/h3>\n\n- C\u00e1c bi\u1ebfn c\u1ee5c b\u1ed9 ch\u1ec9 \u0111\u1ecdc \u0111\u01b0\u1ee3c x\u00e1c \u0111\u1ecbnh b\u1eb1ng t\u1eeb kh\u00f3a val. Ch\u00fang ch\u1ec9 c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c g\u00e1n m\u1ed9t gi\u00e1 tr\u1ecb m\u1ed9t l\u1ea7n:<\/li>\n<\/ul>\n
\n\n\nval a: Int = 1 \/\/ immediate assignment<\/p>\n <\/p>\n val b = 2 \/\/ `Int` type is inferred<\/p>\n <\/p>\n val c: Int \/\/ Type required when no initializer is provided<\/p>\n <\/p>\n c = 3 \/\/ deferred assignment<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n \n- C\u00e1c bi\u1ebfn c\u00f3 th\u1ec3 \u0111\u01b0\u1ee3c g\u00e1n l\u1ea1i s\u1eed d\u1ee5ng t\u1eeb kh\u00f3a var:<\/li>\n<\/ul>\n
\n\n\nvar x = 5 \/\/ `Int` type is inferred<\/p>\n <\/p>\n x += 1<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n \n- C\u00e1c bi\u1ebfn \u1edf c\u1ea5p cao nh\u1ea5t:<\/li>\n<\/ul>\n
\n\n\nval PI = 3.14<\/p>\n <\/p>\n var x = 0<\/p>\n <\/p>\n fun incrementX() {<\/p>\n <\/p>\n x += 1<\/p>\n <\/p>\n }<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n 3.7 T\u1ea1o C\u00e1c Class V\u00e0 Phi\u00ean B\u1ea3n (Instance)<\/strong><\/span><\/h3>\n\n- L\u1eadp tr\u00ecnh vi\u00ean c\u00f3 th\u1ec3 s\u1eed d\u1ee5ng t\u1eeb kh\u00f3a class \u0111\u1ec3 x\u00e1c \u0111\u1ecbnh m\u1ed9t class:<\/li>\n<\/ul>\n
V\u00ed d\u1ee5:<\/p>\n \n\n\nclass shape<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n\n- Nh\u1eefng thu\u1ed9c t\u00ednh c\u1ee7a 1 class th\u01b0\u1eddng \u0111\u01b0\u1ee3c li\u1ec7t k\u00ea \u1edf ph\u1ea7n khai b\u00e1o ho\u1eb7c ph\u1ea7n th\u00e2n.<\/li>\n<\/ul>\n
\n\n\nclass Rectangle(var height: Double, var length: Double) {<\/p>\n <\/p>\n var perimeter = (height + length) * 2<\/p>\n <\/p>\n }<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n \n- H\u00e0m t\u1ea1o m\u1eb7c \u0111\u1ecbnh v\u1edbi c\u00e1c tham s\u1ed1 \u0111\u01b0\u1ee3c li\u1ec7t k\u00ea trong ph\u1ea7n khai b\u00e1o class s\u1ebd t\u1ef1 \u0111\u1ed9ng c\u00f3 s\u1eb5n:<\/li>\n<\/ul>\n
\n\n\nval rectangle = Rectangle(5.0, 2.0)<\/p>\n <\/p>\n println(“The perimeter is ${rectangle.perimeter}”)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n \n- S\u1ef1 k\u1ebf th\u1eeba gi\u1eefa c\u00e1c class \u0111\u01b0\u1ee3c khai b\u00e1o b\u1eb1ng d\u1ea5u hai ch\u1ea5m (:). C\u00e1c class m\u1eb7c \u0111\u1ecbnh l\u00e0 cu\u1ed1i c\u00f9ng; \u0111\u1ec3 l\u00e0m cho m\u1ed9t class c\u00f3 th\u1ec3 k\u1ebf th\u1eeba, h\u00e3y \u0111\u00e1nh d\u1ea5u n\u00f3 l\u00e0 m\u1edf.<\/li>\n<\/ul>\n
\n\n\nclass Rectangle(var height: Double, var length: Double): Shape() {<\/p>\n <\/p>\n var perimeter = (height + length) * 2<\/p>\n <\/p>\n }<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n 4. Ng\u00f4n Ng\u1eef Kotlin Kh\u00e1c G\u00ec Ng\u00f4n Ng\u1eef Java, Python V\u00e0 Swift?<\/strong><\/span><\/h2>\nKhi l\u1ef1a ch\u1ecdn ng\u00f4n ng\u1eef l\u1eadp tr\u00ecnh ph\u00f9 h\u1ee3p cho m\u1ed9t d\u1ef1 \u00e1n, vi\u1ec7c so s\u00e1nh gi\u1eefa c\u00e1c ng\u00f4n ng\u1eef ph\u1ed5 bi\u1ebfn l\u00e0 \u0111i\u1ec1u c\u1ea7n thi\u1ebft. Kotlin, Java, Python v\u00e0 Swift \u0111\u1ec1u l\u00e0 nh\u1eefng ng\u00f4n ng\u1eef h\u00e0ng \u0111\u1ea7u hi\u1ec7n nay, tuy nhi\u00ean gi\u1eefa ch\u00fang l\u1ea1i c\u00f3 s\u1ef1 kh\u00e1c bi\u1ec7t, c\u1ee5 th\u1ec3:<\/p>\n \n\n\nTi\u00eau ch\u00ed so s\u00e1nh<\/strong><\/td>\n | | | | | | | | | | | | | | |