[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"\u002Fresource\u002Fdocument\u002Flist?undefined":3,"\u002Fresource\u002Fdocument\u002Fquery\u002Fovbzpe7065bye1st?undefined":462,"\u002Fresource\u002Fadvertise\u002Flist?type=all?undefined":467},{"data":4,"status":460,"success":461},[5,148,202,291,332,370,420],{"books":6,"desc":145,"id":8,"image":146,"title":147},[7,40,63,78,93,105,117],{"cateId":8,"chapters":9,"desc":36,"id":11,"time":37,"title":38,"video":39},1,[10,15,18,21,24,27,30,33],{"bookId":11,"id":12,"indexOrder":13,"name":14},24,"8egfulw98v3h680j",0,"JavaSE 笔记（一）走进Java语言",{"bookId":11,"id":16,"indexOrder":13,"name":17},"pew6po6wrou23pk3","JavaSE 笔记（二）面向过程编程",{"bookId":11,"id":19,"indexOrder":13,"name":20},"eldst1fgrbdkmfs7","JavaSE 笔记（三）面向对象基础",{"bookId":11,"id":22,"indexOrder":13,"name":23},"48zphgkpjto8cath","JavaSE 笔记（四）面向对象高级篇",{"bookId":11,"id":25,"indexOrder":13,"name":26},"6r4llai92yc15j98","JavaSE 笔记（五）泛型程序设计",{"bookId":11,"id":28,"indexOrder":13,"name":29},"k6fmxd6qabgkwm9i","JavaSE 笔记（六）集合类与IO",{"bookId":11,"id":31,"indexOrder":13,"name":32},"qrd0xfttsz32gpqg","JavaSE 笔记（七）多线程与反射",{"bookId":11,"id":34,"indexOrder":13,"name":35},"td5tgn04nqmkrryt","JavaSE 笔记（八）GUI程序开发","基于Java25全新录制的SE课程",2025,"JavaSE 核心内容","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV163GGz2E8c",{"cateId":8,"chapters":41,"desc":59,"id":8,"time":60,"title":61,"video":62},[42,44,46,49,51,53,55,57],{"bookId":8,"id":43,"indexOrder":13,"name":14},"ibeeuwsbbi00undq",{"bookId":8,"id":45,"indexOrder":13,"name":17},"dncxjecdv4wciqcp",{"bookId":8,"id":47,"indexOrder":13,"name":48},"jviyz2hsht9ete5k","JavaSE 笔记（三）面向对象基础篇",{"bookId":8,"id":50,"indexOrder":13,"name":23},"qb9i6q9fap7bg1cc",{"bookId":8,"id":52,"indexOrder":13,"name":26},"hnkrjrkm3hjzeq6s",{"bookId":8,"id":54,"indexOrder":13,"name":29},"erpm32wduoaaqmrx",{"bookId":8,"id":56,"indexOrder":13,"name":32},"lfqtvxr7azumcwja",{"bookId":8,"id":58,"indexOrder":13,"name":35},"qs7gqok56gzc6idr","2022年制作的JavaSE版本",2022,"JavaSE 22年旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1YP4y1o75f\u002F",{"cateId":8,"chapters":64,"desc":75,"id":66,"time":60,"title":76,"video":77},[65,69,72],{"bookId":66,"id":67,"indexOrder":13,"name":68},2,"g96k66kczovvbm1i","JVM 笔记（一）走进JVM",{"bookId":66,"id":70,"indexOrder":13,"name":71},"ydd7n3jg8unc3clg","JVM 笔记（二）内存管理",{"bookId":66,"id":73,"indexOrder":13,"name":74},"r9dq37de0kaeauoi","JVM 笔记（三）类与类加载","了解Java的底层运作机制","Java JVM 虚拟机","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Er4y1r7as\u002F",{"cateId":8,"chapters":79,"desc":90,"id":81,"time":60,"title":91,"video":92},[80,84,87],{"bookId":81,"id":82,"indexOrder":13,"name":83},3,"asncyye9ya18gfar","JUC 笔记（一）再谈多线程",{"bookId":81,"id":85,"indexOrder":13,"name":86},"5tr1sm4ho6ygpt9q","JUC 笔记（二）并发编程核心",{"bookId":81,"id":88,"indexOrder":13,"name":89},"1scf51z5300mzxkh","JUC 笔记（三）并发编程进阶","你也可以成为多线程的主宰者","Java JUC 并发编程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1JT4y1S7K8\u002F",{"cateId":8,"chapters":94,"desc":102,"id":96,"time":60,"title":103,"video":104},[95,99],{"bookId":96,"id":97,"indexOrder":13,"name":98},4,"eedesc445ygiqhil","NIO 笔记（一）基础内容",{"bookId":96,"id":100,"indexOrder":13,"name":101},"ndz9t0uunrmfmv4n","NIO 笔记（二）Netty框架专题","编写畅快的高性能网络服务器","Java NIO 网络编程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1ar4y1J7mC\u002F",{"cateId":8,"chapters":106,"desc":114,"id":108,"time":60,"title":115,"video":116},[107,111],{"bookId":108,"id":109,"indexOrder":13,"name":110},5,"9890i8ofuadpwy2b","[扩展篇] Java 9-17新特性介绍",{"bookId":108,"id":112,"indexOrder":13,"name":113},"tsrkqvb6zpmtwh0n","[扩展篇] JavaSE关键字总结 笔记","精彩仍在继续，不要停止脚步","其他内容","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1tU4y1y7Fg\u002F",{"cateId":8,"chapters":118,"desc":141,"id":120,"time":142,"title":143,"video":144},[119,123,126,129,132,135,138],{"bookId":120,"id":121,"indexOrder":13,"name":122},6,"4db9h32opv7imszh","JavaSE 笔记（一）面向过程编程",{"bookId":120,"id":124,"indexOrder":13,"name":125},"c93u3v37br7hgn1q","JavaSE 笔记（二）面向对象基础篇",{"bookId":120,"id":127,"indexOrder":13,"name":128},"yglsjde9gi1jxkcb","JavaSE 笔记（三）泛型与集合类",{"bookId":120,"id":130,"indexOrder":13,"name":131},"ilhi987n986rmvo3","JavaSE 笔记（四）异常机制",{"bookId":120,"id":133,"indexOrder":13,"name":134},"pqv38vexmenglk4k","JavaSE 笔记（五）IO",{"bookId":120,"id":136,"indexOrder":13,"name":137},"jiq41n87i9ia7ilw","JavaSE 笔记（六）多线程",{"bookId":120,"id":139,"indexOrder":13,"name":140},"wn7x2mge9ws79zps","JavaSE 笔记（七）反射","此版本为早期录制的旧版本",2021,"JavaSE 21年旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Gv411T7pi\u002F","包含JavaSE基础路线全部教程笔记，打下坚实的基础","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-bf1a927f037a79f4d57d9ae543430a0d_1440w.webp","JavaSE 系列笔记 ☕️",{"books":149,"desc":199,"id":66,"image":200,"title":201},[150,166,178],{"cateId":66,"chapters":151,"desc":162,"id":153,"time":163,"title":164,"video":165},[152,156,159],{"bookId":153,"id":154,"indexOrder":13,"name":155},21,"iqbc2haub31bwqtz","Lombok 极速上手",{"bookId":153,"id":157,"indexOrder":13,"name":158},"ijay2hay19kn1k031","Mybatis 快速上手",{"bookId":153,"id":160,"indexOrder":13,"name":161},"ru4ogh2waocpn4jo","Maven 快速上手","JavaWeb阶段必须扩展知识点",2024,"常用知识讲解","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1gb421J7ok\u002F",{"cateId":66,"chapters":167,"desc":175,"id":169,"time":163,"title":176,"video":177},[168,172],{"bookId":169,"id":170,"indexOrder":13,"name":171},22,"ek20yvb6huhxizx7","JavaWeb 笔记（一）计算机网络基础",{"bookId":169,"id":173,"indexOrder":13,"name":174},"pgevws6w2krkffa4","JavaWeb笔记（二）Java与数据库","全面升级的JavaWeb课程","JavaWeb 网站开发","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1kS421X7rq\u002F",{"cateId":66,"chapters":179,"desc":196,"id":181,"time":142,"title":197,"video":198},[180,184,187,190,193],{"bookId":181,"id":182,"indexOrder":13,"name":183},7,"ggwwj09j2vkfftvd","JavaWeb 笔记（一）Java网络编程",{"bookId":181,"id":185,"indexOrder":13,"name":186},"sauvq105istskjaz","JavaWeb 笔记（二）数据库基础",{"bookId":181,"id":188,"indexOrder":13,"name":189},"xgbeasmvrhxx9tn4","JavaWeb 笔记（三）Java与数据库",{"bookId":181,"id":191,"indexOrder":13,"name":192},"k7dfwua3bsezvw9q","JavaWeb 笔记（四）前端基础",{"bookId":181,"id":194,"indexOrder":13,"name":195},"ycpagby2v7j4p728","JavaWeb 笔记（五）后端开发","搭建属于自己的Web网站","JavaWeb 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1CL4y1i7qR\u002F","包含JavaWeb路线全套笔记，从零开始搭建自己的网站！","https:\u002F\u002Fpic3.zhimg.com\u002F80\u002Fv2-df3b38e3012258ed70c23b586309e3f6_1440w.webp","JavaWeb 系列笔记 🚛",{"books":203,"desc":288,"id":81,"image":289,"title":290},[204,220,235,255,273],{"cateId":81,"chapters":205,"desc":216,"id":207,"time":217,"title":218,"video":219},[206,210,213],{"bookId":207,"id":208,"indexOrder":13,"name":209},8,"h7sjo5oy0l03607e","SSM笔记（一）Spring基础",{"bookId":207,"id":211,"indexOrder":13,"name":212},"eve8gq72qmdb46sg","SSM笔记（二）SpringMvc基础",{"bookId":207,"id":214,"indexOrder":13,"name":215},"63v73g0zh1qlr6fk","SSM笔记（三）SpringSecurity基础","Spring的探索之路从这里开始",2023,"JavaSSM 基础部分","[\"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Kv4y1x7is\u002F\", \"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Lh4y1M7kx\u002F\", \"https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1fV411M7aS\u002F\"]",{"cateId":81,"chapters":221,"desc":232,"id":223,"time":217,"title":233,"video":234},[222,226,229],{"bookId":223,"id":224,"indexOrder":13,"name":225},16,"0k66v5r6slsfuog4","SpringBoot笔记（一）核心内容",{"bookId":223,"id":227,"indexOrder":13,"name":228},"bqlrnc2yvkaxo8s1","SpringBoot笔记（二）数据交互",{"bookId":223,"id":230,"indexOrder":13,"name":231},"wci9lb9tgea866jt","SpringBoot笔记（三）前后端分离","SpringBoot全新重制版","SpringBoot 新版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xu4y1m7UP\u002F",{"cateId":81,"chapters":236,"desc":252,"id":238,"time":60,"title":253,"video":254},[237,240,243,246,249],{"bookId":238,"id":239,"indexOrder":13,"name":225},9,"e43gl1ilygps032v",{"bookId":238,"id":241,"indexOrder":13,"name":242},"emnmd8nzfdb3hr50","SpringBoot笔记（二）Git版本控制",{"bookId":238,"id":244,"indexOrder":13,"name":245},"jjlolj5igvttvyhv","SpringBoot笔记（三）Redis数据库",{"bookId":238,"id":247,"indexOrder":13,"name":248},"skgr4ivb5curdoux","SpringBoot笔记（四）其他框架介绍",{"bookId":238,"id":250,"indexOrder":13,"name":251},"le91fqhu4dqui1k4","SpringBoot笔记（五）Linux系统","逐步走向企业级开发","SpringBoot 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1UL411V7f3\u002F",{"cateId":81,"chapters":256,"desc":270,"id":258,"time":60,"title":271,"video":272},[257,261,264,267],{"bookId":258,"id":259,"indexOrder":13,"name":260},10,"oejzo0l77zeb6a7e","SpringCloud笔记（一）微服务基础",{"bookId":258,"id":262,"indexOrder":13,"name":263},"f6eya9taaelsl35p","SpringCloud笔记（二）微服务进阶",{"bookId":258,"id":265,"indexOrder":13,"name":266},"35v1hbsfcdgagdnw","SpringCloud笔记（三）微服务应用",{"bookId":258,"id":268,"indexOrder":13,"name":269},"a782u84512tyuo1m","SpringCloud笔记（四）消息队列","体验微服务架构带来的魅力","SpringCloud 进阶","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1AL4y1j7RY\u002F",{"cateId":81,"chapters":274,"desc":285,"id":276,"time":142,"title":286,"video":287},[275,278,280,282],{"bookId":276,"id":277,"indexOrder":13,"name":209},11,"efjw75u8a251qxk5",{"bookId":276,"id":279,"indexOrder":13,"name":212},"guc134xb7sl78vju",{"bookId":276,"id":281,"indexOrder":13,"name":215},"u8ekxxucowr2b1tm",{"bookId":276,"id":283,"indexOrder":13,"name":284},"vkpmw9wbej21nei6","SSM笔记（四）MySQL进阶","此教程为2021年旧版教程","JavaSSM 旧版","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xL4y1H7Tq\u002F","包含Spring全套框架笔记，从开始到Spring Boot，以及众多运维小知识。","https:\u002F\u002Fpic4.zhimg.com\u002F80\u002Fv2-28c3144421220d7c048703281bc34f63_1440w.webp","Spring 系列笔记 🍏",{"books":292,"desc":329,"id":96,"image":330,"title":331},[293,308],{"cateId":96,"chapters":294,"desc":305,"id":296,"time":60,"title":306,"video":307},[295,299,302],{"bookId":296,"id":297,"indexOrder":13,"name":298},12,"jd3e8u5cmvx5gco6","C语言（一）计算机思维导论",{"bookId":296,"id":300,"indexOrder":13,"name":301},"lqv77apvx82nkkio","C语言（二）基础语法",{"bookId":296,"id":303,"indexOrder":13,"name":304},"xb0b9t37gyv96xns","C语言（三）高级特性","包含高等院校需要教授的全部内容","C语言程序设计","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Cr4y137os\u002F",{"cateId":96,"chapters":309,"desc":326,"id":311,"time":60,"title":327,"video":328},[310,314,317,320,323],{"bookId":311,"id":312,"indexOrder":13,"name":313},13,"8a046ps2e4w6k4py","数据结构与算法（一）线性结构篇",{"bookId":311,"id":315,"indexOrder":13,"name":316},"3ma8db91f9zrnkja","数据结构与算法（二）树形结构篇",{"bookId":311,"id":318,"indexOrder":13,"name":319},"0lsjm59k7cgu4tpr","数据结构与算法（三）散列表篇",{"bookId":311,"id":321,"indexOrder":13,"name":322},"0qzy7bogo0g2pusa","数据结构与算法（四）图结构篇",{"bookId":311,"id":324,"indexOrder":13,"name":325},"6gmcxcikcilyxblj","数据结构与算法（五）排序算法篇","虽然很难，但是它是考研必学科目","数据结构与算法","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV13W4y127Ey\u002F","你的内心一直有一个坚定的声音在告诉你，一定要考上一名研究生，向着未来前进吧！","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-ac128404efb29ce1c9d1ccc61024f1d1_1440w.webp","C语言 系列笔记 🥬",{"books":333,"desc":367,"id":108,"image":368,"title":369},[334,349,358],{"cateId":108,"chapters":335,"desc":346,"id":337,"time":163,"title":347,"video":348},[336,340,343],{"bookId":337,"id":338,"indexOrder":13,"name":339},17,"urw2e6gg1lprv65w","Kotlin（一）基础语法",{"bookId":337,"id":341,"indexOrder":13,"name":342},"t7lnl87f74f3v1ju","Kotlin（二）类与对象",{"bookId":337,"id":344,"indexOrder":13,"name":345},"v1zzvki0knb1xvml","Kotlin（三）高级特性","包含Kotlin语言完整基础部分","Kotlin程序设计基础","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1P94y1c7tV\u002F",{"cateId":108,"chapters":350,"desc":355,"id":352,"time":163,"title":356,"video":357},[351],{"bookId":352,"id":353,"indexOrder":13,"name":354},18,"ovbzpe7065bye1st","Kotlin扩展（一）","包含Kotlin额外扩展知识","Kotlin扩展篇","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Hg4y1m7Ca\u002F",{"cateId":108,"chapters":359,"desc":364,"id":361,"time":163,"title":365,"video":366},[360],{"bookId":361,"id":362,"indexOrder":13,"name":363},19,"3at7ybv04dmjc0wp","Gradle基础教程","Gradle配置教程（Kotlin）","Gradle教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1Fc411x7xF\u002F","Kotlin让JVM平台焕发新的生机，让语言的表达更加优美","https:\u002F\u002Fpic2.zhimg.com\u002F80\u002Fv2-be815568f7c79c64cdaa171b0409786d_1440w.webp","Kotlin 系列笔记 ☘️",{"books":371,"desc":418,"id":120,"title":419},[372,391,403],{"cateId":120,"chapters":373,"desc":387,"id":375,"time":388,"title":389,"video":390},[374,378,381,384],{"bookId":375,"id":376,"indexOrder":13,"name":377},26,"zjf5qapwqtqiohcn","JavaScript笔记（一）基础语法",{"bookId":375,"id":379,"indexOrder":13,"name":380},"95jc6sjyjwcp9pvp","JavaScript笔记（二）核心知识",{"bookId":375,"id":382,"indexOrder":13,"name":383},"j35cdc1qz8dzq7pn","JavaScript笔记（三）进阶知识",{"bookId":375,"id":385,"indexOrder":13,"name":386},"sdhodlihphnpcg37","JavaScript笔记（四）前端基础","包含JavaScript最新语法规范讲解",2026,"JavaScript教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1xq6gBgESU",{"cateId":120,"chapters":392,"desc":400,"id":394,"time":37,"title":401,"video":402},[393,397],{"bookId":394,"id":395,"indexOrder":13,"name":396},23,"bsisgazdftiz3o9c","HTML5笔记（一）基础内容",{"bookId":394,"id":398,"indexOrder":13,"name":399},"njol93fs34gfwuzf","HTML5笔记（二）高级内容","包含HTML基础内容和相关知识点","HTML5核心教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1BrBiYNEWg",{"cateId":120,"chapters":404,"desc":415,"id":406,"time":37,"title":416,"video":417},[405,409,412],{"bookId":406,"id":407,"indexOrder":13,"name":408},25,"jo74ciirtg8wh90y","CSS笔记（一）基础入门",{"bookId":406,"id":410,"indexOrder":13,"name":411},"ap5ixyomoejuw4ue","CSS笔记（二）盒模型和布局",{"bookId":406,"id":413,"indexOrder":13,"name":414},"4djgk5xy1lzpiuf2","CSS笔记（三）变换和过渡","包含CSS3基础内容和相关知识点","CSS3核心教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1sQeEzFEKi","包含Web前端学习路径全部教程笔记，打下坚实的基础","Web前端 系列笔记",{"books":421,"desc":458,"id":423,"image":368,"title":459},[422,432,450],{"cateId":423,"chapters":424,"desc":429,"id":426,"time":163,"title":430,"video":431},100,[425],{"bookId":426,"id":427,"indexOrder":13,"name":428},20,"o0ab271mkdsas87","Markdown基础语法","编写简洁而又优美的文档","Markdown教程","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1eJ4m157kC",{"cateId":423,"chapters":433,"desc":447,"id":435,"time":60,"title":448,"video":449},[434,438,441,444],{"bookId":435,"id":436,"indexOrder":13,"name":437},14,"6386mh7anqt4tzyv","设计模式（一）面向对象设计原则",{"bookId":435,"id":439,"indexOrder":13,"name":440},"8ftkb38wfn6ox0ug","设计模式（二）创建型",{"bookId":435,"id":442,"indexOrder":13,"name":443},"i1msql1k8y70etey","设计模式（三）结构型",{"bookId":435,"id":445,"indexOrder":13,"name":446},"5434a3cyyjvwhs8s","设计模式（四）行为型","使你的编码水平得到质的飞跃","设计模式系列","https:\u002F\u002Fwww.bilibili.com\u002Fvideo\u002FBV1u3411P7Na\u002F",{"cateId":423,"chapters":451,"desc":456,"id":453,"time":60,"title":457},[452],{"bookId":453,"id":454,"indexOrder":13,"name":455},15,"zj9uvg0sp3b0sok8","Docker 容器技术 笔记","这里包含其他中间件课程笔记","其他中间件笔记","我们对知识的探索从未停止，只有不断地学习，才能走向美好的未来！","其他笔记分类 🌽",200,true,{"data":463,"status":460,"success":461},{"bookId":352,"content":464,"id":353,"indexOrder":8,"introduction":465,"lastUpdate":466,"name":354},"![image-20240113154815774](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002FlNAiawUHCzs5JWE.png)\n\n# Kotlin程序设计（扩展一）\n\n**注意：** 开启本视频学习前，需要先完成以下内容的学习：\n\n* 请先完成《Kotlin程序设计》视频教程。\n* 请先完成《JavaSE》视频教程。\n\nKotlin在设计时考虑到了与Java的互操作性，现有的Java代码可以自然地调用Kotlin代码，而Kotlin代码也可以轻松兼容Java的调用。在本扩展篇中，我们会讲解如何通过Kotlin调用Java代码。\n\n## Kotlin调用Java\n\n我们先从最基本的内容说起，现在需要让Kotlin与Java互相兼容，并不是直接就可以使用的，我们还要遵循某些约定才可以使得Java兼容Kotlin的语法。\n\n### 类的定义和使用\n\n在Java中，最关键的就是类，我们来看看如何在Kotlin中进行使用。\n\n我们在Java中定义的类型，可以非常轻松地被Kotlin使用，比如下面这个由Java语言定义的类型：\n\n```java\npublic class Student {\n  \tint age;\n    String name;\n}\n```\n\n在Kotlin中，我们可以直接使用这个类，就像是在Kotlin中定义的那样：\n\n```kotlin\nfun main() {\n    val student: Student = Student()   \u002F\u002F直接使用Java中的类型，无缝衔接\n    student.name = \"小明\"\n    println(student.name)  \u002F\u002F这里得到的Java中的String类型，可以直接当做Kotlin中的使用\n}\n```\n\n以及Kotlin中我们提到的一些基本类型，都可以与Java中的基本类型互相转换：\n\n```kotlin\nfun main() {\n    val student = Student()\n    val age: Int = student.age   \u002F\u002FJava中的int\u002FInteger对应了Kotlin中的Int\n}\n```\n\n几乎Java中所有基本类型在Kotlin中都存在对应的类型，所以说直接转换为Kotlin支持的基本类型也是可以的。\n\n包括我们在类中定义的方法，也可以在Kotlin中被当做函数使用：\n\n```kotlin\npublic class Student {\n    String name;\n\n    public void hello() {\n        System.out.println(\"大家好，我叫\" + name);\n    }\n}\n```\n\n```kotlin\nfun main() {\n    val student = Student()\n    student.name = \"小明\"\n    student.hello()   \u002F\u002F函数调用\n}\n```\n\n注意，如果方法的返回类型是void，那么它对应的就是Kotlin中的Unit类型。\n\n包括在Java中定义的构造方法，也可以被Kotlin当做构造函数使用，因为它们的语法其实差不多，可以很轻松完成兼容：\n\n```java\npublic class Student {\n    String name;\n    \n    public Student(String name) {\n        this.name = name;\n    }\n}\n```\n\n```kotlin\nfun main() {\n    val student = Student(\"小明\")\n}\n```\n\n可以看到，这些内容几乎是没有多少学习成本的，包括在Java类中定义的静态内容：\n\n```java\npublic class Student {\n    public static void test() {\n        System.out.println(\"我是测试静态函数\");\n    }\n}\n```\n\n这些静态属性就像使用Kotlin中的伴生对象一样，可以直接通过类名进行调用，这跟Java中是一样的：\n\n```kotlin\nfun main() {\n    Student.test()\n}\n```\n\n还有，由于Kotlin与Java中的关键字存在差异，我们在Java中定义的某些属性名称可能会成为Kt的关键字：\n\n```kotlin\nimport java.io.InputStream;\npublic class Student {\n    InputStream in;  \u002F\u002FJava中没有问题，因为in不是关键字\n}\n```\n\n```kotlin\nfun main() {\n    val student = Student()\n  \t\u002F\u002F在Kotlin中，由于in是关键字，因此我们需要对其进行转义来消除冲突\n  \t\u002F\u002F使用``字符来完成转义\n    student.`in` = FileInputStream(\"C:\u002F\u002F\")\n}\n```\n\n包括Java中的可变参数，也是可以直接兼容的：\n\n```java\npublic class Student {\n    public void test(String... args) {\n        \n    }\n}\n```\n\n![image-20240113205404890](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002FOa2rUPoEdAslqJW.png)\n\n我们也可以直接继承Java中提供的类型：\n\n```java\npublic class Student {\n\n}\n```\n\n```kotlin\nclass ArtStudent: Student()   \u002F\u002F语法与之前是一样的\n```\n\n在后续的学习中，我们再来继续认识更多高级的内容。\n\n### Getter和Setter\n\n在Kotlin基础教程中我们说到，类中的成员属性可以具有自己的Getter和Setter函数，比如：\n\n```kotlin\nclass Student {\n    var name: String = \"\"\n        get() = field\n        set(value) {\n            field = value\n        }\n}\n```\n\n这样我们就可以实现对于这个变量赋值和获取的进一步控制，比如我们希望在赋值时打印内容：\n\n```kotlin\nvar name: String = \"\"\n    get() = field\n    set(value){\n        println(\"我被赋值了！\")   \u002F\u002F由于get和set本质上编译后是函数，因此可以自定义\n        field = value\n    }\n```\n\n而我们知道，在Java中，一个类的属性并不能像这样去编写：\n\n```kotlin\npublic class Student {\n    String name;   \u002F\u002F只能定义一个变量，非常简单\n}\n```\n\n我们可以对Java中的这个属性进行封装，使得其支持像Kotlin中那样存在Getter和Setter函数：\n\n```kotlin\npublic class Student {\n    private String name;   \u002F\u002F将name属性private掉\n\n    public String getName() {  \u002F\u002F自定义Get和Set方法设置name属性\n        return name;\n    }\n\n    public void setName(String name) {\n        this.name = name;\n    }\n}\n```\n\n```kotlin\nfun main() {\n    val student = Student()\n    student.name = \"小明\"\n    println(student.name)\n}\n```\n\n这样编写之后，我们同样可以在Kotlin中直接使用对应属性的名称进行访问，但是这本质上是通过其Get和Set函数来完成的，在获取属性时，会调用getName()方法得到对应的结果，设置同理。\n\n> 注意：这个Get和Set必须遵循命名规则，比如这里我们要为name属性添加Getter方法，那么必须要命名为get + Name这样的名称，来表示对name属性的命名，必须以get开头，而Setter必须以set开头。\n>\n> 如果返回值类型是一个Boolean类型，那么Getter方法名称需要以is开头，而Setter同上。\n\n注意，由于此时`name`属性由于存在访问权限控制，无法被外部访问，如果我们去掉Setter或是Getter函数，将导致变量只能被赋值或是不可用，比如去掉set方法后：\n\n![image-20240113161702594](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002FYBjyrLvEpIgVlPZ.png)\n\n**注意：**  如果直接去掉Getter方法，无论是否保留Setter方法，都会导致这个变量不可用，因为Kotlin不支持仅`set-only`属性。\n\n### 空安全处理\n\n由于在Java中的任何引用类型值都可能是`null`，这使得Kotlin对来自Java的对象进行空安全检测不太方便。因此，对于Java声明的类型会在Kotlin中以特定方式处理，我们称为*平台类型*。对于这种类型，空检查是放宽的，因此它们的安全保证与Java相同，也就是说部分情况下不会进行空安全检查。\n\n比如下面这个例子：\n\n```kotlin\npublic class Student {\n    String name;   \u002F\u002F默认情况下name属性的值就是null\n}\n```\n\n```kotlin\nfun main() {\n    val student = Student()\n  \t\u002F\u002F此时name在Kotlin中为平台类型，不会进行空安全检查，这里可以编译通过\n    println(student.name.uppercase())\n}\n```\n\n很明显，上面的代码出现了空指针异常，因为这里没有进行任何的空安全检查。\n\n对于这种平台类型，IDEA会给我们明确指出，比如这里的name属性时`String!`类型的，它表示这个类型可能是`Srting`或`String?`的其中一种：\n\n![image-20240113163709872](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002FA8skB6y3rCKuM25.png)\n\n我们在接受这个属性的时候，由于其特殊性，也可以使用两种：\n\n```kotlin\nfun main() {\n    val student = Student()\n    val name: String = student.name  \u002F\u002F直接使用不可空类型接受，但是可能会出错\n    val name2: String? = student.name  \u002F\u002F直接使用可空类型接受\n  \ttest(student.name)  \u002F\u002F函数同样适用此规则\n}\n\nfun test(str: String) {  }\n```\n\n如果我们使用了一个不可空类型接受到来自Java的null值，会直接得到一个空指针异常，这可以防止Kotlin的不可空变量持有空值，包括传递函数参数时也同样适用，总的来说，编译器在尽最大努力防止空值在Kotlin程序中传播。\n\n注意，在某些情况下，持有可空注解的Java类型不会表现为平台类型，比如：\n\n```java\npublic class Student {\n    @NotNull String name;  \u002F\u002F由JetBrains提供的注解\n}\n```\n\n![image-20240113164828898](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002FCYETi6Pg5lNtDue.png)\n\n这些注解包括：\n\n- JetBrains（来自`org.jetbrains.annotations`包下的@`@Nullable`和`@NotNull`）\n- JSpecify（`org.jspecify.nullness`）\n- Android（`com.android.annotations`和`android.support.annotations`）\n- JSR-305（`javax.annotation`）\n- FindBugs（`edu.umd.cs.findbugs.annotations`）\n- Eclipse（`org.eclipse.jdt.annotation`）\n- Lombok（`lombok.NonNull`）\n- RxJava 3（`io.reactivex.rxjava3.annotations`）\n\n同样的，对于一些泛型类，也存在一些空类型检查问题，这里以List为例：\n\n```java\npublic class Student {\n    List\u003CString> exams;\n}\n```\n\n```kotlin\nfun main() {\n    val student = Student()\n    val exams1: MutableList\u003CString?>? = student.exams  \u002F\u002F支持多种方式\n  \tval exams2: MutableList\u003CString?> = student.exams\n  \tval exams3: List\u003CString?>? = student.exams\n  \t...\n}\n```\n\n可以看到，在我们使用Java中提供的List时，会得到：\n\n![image-20240113165654653](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002FtH68Es5CQXcBxuG.png)\n\n这里的`(Mutable)List\u003CString!>!`包含了很多信息，我们依次来解读一下：\n\n* 首先Mutable表示这个List可以是可变的也可以是不可变的，因为在Java中并没有明确划分可变或是不可变的数组。\n* 然后这里的类型参数String和List都带有`!`表示他们都可以是可空类型也可以是不可空类型。\n\n我们同样可以使用非空注解来提醒编译器这里一定不会为null防止被认定为平台类型：\n\n```kotlin\npublic class Student {\n    @NotNull List\u003CString> exams;\n}\n```\n\n以及在Java中的数组类型，对应的就是Kotlin中的Array类型：\n\n```java\npublic class Student {\n    String[] exams;\n}\n```\n\n![image-20240113171513951](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002FmoR5I8WQuCtAJbk.png)\n\n由于数组在Java支持协变（这与Kotlin存在不同）因此，这里我们使用Java中的数组时，可以将其当做一个抗变或是协变的String类型进行使用：\n\n```kotlin\nfun main() {\n    val student = Student()\n    val exams1: Array\u003CString>  = student.exams\n    val exams2: Array\u003Cout String?>  = student.exams\n    val exams3: Array\u003Cout String?>?  = student.exams\n}\n```\n\n这里的到的Array可以是可空也可以是不可空，里面的类型参数String同样可以是可空或是不可空，并且可以是协变也可以是抗变的。\n\n### 类型对照表\n\n前面我们提到，在Kotlin中存在Java中相应的基本类型，我们在使用Java提供的类型时，可以直接转换使用：\n\n| **Java类型** | Java包装类型          | **Kotlin类型**   |\n| ------------ | --------------------- | ---------------- |\n| `byte`       | `java.lang.Byte`      | `kotlin.Byte`    |\n| `short`      | `java.lang.Short`     | `kotlin.Short`   |\n| `int`        | `java.lang.Integer`   | `kotlin.Int`     |\n| `long`       | `java.lang.Long`      | `kotlin.Long`    |\n| `char`       | `java.lang.Character` | `kotlin.Char`    |\n| `float`      | `java.lang.Float`     | `kotlin.Float`   |\n| `double`     | `java.lang.Double`    | `kotlin.Double`  |\n| `boolean`    | `java.lang.Boolean`   | `kotlin.Boolean` |\n\n注意，虽然Java类型可以映射到Kotlin对应的类型，但是平台类型性质依然保留：\n\n```java\npublic class Student {\n    Integer age;\n}\n```\n\n![image-20240113180605251](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002Ff2M68QXNBYWtrla.png)\n\n可以看到，对于Java中的包装类型Integer，这里虽然可以直接转换为Int类型，但是它依然可以是Int?或是Int这两种类型。只不过，对于Java中的基本类型来说，由于不存在null这种结果，因此我们可以安全的将其当做不可空类型使用：\n\n```java\npublic class Student {\n    int age;\n}\n```\n\n![image-20240113181910862](https:\u002F\u002Fs2.loli.net\u002F2024\u002F01\u002F13\u002F7L2FWAtcgr8zmle.png)\n\n除了这些基本类型之外，实际上Kotlin中还有很多其他类型也可以直接映射：\n\n| **Java类型**                      | **Kotlin类型**         |\n| --------------------------------- | ---------------------- |\n| `java.lang.Object`                | `kotlin.Any!`          |\n| `java.lang.Cloneable`             | `kotlin.Cloneable!`    |\n| `java.lang.Comparable`            | `kotlin.Comparable!`   |\n| `java.lang.Enum`                  | `kotlin.Enum!`         |\n| `java.lang.annotation.Annotation` | `kotlin.Annotation!`   |\n| `java.lang.CharSequence`          | `kotlin.CharSequence!` |\n| `java.lang.String`                | `kotlin.String!`       |\n| `java.lang.Number`                | `kotlin.Number!`       |\n| `java.lang.Throwable`             | `kotlin.Throwable!`    |\n\n集合类型在Kotlin中可以是只读的或可变的，因此Java的集合映射如下（此表中的所有Kotlin类型都定义在`kotlin.collections`包中）\n\n| **Java类型**      | **Kotlin只读类型** | **Kotlin可变类型**             | **转换平台类型**                     |\n| ----------------- | ------------------ | ------------------------------ | ------------------------------------ |\n| `Iterator\u003CT>`     | `Iterator\u003CT>`      | `MutableIterator\u003CT>`           | `(Mutable)Iterator\u003CT>!`              |\n| `Iterable\u003CT>`     | `Iterable\u003CT>`      | `MutableIterable\u003CT>`           | `(Mutable)Iterable\u003CT>!`              |\n| `Collection\u003CT>`   | `Collection\u003CT>`    | `MutableCollection\u003CT>`         | `(Mutable)Collection\u003CT>!`            |\n| `Set\u003CT>`          | `Set\u003CT>`           | `MutableSet\u003CT>`                | `(Mutable)Set\u003CT>!`                   |\n| `List\u003CT>`         | `List\u003CT>`          | `MutableList\u003CT>`               | `(Mutable)List\u003CT>!`                  |\n| `ListIterator\u003CT>` | `ListIterator\u003CT>`  | `MutableListIterator\u003CT>`       | `(Mutable)ListIterator\u003CT>!`          |\n| `Map\u003CK, V>`       | `Map\u003CK, V>`        | `MutableMap\u003CK, V>`             | `(Mutable)Map\u003CK, V>!`                |\n| `Map.Entry\u003CK, V>` | `Map.Entry\u003CK, V>`  | `MutableMap.MutableEntry\u003CK,V>` | `(Mutable)Map.(Mutable)Entry\u003CK, V>!` |\n\n以及数组的映射如下，基本类型的数组会被直接映射为基本类型专用的Array类型：\n\n| **Java类型** | **Kotlin类型**                |\n| ------------ | ----------------------------- |\n| `int[]`      | `kotlin.IntArray!`            |\n| `String[]`   | `kotlin.Array\u003C(out) String>!` |\n\n注意，在Java中，这些类型可能存在一些静态属性，如果我们需要调用对应的静态属性，需要使用Java中类型的名称进行调用：\n\n```java\n\u002F\u002F在Integer中定义的静态方法\npublic static int parseInt(String s) throws NumberFormatException {\n    return parseInt(s,10);\n}\n```\n\n```kotlin\nfun main() {\n    Integer.parseInt(\"666\")  \u002F\u002F需要使用原本的名称，而不是转换之后的Int\n}\n```\n\n### 泛型转换\n\nKotlin的泛型与Java型有点不同，当将Java类型导入Kotlin时，将完成以下转换：\n\n- Java的通配符转换：\n  - `Foo\u003C? extends Bar>`成为`Foo\u003Cout Bar!>!`\n  - `Foo\u003C? super Bar>`成为`Foo\u003Cin Bar!>!`\n\n```java\npublic class Student {\n    List\u003C? extends Number> data;  \u002F\u002F此时泛型上界为Number\n    List\u003C? super Integer> data2;  \u002F\u002F此时泛型下界为Integer\n}\n```\n\n当这些类型在Kotlin中使用时，会自动被划分为协变或抗变类型：\n\n```kotlin\nfun main() {\n    val student = Student()\n  \t\u002F\u002FJava中的泛型上界对应Kotlin的协变类型\n    val data: MutableList\u003Cout Number> = student.data\n  \t\u002F\u002FJava中的泛型下界对应Kotlin的抗变类型\n    val data2: MutableList\u003Cin Int> = student.data2\n}\n```\n\n由于在Kotlin中对in和out进行了严格的使用限制，因此无法像Java那样随意使用。\n\n- Java的原始类型被转换为星形投影：\n  - `List`当做`List\u003C*>!`也就是`List\u003Cout Any?>!`\n\n```java\npublic class Student {\n    List data;   \u002F\u002F对List的原始使用\n}\n```\n\n```kotlin\nfun main() {\n    val student = Student()\n  \t\u002F\u002F在Kotlin中直接以Any?作为实际类型使用，因为没有明确具体类型\n    val data: MutableList\u003CAny?>? = student.data\n}\n```\n\n与Java一样，Kotlin的泛型不会在运行时保留，也就是说对象不会带有任何实际类型参数的信息，详情请见基础篇。\n\n### 运算符重载\n\n由于Java不支持运算符重载，我们无法通过关键字支持像Kotlin这样的运算符重载，但是，只要符合我们前面所说的那些运算符重载函数名称的方法，依然可以作为运算符重载函数使用：\n\n```java\npublic class Student {\n    public Student plus(Student other) {\n        return this;\n    }\n}\n```\n\n可以看到，以上代码与Kotlin中`+`运算符重载函数的定义相同，满足规范，因此，在Kotlin中，可以直接支持使用：\n\n```kotlin\nfun main() {\n    var student = Student()\n    student = student + student\n}\n```\n\n### 异常检查\n\n在Kotlin中，所有异常都不会主动进行检查，这意味着编译器不会强迫您捕获任何异常。因此，当您调用声明了异常的Java方法时，Kotlin不会强制要求进行捕获：\n\n```java\npublic class Student {\n    public void test() throws IOException {\n        \n    }\n}\n```\n\n```kotlin\nfun main() {\n    var student = Student()\n    student.test()\n}\n```\n\n### Object类型\n\n当Java对象在Kotlin中使用时，`Object`类型的所有引用都会变成`Any`类型。由于`Any`类型不是特定于某一个平台的，考虑到对其他语言的兼容性，因此，它只声明`toString()``hashCode()`和`equals()`函数作为其成员，而在Java中，Object存在很多其他的成员方法：\n\n```java\npublic final native Class\u003C?> getClass();\npublic final native void notify();\npublic final native void notifyAll();\n...\n```\n\n如果需要让`Object`类中的其他成员方法可用，可以像下面这样：\n\n```kotlin\nfun main() {\n    val student = Student()\n  \t\u002F\u002F将student类型转换为Object再调用其\n    (student as Object).wait()\n}\n```\n\n不过，在Kotlin中不鼓励使用`wait()`和`notify()`等线程相关方法，使用JUC中提供的类型效果更佳（详情请见Java JUC篇视频教程）\n\n如果我们要获取某个类的Class对象：\n\n```kotlin\nfun main() {\n    val student = Student()\n    val clazz: Class\u003CStudent> = student.javaClass  \u002F\u002F使用.javaClass获取到对应的Java类对象\n}\n```\n\n### 函数式接口\n\nKotlin支持Java的SAM转换，只要是Java中满足要求的函数式接口，都可以开箱即用：\n\n```java\n@FunctionalInterface\npublic interface Runnable {\n    public abstract void run();\n}\n```\n\n```kotlin\nfun main() {\n  \t\u002F\u002F使用Java中的Runnable接口\n    val runnable: Runnable = Runnable {\n        println(\"Hello World\")\n    }\n}\n```\n\n包括我们在函数中一样可以像这样使用：\n\n```kotlin\nimport java.util.concurrent.ThreadPoolExecutor\n\nfun main() {\n    val executor = ThreadPoolExecutor()\n    \u002F\u002F Java方法定义: void execute(Runnable command)\n    executor.execute { println(\"This runs in a thread pool\") }\n}\n```\n\n## Java调用Kotlin\n\n前面我们介绍了Kotlin如何调用现成的Java代码，我们接着来看Java如何调用Kotlin代码。由于Java和Kotlin之间存在某些差异，在将Kotlin代码集成到Java中时需要注意很多东西。\n\n### 对象属性\n\n在Kotlin中定义的类型，到了Java中依然可以直接创建其对象：\n\n```kotlin\nclass Student(var name: String)\n```\n\n```java\npublic static void main(String[] args) {\n    Student student = new Student(\"小明\");   \u002F\u002FKt构造函数就是构造方法\n}\n```\n\n只不过，对于类的属性，由于Kotlin中本质是以get和set函数的形式存在的，因此，我们只能使用对应的Getter和Setter方法来进行调用：\n\n```java\npublic static void main(String[] args) {\n    Student student = new Student(\"小明\");\n    student.getName();\n    student.setName(\"大明\");   \u002F\u002Fset方法仅在属性为var时可用\n}\n```\n\n如果实在是需要在Java中像使用普通变量那样，我们可以添加一个特殊的注解使其支持：\n\n```kotlin\nclass Student(@JvmField var name: String)\n```\n\n包括懒加载属性也支持：\n\n```kotlin\nclass Student {\n    lateinit var name: String\n}\n```\n\n```java\npublic static void main(String[] args) {\n    Student student = new Student(\"小明\");\n    student.name = \"\";\n}\n```\n\n当然，这个属性不得是 open`、`override`或`const 其中一种，也不能是委托属性。\n\n同时，由于Java中不存在空类型处理，因此，在Kotlin中定义的无论是否为可空类型都可以在Java中直接使用：\n\n```kotlin\nclass Student {\n    var name: String? = null\n}\n```\n\n```java\npublic static void main(String[] args) {\n    Student student = new Student();\n    student.getName().toUpperCase();   \u002F\u002F直接空指针异常\n}\n```\n\n### 静态属性\n\n如果是Kotlin文件中直接编写的顶层定义，可以当做特定文件的静态属性来使用：\n\n```kotlin\nfun test() {\n    println(\"Hello World\")\n}\n```\n\n在编译之后，它本质上就是一个Java中的静态方法，而对应类的名称就是源文件名称+Kt，这里Main.kt对应的名称就是MainKt了：\n\n```java\npublic static void main(String[] args) {\n    MainKt.test();\n}\n```\n\n我们也可以使用注解来明确生成的Java字节码文件名称：\n\n```kotlin\n@file:JvmName(\"LBWNB\")\n```\n\n```java\npublic static void main(String[] args) {\n    LBWNB.test();\n}\n```\n\n对于伴生对象以及单例对象，在Java中使用起来可能会有些别扭：\n\n```kotlin\nclass Student {\n    companion object {\n        fun test() {}\n    }\n}\n\nobject Test {\n    fun hello() {}\n}\n```\n\n```java\npublic static void main(String[] args) {\n    Student.Companion.test();\n  \tTest.INSTANCE.hello();\n}\n```\n\n这并不是我们希望的样子，在Kotlin中我们可以直接使用Student.的形式来直接调用，而在Java中却有一些出入，我们可以为这些函数添加`@JvmStatic`注解来完成：\n\n```kotlin\nclass Student {\n    companion object {\n        @JvmStatic fun test() {}\n    }\n}\n```\n\n对于伴生对象中的字段，我们也可以为其添加@JvmField注解来使得其可以直接使用，这会在编译时使得此函数作为Student的静态属性存在：\n\n```java\npublic static void main(String[] args) {\n    Student.test();\n}\n```\n\n同样的，对于伴生对象中的属性来说，我们也像上一小节那样添加@JvmField注解：\n\n```kotlin\nclass Student {\n    companion object {\n        @JvmField var name: String = \"\"\n    }\n}\n```\n\n```java\npublic static void main(String[] args) {\n    Student.name = \"\";   \u002F\u002F此时name就是Student的静态属性\n}\n```","Kotlin在设计时考虑到了与Java的互操作性，现有的Java代码可以自然地调用Kotlin代码，而Kotlin代码也可以轻松兼容Java的调用。在本扩展篇中，我们会讲解如何通过Kotlin调用Java代码。","2025-07-04 23:44:46",{"data":468,"status":460,"success":461},[469,474],{"id":8,"image":470,"link":471,"name":472,"type":473},"\u002Fimage\u002Fadv\u002Frainyun-2025-06.webp","https:\u002F\u002Fwww.rainyun.com\u002Fitbaima_","雨云优惠购","cloud",{"id":66,"image":475,"link":476,"name":477,"type":478},"\u002Fimage\u002Fadv\u002Fsimcard-2025-11.webp","https:\u002F\u002Fmall.itbaima.cn","号卡优惠","simcard"]