JavaSE 编写第一个程序

2022-09-14 11:05:06 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

说在前面的话

前言

内容介绍

介绍 JavaSE 基础的基本语法知识,不会包含特别难以理解或更深层次的内容,通俗易懂。本人是实战派,看着大幅篇章晦涩的理论,但是没有多少实践证明的书籍就头疼;同时如果知识东一点、西一点,跳跃性太大,不成体系,也比较麻烦。

没办法智商不够,穷举来凑。缺点也很明显,一是浪费时间精力,二是容易得出过拟合的规律,碰运气罢了,拿来就用。

前提

本书的所有例子使用 JDK8 在 Windows10 系统下完成;若你与我的不一致,快捷键、源码都有可能不同,但网上无偿资源十分的多,搜索了解不同之处即可。

受众人群

区别于教材,不会设问不答,而是十分详细,不会为读者留出思考和遐想的空间;目的只为节省时间,算是入门的自学读物吧。

主要让小白快速了解或回顾 JavaSE 的基础语法知识,随看即用,无阅读门槛。

主要内容

本书前二十章,涵盖了如 Java 基础语法、变量、运算符、流程控制语句、面向对象、常用类、集合、IO 等基础部分;

另外把那些不常用的知识自成一章,移入扩充内容

本书示范中,将可能使用到的软件、工具网址放入资源地址中。

章节编排

每章共有 3 级目录,名字尽量保持唯一性;

对于讲源码的部分,先抛出结论,自成一节,在它的下一个目录,粘贴全部源码,逐行分析。

每章的结尾会插入总结回顾与习题;习题的平均难度分级:脑海练习、实战演练、掀起波澜、头脑风暴、大脑宕机、空空如也。

习题出的不是很好,包含了我个人的私心,有些好不容易弄明白的道理,直接插入正文貌似不是很合适,但又舍不得丢弃,于是干脆作为题目了,希望不要嫌长。

如何使用

因为人的大脑很特别,会自动屏蔽掉日常普通、枯燥乏味的事情,目的是保持内存充足。它只记住比较特别的,其它的都会慢慢遗忘。

什么是比较特别的?

  • 重复,一直重复;重复到大脑认为这不该忘记,有道言:熟能生巧、勤能补拙、好记性不如烂笔头,还谈不上拼天赋包括努力。
  • 新奇的、有趣的、充满致命危险的、富有挑战性的、特殊的;与自己基因特性相关,偏向哪方面,大脑对哪感兴趣,不用你重复多次,自然会记住。

所以我加入了总结回顾,记录了这一章的重要内容,怕你看着看着就全忘了。放心,只有一点点,不会对你的大脑造成负担。看完后,记得休息一会。

缺点

因为我是自顶而下的方式学习,很难接触到底层方面的知识,我感觉隐藏地太深,虽然比较轻松,但总感觉不得劲,不是像语法那样可以直接触摸,如引用保存了实例的内存地址,new 才是返回了对象的地址。

意思就是十分地浅,只能专注看得到的地方,自圆其说,偏偏还没法验证,冰山一角而已;我不知道科班是怎么教的,没有什么信息来源,孤家寡人啊;希望多多批评。

更新内容

第 3 版的更新内容

新增 switch case 分支、补码、二进制转换、字符编码常识、值传递、String 字符串常量池和 intern 方法的解析、第三代日期类、UUID、正则表达式等一系列内容。

将双向链表移入 LinkedList 这节中。

取消了 b 标签的使用,因为无法在 CSDN 中无法做到与博客园一样的显示。

取消了 img 标签的使用,因为在 CSDN 中无法显示图片。

取消了 gif 动图的使用,因为打印 pdf 文件后就是静图;

取消了超链接使用,统一使用网址代替。

发现每章的内容过多,将每章继续拆分为几个小节。

移除了强类型语言、进制转换、字符编码、原码补码等内容。

第 2 版的更新内容

将所有目录重新整合,改名,保证标题的唯一性,否则博客园可能跳转错误。

将 字符编码 部分内容移到 常用类 一章中;将 Eclipse 移至扩充内容中;将下载与准备工作合二为一,修改 ξ xi ξ 符号的显示问题;用 ① 替换 1. 避免格式乱码。

由于章节过多,这篇只得拆分成 20 章,否则浏览器加载不过来。

其他说明

跳转问题

博客园有时会出毛病,在同一篇文章中,如果两个标题名相同,点击只会跳转到第一个同名标题;虽然已经开始在标题前面加 1.1.0 让标题名唯一,但是目前还未改完,请从点击如图展示的标题列表中跳转。(2022/03/11 18:00)

封面制作

封面是用 Win10 3D 画图制作的。

爱好

喜欢养草金、养草龟;看奥特曼,看优秀的国漫,如伍六七、凡人修仙传,可惜最近没时间了;喜欢听梁博的歌;欢迎交流。

本记由来

本人就不是正儿八经的程序员,我也知道,像我这种野路子出身的程序员,从网上东拼西凑没有体系得来的知识,看法一定不全面,但我还是尽可能地收集知识,希望能够帮助到大家,你就当我童心未泯吧。

疫情大家都被困在家中,只能慌着想另谋出路,培训机构天天打广告,制图、CAD、编程、剪辑 …,于是抱着试一试的心态,他们都说学 Java 好找工作,正好我的工作也搞不下去了,丢失了所有自信,于是抱着试一试的心态,但我怎么感觉教人赚钱的人最赚钱?

当然我没去培训机构,而是在网上一篇篇的看文章,因为学习路线图挺多,你在知乎上随便搜下,就有一大群打广告,引流到自己的微信公众号;让我不禁感慨那些熟手竟然都混的这么艰难。

我越看,越觉得自己太滞后了,太脱节了。Java 是上个世纪末出现的,我到现在才知道,仿佛我们这个地方的时间流速比发达城市慢了几千倍。我可能会想,如果要是早点知道就好了,也不至于大学期间抱着动力电池组、汽车检测与故障判断百无聊赖,只能在腾讯中寻求一点归属与认同感,创造属于自己的躲避空间,对,咎由自取罢了。

我现在才明白,并不是不知道自己到底喜欢什么,而是自己视野太窄,接触东西太少,别人也是如此,给不了贴合实际的建议,所以还是靠自己寻,但是又不能完全不听从别人建议,只希望别又浪费三年。

年龄越大越感觉似乎有一道屏障阻碍,天天在质问,为什么这个世界会这样,为什么我会这样?不幸是否是种污染源。

不,不对,自从初中后,身高和心智都基本陷入停滞,难有寸进,我估计早就有了老孩子的概念,只是被逼的装作成熟,本来触手可及的人们被分隔进两个世界,再无交集,也不知道为什么就有了这种局限性。希望趁着还清醒,不要佯装没事,融入集体,直到面具摘不下来。

每个人都是冷漠的看客,觉得自己门儿清,他人徒劳而已,分文不值;似乎出生来到这个世界的目的就是赎罪,疯狂地刺痛他人后再抱团取暖,亦或者重蹈覆辙使别人引以为鉴,成为经验条,我怀疑是否在没有我的世界里,家人亲戚生活也许会变得更好,我的存在似乎没有意义,反而是种拖累;好在,泪流干了也许就不会伤心了;

如果只有个体的死亡才能去除错误的思想模型重新回到正途,这个世界好也罢坏也罢,都将是一团迷雾再也无法知晓,但我不是谁的延续,不是用于优胜劣汰、杀鸡儆猴的工具,我不是身体不是思想,它们都会变,而是感知;可惜不能完全感知别人的思想,做到感同身受,体谅他人。

感觉自己就像困在茧中发育迟缓的儿童,后知后觉就像个傻子,时常想想说当时要是那么做那么说那么经历一些事情历练下重拾经验避开错误避免说话不过脑子再尝试一次再争取一把也许情况会好一些也许就赢了;

就像是一排纽扣,某个纽扣系错位,其它全都错位了。真担心,还没长起来,就 gg 了,我想躲在时间的缝隙之中,看到世间百态,琢磨出所有的、最好的、最完美的应对方法,再给我一点时间吧。我很明白,这终究是不可能的,如果你也能感同深受,我祝你早日挣脱束缚,突破自己的局限性。

由此推出,可能我习以为常的概念,但其他人却一无所知,看到线头也认不出来,自然也不会揪。说实话,要不是学 Java 顺带接触了前端,我永远也不会知道浏览器页面背后隐藏的 HTML 标签,或许误解为 Word 或者其它更高深的东西。

再想到大学时还是如高中般按部就班,呆呆地等老师讲,什么高等数学啊,没讲的就不知道要学,结果就讲到极限没讲了,直到毕业后才醒悟,可惜已经没有那么好的学习环境了,真傻。所以,我说非本科的,还是抽出时间干自己的事吧,只听老师讲没多大用处。

那些本科、985、211 出来的,我不知道他们学校是否与社会脱节,还是不需要培训直接就能胜任工作;又或者那些高材生早就摸索出了属于自己的道路,只待毕业后就能大展身手;真是年轻有为啊。

当然如果不是,也不要妄自菲薄,至少你学习能力强,也聪明,打败了 50% 的同龄人,多接触我们这样的人,不要被外界评价降低了自己的自信心,哪怕现在积累散去,也可以东山再起,别放弃,要加油!

第一名只有一个,如果不是第一名就认为这一切付出都毫无意义,剩下的千千万万个我不是更无地自容吗?不要总是与别人比,大家都很累,比自己就好了;

也不要觉得是对不起谁,你对不起的只有一个,那就是自己;所以请珍惜自己,请在乎自己吧,生命并不是毫无意义,你没有输,从来都没有;生命尚存,信念永恒。

对我而言,也许受眼界或目光局限,看不远,但我并不认为这是遗憾,种树的最好时期除了十年前就是现在。

所以我的目标压根就不是传授小白前沿知识,互联网信息这么发达,知识多得海了,但我并不认为这一定就是好事。如果我什么都不知道,或者被生活重压没得选背点债,估计早就被逼进入劳动密集型行业,进厂或跟师傅学门手艺,变得“成熟、世故”,将来再赚点钱,跟大哥一样娶个媳妇,生个孩子,与乡亲闲聊周围八卦,家里长家里短,简单快乐地平凡轮回一生;唉呀,真可惜,看到了不属于我的世界,丰富多彩的生活,但可望不可及,原本的世界不再感受到快乐,同时冒出无数的疑问没有答案,不被理解,你就说是矫情吧,真痛苦啊,不,我还是太幸福了,居然还有精力思考让我痛苦的事情。但总不能建议大家都破釜沉舟,初中就辍学,因为没得选择,以补齐工厂及其它岗位缺口。

聪明人也不需要,你自己就能找得到资源,没必要看下去了;当一个新概念传到我们那,可能都不知道被多少人玩烂了;可惜还是有很多知识晦涩难懂,相信还有一些普通人如同曾经的我一样,不成体系,没来得及上道,视野受限,四处碰壁,我活该就活该了,但踩过的坑没有必要再让人踩一遍吧,也没必要弄成“完美受害者”的样子,有什么批判都无所谓,争斗是动物的天性,反正现在闲着,再不写忘了就白给了。

说回我本人吧,我自认为我很坏,不受人待见,独来独往,像是与世界格格不入披着人皮的异类,缺点也是一大堆,对此我没有什么意见,木已成舟事已至此,已经定性,无法改变只能捏着鼻子认了,烂到家了,一把烂牌又打了个稀巴烂,这辈子就这样了,也不用奢求什么,还可以更坏吗?戏谑称自己为“行走的造粪机”。

挺不希望有人跟我一样,浪费生命,自责内疚,消耗最美的年华,人也就那样,很快一生就过去了,没什么时间,等着等着就没了。你强就趁着这个时候多积累一些没有坏处。

可现在技术如此成熟,获取某领域的知识简直不要太方便,个人的努力似乎变得如此廉价,我这个后辈还有必要写吗?可能只是我一厢情愿,每每看到曾经写过的话,说都是为了别人少走弯路而安慰自己这一切的付出都是值得的,自己不要回报有多高尚,感觉挺幼稚挺伪善的,人们都是明暗组合的复杂体,以自己的角度看世界发现周遭也不过如此,何况我也只是刚刚起步只能算是个搬运工;仔细想想,这世界没你没我照样能转,没啥了不起的,学不学这个,人生也就那个样,试图逆天改命也太好笑了,我现在只是在做我能够做的事情。

我所能做的就是坚持坚持再坚持,这是对我最好的安慰,否则这不是承认我之前所做的行为都是无意义的吗?由于认识到错误很痛苦,与自己的理念相冲突,所以需要找到一个能够将其合理化的外部理由为自己做辩护从而继续贬低或迫害其他人,维护自己的认知使其不动荡,比如都是因为某某…,否则世界观崩塌怀疑自己的认知,但是这样又会加剧其错误,直到认知根深蒂固无法自拔,然后成功欺骗了自己,离真理更远;或者认为反正就这样了,还不如破罐子破摔,这就是有了第一次,就很难停下来的原因,将错就错呗,这种惯性时常背离,永远都不要对人性抱有过高期待。

在不可质疑的分数与金钱的评判体系中,对于大多数“失败者”而言,将希望寄托在下一次、后代;可是哪有这么多下一次,每次都是当下。当一次又一次的打击熄灭了自信,下意识的逃避已成了惯性,自己彷佛就是衬托别人优秀的工具人,于是越发失望,之后的每一次都会重复过往悲剧。或者不停地抱怨、痛苦迷茫,却无力改变现状,反复地想如果当初,但是现在不能…说自己每天活在痛苦之中,内心煎熬,是为了向所有人展示自己都已经这样了,已经反省了,很痛苦…显得很可怜,也不知是真的为了寻求安慰,还是习惯性地装作受害者渴望同情,好将责任推卸给其它因素,然后拒绝所有援助,坐实可怜人的姿态,彷佛全世界都抛弃了你,呵呵;自己轻松了,好像改变了,但突然暴雷的模型又将你拉回原点,哇,还是老样子啊,直到所有人都心灰意冷,在矛盾与痛苦的纠结中,无尽的黑暗囚笼,轮回这可悲的命运。

对于大多数“成功者”而言,认为所有成就都是自己努力而应得的,与其他人无关,十分傲慢,而对社会毫无责任。但实际上,人生能够自己把控、预测的因素极少,绝大多数都是不确定的,境况各有不同,谁也不敢说努力就能够决定自己的命运,按计划如期进行。

如果不是走投无路,大量地搜罗资料,妄想改变命运的可能,谁会搜到此文呢?幸存者偏差罢了。哦,因为百度一搜,CSDN 文章总在前面,可惜我可能文章取名太宽泛了,很难搜到。

这个学习时间太长了,还不容易上手,可能学不出什么名堂,做好心理准备吧。如果你很久以后才看到这篇文章,这本书介绍的内容、软件可能也会过时。(2021/07/15 19:29)

我以前听说过一个段子,让我改编一下吧:老师在课堂上将 100% 的知识讲出了 70%,同学们接收到了 40%,动笔自己试下,写出了 10 %,隔天只剩 1% 了,剩下全靠编。

于是我这知识算是从网上来,经过遗忘、组装、变异后再回到网上去吧。

帮助说明

你帮助了我,我自然很乐意回馈你。但是请客,我不知道你是真心的感到开心,还是出于礼貌,很拘谨,不好意思拒绝,说不出口,又或者只是人的本性如此,不受控制地开心,而不是你的本心;这样猜来猜去的,很累。本人接人待物的经验几乎为 0,没有眼力见,情商低,局促不安,怕出洋相不想去,也不乐意接受别人的帮助,因为我也不知道可以回馈你什么,避免让你寒心,所以故意错开没有交集,这样除了第一次略微有些不好受,但往后谁都不会受伤,双方都好;或者说习惯一人了。如果说我自立自强,任何事情都能做到无可挑剔,可以完全不依赖别人的帮助,那挺契合我的特质,但我做不到啊,完整地活到现在也算是个奇迹,不,应该是家人和钱的功劳吧。当然你可以教我做人,我的这具身体应该会乐意吧。

听说有人已经很有经验,练到能够自如控制身上每一处表情、细微的动作,针对不同性格的人,话术都是精心设计的,有模板,样式丰富,一套接着一套,似十分真诚,浑然天成,很讨喜,挑不出毛病,能与所有人都搞好关系,大事化了,挺羡慕的,不像我,一二三木头人,即使有了后代估计德行也是如此,因为我没有经验传授于他,只能又轮回一世。

你如果有什么难处,力所能及下,我会帮助你的。(不借钱,被人骗过,现在挺小气)

我听力不好,医生说是脑神经损伤,不可逆了(不可恢复):听力的衰弱、接收频率的丢失、无法被解析,说人话就是你叫我,我听不见;听见了声音,不认为是人在喊我;知道你在喊我,但不知道你在讲什么,需要重复几次才能听懂,所以不喜与人交流,不喜欢悄悄话,声音太小了。

我的语言沟通能力方面不是很好,每当亲戚叫我多接触人,出去找个好工作,不要好高骛远;有时吧,我坐着又听不懂你们在讲什么,彷佛被按在椅子上不能离开,还不时的点头,后来干脆摆烂了,只埋头吃菜;我还是习惯独处,不需要耳朵,也可以对自己说话。实在不知道未来如何是好,蒙上自己的眼睛,不去想,就这么等着命运的大刀砍到脖子上。

由于不怎么接触人,时常感觉自己不近人情,只在家的附近活动,逢年过节不送礼,又不嘘寒问暖走个表面形式,生病也不带礼物看看,没有那些乐呵呵的人受欢迎,我自认为挺讨人嫌,不像个正常人,能够融入集体,至少我周围看不到第 2 个我这样的,我想想我要是主动示好,嬉皮笑脸地也许混个好人缘,关键时候有人帮我;我经常自拟为披着人皮的生物,似人,我时常怀疑自己存在的意义,不是个群居动物又能算是个什么东西。

哦,你如果想招聘我,想好这一点,我不适合与客户打交道的。希望不会因此找不到工作而饿死吧,否则在全中国也是独一份笑话。

我很早之前就听说过:不要试图改变他人,因为他人无法改变,要从自己身上找原因。每次出现问题,不用别人说,自己就开始把矛头指向自己。现在发现改变自己也很难,也不可能穿越到过去改变引导自己,比如学好英语,所以讨厌自己也没用啊!之前一直对自己耿耿于怀,发现只会让事情变得越来越糟,因为与最了解自己的自己对抗,这是一件多么愚蠢的事,它总能找到内心最柔弱处,给你致命一击。江山易改,本性难移,活该是孤独命啊,生命是有惯性的。

想着改变吧,于是什么人际关系、焦虑、摆烂、学生思维等视频就成了诱捕我们这类人最好的工具;唉,还用点明吗,侃侃而谈,互相折磨,大可不必。

终于发现这样不行了,不原谅自己,自己就会拖自己下水:反正就这样了,无法挽回,还不如破罐子破摔;自己给自己过多压力,整个人非但不能前进,反而会散去精气神;一直被动接收别人的观点,只会让我深陷地狱;践踏自己,就学不会尊重他人;

但我就是十分在意别人的看法,于是想着法子给自己洗脑:我凭什么要管别人的看法来折磨自己?我就这样坏、无耻啦,我就是有这么多不完美的地方,我不当人啦!咋滴?想着想着,破釜沉舟之下,于是学会了直面自己,拥抱自己,接纳自己,与自己和解;哪怕自己有太多的缺陷与不足,拥有这个身体已经值得了,没有必要追求过多,生和它一起,逝也和它一起,它才是最了解我的人,其它都是浮云,没有必要与它不愉快;对于我做的任何事情,我都不后悔。

于是担子自然就放下了一大半。它再差劲那也是我,不必撇清关系,并且它还是挺好用的,就是忘得快。

当然你如果说想同情我,那倒没有必要啊,我只是偶尔听不懂,大多数情况下还可以正常对话。不过还是要谢谢你的关心,祝你也开心吧,忘尘于世界,自在乐逍遥。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yH1VKUZS-1654426881587)(https://s2.loli.net/2022/03/19/yNRUzX62kfvisFE.png)]

数学讲的还是挺简单的,于是买了几本书,发现老师明明在视频上讲的通俗易懂,由浅入深,但是编写的大学教材是真的劝退人,几千页啊,战线拉得太长了。并且那段时间在学 Java,于是没再继续了,我只知道一点,不用的知识一定会忘记,所以现在干脆不学了,等用时再补。果然遗忘才是人类最大的法宝啊。

急需求职

天要下雨,人要吃饭;不管再怎么想,到了年龄,就算不结婚生子,但还是得找工作。

不讲什么本人勤奋热爱好学、吃苦耐劳这套老掉牙的事了,这玩意就是你情我愿,一拍即合,不行就拉倒,谁也没有必要低声下气,彷佛占了什么便宜,双向选择嘛。

招聘网站一个个看(不太信任,听说骗子挺多,还是需要线下跑来跑去,还可能被第三方公司外包,扯皮都没法扯,精力都耗没了),什么一面二面,还要花时间背没有用的题目,互相试探,装的很牛的样子,然后等通知;或者一个个线下到处漫无目的地找;除以上途径之外,我还想在各大网站上发布信息,希望能够找到合适的工作。

好吧,说实话,别看我好像挺拽的,其实我已经没有任何信心主动尝试了,质问还不够多吗?四肢不勤,五谷不分,无一技傍身,混的好惨啊,但敲代码挺幸福的,也没精力也不想干别的了。

若你想要了解我掌握的东西,那你看看我写的这个就行,也不会超出这个内容太多,忘了很正常,看看就捡起来了,我又不是电脑,没必要一直存储到脑海中,超时就丢掉。

要求:

  • 工作地址:离湖北越近越好。
  • 工作内容:与电脑相关就很好,我不想丢失熟练度。
  • 工作形式:公司、团队搭伙、工厂、私活、兼职、在家 … 都可以。
  • 工作要求: 1)连续工作半小时 ~ 1 小时,因为现在码字,眼睛不是很好,很干涩需要流泪才能缓解,需要休息 5 分钟远眺;我常常使用番茄钟,提醒自己该休息了,以免精力不足,影响明天。 2)可以接受重复性劳动,时长不能超过 9 小时;禁止夜班,没得商量。为了身体着想,说不定工资还不够看病呢。
  • 公司气氛:不要勾心斗角、人人胡思乱想;不要官僚作风、气氛紧张;不喜团聚。
  • 工资要求:实习期间工资 3000 以上。
  • 个人缺点: 1)手笨,不会系绳子,只会打蝴蝶结与死结。 2)习惯沉默寡言,不会烘托气氛。 3)英语不好,我尝试过好多次了,暂时办不到,以后有时间再试试。
  • 如果确定要为您办事了,我会在入职前将鱼放生,所以请不要耍我玩。
  • 补充一条,禁止传销、坑蒙拐骗其他人、等其它犯法行为。

你如果有意向,可以列出岗位的技术相关要求,若我有不熟悉的,我直接自学完了,再到你那来,给你干活去,这对我小菜一碟。

声明:天下没有不散的宴席,人都有分别的时候,好聚好散;请直接提出来,别耍阴谋,调来调去,或突然增大压力。

本人联系方式

不可以公开手机号,我怕销售天天打我电话,可以私聊我,在此期间应该一直在家附近寻找工作,我习惯被动,现在疫情这么严重,除非一锤定音,否则实在不想外地跑来跑去。

QQ:2675385031

微信号:cqhjava

邮箱:2675385031@qq.com

博客:https://ccqqhh.github.io

(有人问,有工作就不错了,怎么还提这么高的要求?漫画附图:)

PS:这要求还算高?直接免费打工,用爱发电,饿死自己,让其他人引以为鉴,变得冷漠,好吗?

当然我很清楚,能够看到这篇文章的,要么是小白急于寻找信息,要么是好奇,因为真正高手、HR 搜也不可能搜这,也绝对不会看到这篇文章的。也不用掺杂其它情感,图一乐就好;我这啰里吧嗦的,这写了也是白写,所以没有寄托太多的希望;再说了,这毕竟不是专门的招聘网站。

工作情况

物业维修员:2019.10 ~ 2020.5

状态:待业中

说明:最近被催着找工作,能敲电脑就行;只是怕又头脑一热,选错了,又浪费 3 年;当然最主要的原因是还有一大堆的知识还没整合完,小鱼苗还未长大,需要天天收集活食,不太放心啊;对,你可以认为是一种逃避外界的借口,无所谓。多你这一句话,暂时还压不垮我。

妄想的工作分支:送餐员、流水线、文员、Java 初级工程师、渔场、志愿员…

致谢与勘误

致谢

首先感谢父母给我一个好的身体,感谢母亲耐心的支持,感谢永远的 36 岁,永远的 42 岁,永远的 12 岁,那是少有的幸福时光。一点痛苦就可以掩埋无数的平淡时光。

其次感谢遇到的挫折与不堪,及时纠正我前进的方向。好吧我还是讨厌它,为什么我总要给自己的生活添堵呢?

最后感谢在网上无私奉献知识的大家,站在巨人的肩膀上能够看的更远;我是在家自学的,我能够想到的途径无非就是绘画、音乐、舞蹈、体育、进厂、销售,感觉还是电脑贫民些,不懂可以上网搜,就算是野生的也容易入门,可以说脑海中的知识体系都是网上博客园一篇篇的文章,一段段视频堆砌而成的,真的很感谢你们。生活在和平的中国,享受如此丰富的资源,挺幸运的,我会把文章知识来源链接放在参考文献中,但可能有遗漏,不能一一列出。

这些在网上搜集的资料,如有侵权,烦请告知。

编者:cqh 2022 年 3 月 4 日,于湖北安陆

勘误

笔者也只能算是新手,学识尚浅、水平有限,有些抽象、底层的东西以目前的功力无法一眼看破,找不到合适的方法去验证结论,只能是凭第一感觉得到具体的规律,所以也可能是想当然,看法比较片面。你就当成强行解释,笑一笑吧,对身体好。

部分解释可能不详细或不清楚(词不达意),如果你有更好、更通俗易懂的语言,欢迎留言指出。

在阅读文章时,请你时刻持有一种质疑的态度,这样既能帮助自己思考,也能发现我文章的不足之处,如果文章中有什么错漏的地方,还请不吝啬指教与批评,十分感谢!

若有帮助,会将你列入鸣谢名单中。

书中源码地址

https://gitee.com/ccqqhh/JavaSE-grammar

自序

第 3 版自序

之前是想要找文献与资料,四处找不到;现在是资料漫天飞,四顾茫然;曾经的我反复横跳,浪费了很多时间与精力,干脆把自己所知整合起来,也是为了方便大家,不然忘没了就挺糟糕的。并且这期间,如果另有收获,会持续更新此书的内容。(学海无涯苦作舟啊)

本人专科毕业。我始终认为只有自己喜欢的才需要学,忽略了高中这不是专项发展,而是筛选人才;那么多的人,企业正好设置为本科门槛可以节省筛选时间;此外你通不过本科,企业难道不会怀疑你的学习能力有问题?既然是为了赚钱,那为什么不选更好的?人才多的去,谁稀罕你这一个。

我倒是没有什么后悔的,因为学历与钱对我而言不太重要,还比不上自身学会了写代码的那种喜悦,只是觉得大多数人经过 18 年的学习,每三年的转眼间淘汰了一半人,估计都流向工厂的流水线了,太浪费了。说好听点,成绩不太好的,进入技校,学习本领,直接对接企业,好好动手、做事,成为一线工人,读书好的进高校做理论好好做研究、理论,互相弥补。说难听点,我觉得不大现实,都下去了,还指望公平对待,齐头并进吗?至于指望未来进入技校后再努力,有这个本事,还至于掉下去吗?

还是不得不承认,学历高,见识的东西就更多,学习能力强,能够打下更坚实的地基,就算现在一无所有,也能东山再起。

我想起了,上半年看到的一句话:“我们的教育生产理想主义者,再由现实击碎他们的幻想,并将这种重塑称之为成长。每当我回顾我所接受的教育,我总感觉到被欺骗的愤怒,到现在还是无法释怀。”

一直笑着说大不了回家种田,但其实要是真的能够维持生活,没有人愿意背井离乡,出去打工的。我之前提到过滞后性,上一辈人因为这种滞后性,吃够了亏,于是只让我们专心学习,自己在外辛苦打工,进厂或在工地成为耗材,承受所有的风险,只为了子代不再重蹈覆辙,以为我们考上大学了以后就能赚很多钱,不用进厂或在工地遭殃了,终于可以享福了,却忽略了其它方面。

我们都以为学成了,考上了好大学,也许前途就顺了。但总还有一半人被淘汰了,比如我;父母还是抱有期望的,至少是个大学生啊!至少比我们强吧,结果期望越大,失望也就越大,到头来终究成空。

其实学校教的东西可用的很少,大多数就是纯粹应付考试。等上了大学后,被忽略的其它方面,弊处就开始显现;上一辈人突然觉得这么聪明的大学生,读了这么多年的书,这点生活常识都不懂?人际交往、生活常识、整理内务、洗衣做饭、修电脑啥都一团糟?你们在学校学了个啥?换我来吧!读书有啥用!废物!你们 90 后当家了,这个社会要完蛋!

我不太在意,我知道他的局限性,他所在的小地方,也就只能看到我,误以为我就是大学生的缩影。但是网上有才有能力的人多了海了,否则你们找工作怎么这么难找。当然工厂、销售…等岗位还是挺需要人的,可惜我并不擅长,也就敲敲键盘喽。

我认为有这些高智商的人材们,尤其是特别努力勤奋的,社会只会越来越好,但是对自己的命运不是特别乐观,或许这是另一种形式的物竞天择吧,但是我真的很讨厌争、去比,所以每次都主动落在后面,能轮到我自然好,但如果资源提前光了,重新换个队伍排吧;如果没有自己的世界会变得更好,也不知道是开心呢还是寒心,既然不需要我,我也看不到身上有什么可以交换的利益帮助到别人,那还召唤我干嘛,激起好胜心,衬托别人的优秀嘛,又不是养蛊,难怪基因还能流传来下,呵呵。

我希望以后不会固步自封,局限自己的认知,觉得自己经历过这么多的事情,可以一言堂,狂妄地自以为看清了一切,断定周围人的秉性。因为经验有时效性,且与个人息息相关,在别人身上不一定适用。传递的观念如果别人不听后吃亏掉坑,我就在旁边暗笑,那样太可怕了,那说明我已经变质了,经验此时反而束缚住了我前进的脚步。

警告自己的一句话:我知道人都会变,可是当你看到这曾经写下的这句话,如果觉得很幼稚可笑,算了,不想前进了,就说明你已经融化了。那么狠狠地抽自己,往死里抽,别让我瞧不起你,你欠我的。我现在拼死累活地,下决心,不是为了让现在的你心安理得的阻碍其他人的梦想,嘲讽其他人,也不是让你吃老本,坐吃山空,别以为这是理所当然,好好想想自己该做什么,还是在楼下打麻将与其他人夸天?

小学时都想当什么科学家、医生、警察之类的,唉,现在想想简直就是做梦,能活着就不错了,哪有这个能力。

当初高中毕业,选专业,认为新能源汽车发展起来了,也可以保护环境啊,于是特别天真地就选了此专业。

当时实习时来的都是接插线、黑白班做饲料、卖挖掘机、开叉车…尤其看到要求男女不限,18 ~ 50,身体健康…沉默,我这时才明白自己早就已经 out 了,到这来只是将噩耗延迟而已,其实刚进大学时觉得完了啊,时间一长,如同温水煮青蛙一般,渐渐习惯了自己的处境,不要觉得扎心就视若无睹,假装身边都是好事。

应该事先多看看东西扩展一下视野,或许可以认清自己,然后挣扎一下;不禁怀疑我到底这 18 年的生涯到底学了什么?混成这个样子?竟然不知道在简历添些什么东西,热情开朗?踏实能干?会求微积分?也不明白自己有什么优点,自己的价值在哪?凭什么让企业招聘我。再看看其它要求高的,不觉得我能够达到,别人说不定看不上,真是贱啊。

或许你看到很多视频教你如何夸大,人人都这样,你不变,就等同于落后了,但我做不来,主要是不想,或许再经历几次毒打,就可以沦为同类人了。

好吧,乌龟壳虽然保护了我不受伤害,但是一旦有朝一日,从壳中脱离,没有练成应对危机的本能,只能扑街。

因为 2020 上半年考了一个电工证与驾驶证,友每天恨铁不成钢,即使之前有多不敢,导致错失了机会,所以这次一定不能放过!于是如同赶鸭子上架般慌着选择了工作,貌似能扯上一点关系的物业维修,正遭疫情,每天都是抄水电表,没积累可用的工作经验。解封辞职后,想回到心心念的家乡舔舐伤口,好好休息,可惜我周围一个人都没有,尽管一切都没变,但还是变了,心中没法容纳其它了,无论人还是热爱,空空的;时间长了,出门偶尔被指指点点,越发绝望,觉得谁都不需要我,我的意义在哪?实力弱,处处都是地狱。于是开始养起了鱼,获得了一种原来还有生物依赖我的踏实感,如果有兴趣养鱼可以看看:https://www.toutiao.com/article/7081637728160481792/

休息一个月后机缘巧合下知道了 Java,于是到处搜罗学习资料,跟着网上的博客与视频一步步来,哎!觉得希望来了,这有什么难的。

那段时间,父亲和亲戚不再问读书成绩的事了,时常问我学了什么名堂,答:我学的这个集合很厉害,底层用多种数据结构存储数据,你看这个双向链…停停停,别跟我讲这个,我听不懂,这么有用,什么时候出去找事?可以赚多少钱?答:额…,没信心啊…

得,赶进度吧,花了5个多月的时间,数据结构与算法、MySQL、JDBC、HTML、CSS、JavaScript、Tomcat、Http 协议、Servlet、JSP、AJAX、JQuery、Maven、MyBatis、SVN、Git、Spring、SpringMVC、Dubbo、Linux、SpringBoot、SpringCloud、Nginx、SpringSession、FastDFS、RabbitMQ、SpringSecurity、Shiro、Swagger、CRM 项目…结果学完了,看着招聘信息罗列的一大堆,更没信心了,感觉白学了,只是语法而已。

期间为了方便翻阅和复习,加页码、加目录、记时间、正字复习、画星星、康奈尔…方法效果甚微。

所以以我为反例,别用纸质笔记,很不方便的。

(之前有人问我,5 个月怎么这么慢?其实我之前太贪心了,还想学数学、英语、物理…)

也不是没有人劝我,江山易改本性难移,固定的思维就像茅坑里的石头难以改变。每次听到劝导,又开始神经发作,万一呢?你到底怕什么呢?谁会吃了你?这是否已经成了本能?我想不通,也说不清了…

我的理智告诉我,我只是害怕未知,本能拒绝去尝试,害怕再次失败,又被人侮辱与嘲笑,尤其是年龄大了,没有试错机会了,只能尽力维持现状,一旦没有了父母的支撑,把我投入到大海中,要么四肢扑腾,学会游泳,要么淹死。说到底,我还是有很好的父母,坚实的后盾,实在太幸福了,所以才令人感到如此悲哀。再结合到三和大神、26 岁成人被饿死之类的,我能理解亲戚他们的想法。算了,不说了,混成这个小孩模样,也是没谁了,希望能在饿死之前,主动寻求改变吧。没想到还真自证了自己初中时的想法,讽刺啊。

觉得学的也差不多了,开始看招聘,清一色的本科以上要求,这还玩个毛啊。再从网上看看题目,倒是不难,但想流利的说出,还是要背;语文、英语对我还是有点难,由于耳朵问题,只习惯看字幕,真不想把时间花在这无用的试探之上。说到底,我的信心一直被摧残,没被培养起来,一做事就放下手头的事跑过来看我,指指点点,说这不行那不行,不停地被否定,最后直接推开替换了我,一说话就被认为是借口,为什么别人行而我不行?对啊,我也纳闷这到底是为什么。所以畏手畏脚,一想到工作就躲避,哎呀都是我不行的,干不了,主动失去信心,下贱自己。那么别人看到这个样子,没有一点正能量,只会让现状越来越坏,犹如囚笼之兽。现在回想起来,这本来就不难,小事一桩!为什么非要挫折教育呢???究竟经历过什么事才会认为这是正确的做法?是不是我视野窄了,看不到背后的良苦用心?

得到一个规律:不犯错,必败事;如果小时候文文静静,逆来顺受,畏手畏脚,被框在自以为的规矩下,不敢尝试,看上去很听话很乖;但年纪大了,躲得了一时,躲不了一世,没有小错带来的经验,将来必定踩坑,成为平庸的人;这虽然不是必然发生的,但是概率很大,常在河边走总有一次会湿鞋嘛。小时犯错相比大时犯错,周围人包容度更高,所以建议小时多尝试。

受限于学历,所以我降低了要求,不得非要与代码搭边,随便啊,别进工厂黑白班、天天 12 小时,我还不想猝死。你们如果有什么好的渠道,智联、前程、脉脉…欢迎交流啊!

回顾,自己表面掌握了什么高大上的框架,但框架用起来很简单的,底层屏蔽了繁琐细节的具体实现,从配置多个 XML 文件到约定大于配置直接启动,增删改查就增几个注解,改下 SQL 语句,越学越简单,只是要背注解、方法名、操作步骤…才发现我其实也就是只会调下 API,太浅显了,一遇到稍微深层次的问题就扑街。忘了代码就在网上搜索复制粘贴,这不就是搬砖吗?我学到这之后就没学了,就是觉得太浅了,简直把我当做硬盘在用。这些方法名,记流程有个鬼用,时代一换,又得重新开始。

我觉得是基础没打好,也许是哪里走错,之前学的不够系统,又把 JavaSE 内容看了一遍,尚硅谷、动力节点、狂神说…,收获不是很大。

终于下定决心,这 Java 内容之多,之繁杂,总得有人要整理一下节省小白的时间,稍微扑腾一下吧;为了帮助和我一样的人,避免踏入同一个坑,开始本书的第 1 版制作:

结果写了一大半才发现公众号、视频、文章,甚至有专门的网站引流宣传赚赏金,一大堆人都已经做过了;得,反正也不缺我,我写不写也都无所谓,又丧气了,干什么都比别人落后一步,更何况我的知识来源于此,我特么地又把它搬回去,真是闲得慌。

唉,我平常喜欢在小路上慢悠悠地走,轻松自在,没想到变成了赛道,真可惜。

(当然现在知识忘得差不多了)

当时正是过年,前前后后忙了几个月。又被打击了一顿,说我在家里游手好闲、不学无术,不务正业,试过辩解,被认为只晓得找借口,是废物一个,在村里都不好意思说,不敢走亲戚,抬不起头,对外统一口径是我好高骛远,只晓得在家里玩,那么我也就没有什么可以说的呢,我不明白这是在激励我还是在保护我呢;每当别人问起我的年龄时,是否还在上学,总是感到脸上一阵青一阵白十分羞愧,无力感萦绕在心头阴魂不散。此时负标终于超过负荷,被最后一根稻草压倒,期间强行振作,努力维护日常作息,又被说年轻人还是没有被锻炼到,还是要多给点压力锻炼下,否则太脆弱了,心理承受能力太差,连这点打击就把你压垮了,去做销售扭转下性格就好了,挺适合的。终于压不住内心的痛苦崩溃了,开始自暴自弃,为什么所有的评价都认为只有我这么废?算了吧,说的对啊,我的确没用,还学什么啊,都卖了吧,我实在太脆弱了不堪一击,整个人又坏又蠢,估计就连小学的我就瞧不起现在的自己,不搞了,自闭中;眼泪不能流,声音不能出,打碎牙齿往肚子里呜咽…男人!男人嘛,男人!你这么大个人,怎么还跟小儿一样,好意思吗?没希望了,一生已经毁了。

但是过了一段日子后,越看越觉得这个笔记不对劲,写的这么粗略,这是给自己看的吧?新手能够看得懂吗?强行驱动自己,做事必须有头有尾,还是续了一根弦。在此期间,我明白了既然寻求人这种生物的认同十分地困难,那么还不如把精力放在代码、鱼、自然身上。有人说自然与这些生物有灵性,我不否认,可是它们的灵性如果达到了人的高度,假如我散步去了另一个地方、今天没有喂鱼…它们会不会在心里扯着喉咙喊:“为什么不到我这玩!为什么今天不喂我!!”那我该是什么表情?是不是比与人打交道更累?

当时又看了韩顺平老师的课程,他总结的学习方法很不错,先 demo 再写注意事项。然后由此编写了第 2 版:

初入门时 JDK 安的是 15,(应该是 8,做第一版教程时才应该把 8 删了,重新下了 15)当我重新准备下载时,发现页面找不到了,这才知道长期支持版本是什么东东。

好吧,为了回顾当初下载软件时遇见的问题,场景重现,方便截屏,狠心格式化了电脑,把之前的 Node.js、Linux、MySQL、Navicat、Maven仓库、Tomcat 等一切全部删了,直到现在都还没下载回来。之前放入 GitHub 仓库的代码,比如数据结构,被我认为代码写的太垃圾了,直接清空了。(现在就没有参照了,真是白给)

只剩下 FastDFS、RabbitMQ、SpringSession 的 demo 了。

好,没关系,大不了重新开始。

花了好几个月,废了很大心血,删了改,改了删,半夜突然醒来,打开电脑就只为修改一句话,信心满满,没有多少评论,想着是不是网络上资源太多,唾手可得,根本就不缺我一人的努力,此时突然觉得我都没有找到工作,所学知识之浅,路之狭窄已到头,还敢斗胆发文章,也不称称自己的斤两,这不是误人子弟吗,于是把之前的所有博客都删了,秉持了不尝试就不会失败的鸵鸟原则。

我现在想明白了,去追赶那些前言技术,学习语法,如何使用,只会流于表面,疲于奔命;干脆放弃掉,重新开始。我觉得就连 Java 语法,也变得不太重要,毕竟只是背别人定义的规则,还是表面;但是要写程序,没有办法,于是就有了语法入门篇。

根据纸质资料和粗略的第 1 版,以及网上的博客资料,拼拼凑凑得来了第 3 版,至此只完成到集合部分。并且我还是不满意,决定抽出时间,继续重置。

现在又要看最开始的老版笔记重新写一遍,做事有始有终,不能轻言放弃,爬也要爬到终点!没有什么是不可能的(Nothing is impossible),即使这份感情被背叛过千百次。还好现在没工作,否则抽不出时间写。由于删了之前的博客,有很多都是后来在最初版的基础上修修补补地,可能有很多疏漏、没来得及添加的、知识变异了的,恳请大家提出宝贵的批评和建议,以便改正。学习路线就按韩老师的来,先 demo 再声明课堂注意、出题目,按部就班的点还是挺不错的。

2022.3.11

第 2 版自序

接受现实,痛定思痛,干脆抽出时间,整理曾经写过的纸质笔记与博客,为尚未踏出校门的同学节省一点时间。

有的地方根本没必要学,直接复制粘贴看看 API 就行,没啥技术含量的。对于那些性格内向的人,心里有很多内容与墨水,但嘴里吐不出话的人,我特别能够理解你的苦衷,珍惜校招吧,避免毕业就是失业的尴尬局面。

有些人的确很聪明,在这里我不想扯勤奋与努力,以前也讲过,这只是表象,何况对于有些人也真的很难,考虑到通用性,内容稍微细一点,不要嫌我啰嗦。

我已经很知足了,阳光、空气、可以动的四肢、能计算 1 1 的大脑,没用什么遗憾了。对我而言,健康远比时间、金钱、技术重要。不对,这该死的技术,这抵挡不住的魅力啊!!!

真的好怀念魔兽,如果阿尔萨斯王子没走屠杀线一定会有美好的结局吧。

2021.7.4

第 1 版自序

最近学习了 MarkDown 语法与五笔打字,打算把纸质笔记整理成书,帮助大家。

经过一段时间的摸索中,得出了以下结论,希望对新手有帮助。

1、删除无效的软件(打造合适的环境)

比如一直让你刷刷刷,停不下来的。因为你每次刷,都在期待下一个视频对你有用,但很大的可能只是满足了你的多巴胺分泌。

上瘾后不要责怪自己,想办法清醒后把这些触手可及的东西,不管是卸载、还是关闭推送、扔在角落…尽一切可能不要让它来打扰你;如果你是因为没有事情,好无聊,看这些来打发时间,那就找一些其他事情吧,如散步、健身、看书什么都可以…

这种大量占用时间碎片,令人上瘾的软件,可以说是一种毒瘤,我想不通为什么要研发它,钱真的很重要,但也不至于这样吧。

我说过人就是个石头,现在看看销售营销等一些手段玩弄心理,越发坚定这个想法;我们能做的只不过是别让那些外力推动自己。

2、工作与学习之间的平衡

公司都是重复性劳动,没有实际上的经验提升,还要担心上级领导的试探,同事的打压,构建话术。下标后自学也只能学习 1、2 个小时,并且还不包括动手尝试的环节,能够学到手的知识十分浅显。等学完,天都换了。

并且公司本质上是私人组织的、有了好点子想变现、以盈利为目的的结构;你想想你要是老板,谁不行直接替换掉,反正人才多的是,为何还要等你慢慢成长,真以为自己是潜力股吗。

但是辞职也不可取,长时间在家,没有了生活来源;走在路上还要被婆婆们嬉笑。

此外亲戚们都不会理解,最亲的人也会骂你不中用,你给他也讲不明白,还会被觉得十分可怜。一开始还可以打哈哈,说自己已经毕业了,在学习编程;但之后呢?这条漫长的学习之路,不同于进厂教教就能直接上手。

我想提醒你,你是否也感觉大学的课完全没必要上,但我们也许还如同高中一样,按部就班,讲什么就听什么,那么到了毕业就等于失业,你应该抽空把自己的爱好发扬光大。如果等到上班再学,其他人会怎么想?

结论:请好好珍惜大学的时光,那是唯一适合自学的时候。否则你要承担额外的精神压力,扛不住人就废了。

3、适当约束自己的好奇心

不要看到什么都想学,什么都想买,一直在搜,知识太多,你学不过来的。你先在网上搜索,比如后端的整套知识点,按顺序来,一心一意,一套教程为主,有疑惑的再去别的地方比对。不要没事就搜索一大堆资料收藏,又不开始,资料一定要精简,那些看上去有用的知识但短期用不上的,直接取消收藏。等你到了这步,再找资源,别做松鼠。

关于难度高的,可以先跳过,记录下来,后面再补上,比如数据结构、JVM 底层、多线程与高并发、GUI 等等…别把初学时间浪费在这上面。

不要背代码,要掌握原理,方法可以到 API 文档上查。之前基本都是概念上的东西,理解就好了,但学到集合、IO、常用类如 String,只背方法名一定会消灭你学习的兴趣。

如果学习资料抛出一大堆让人心痒痒的新名词,操作不讲规则与原理,没有容易理解的例子,只是像背或粘贴似的敲打代码以及一大堆的命令控制流程,那么我劝你趁早跳过,用时再翻阅。

4、管理好精力

并不是一直在同一个地方枯坐,工作效率才会高。

要合理分配精力,因为精力是有限的。学习并不是生活的全部,如果你整天扑到学习上,只会感动自己。随着精力的消耗,自控力的减弱,一定会在某天突然崩掉,开始变得什么都没有兴趣,行动力拉到最低,即使强迫在学,也只是枯坐原地,享受着左耳进右耳出的枯燥感。

早起别熬夜,每天一定留至少 30 分钟的时间午睡。(为了第 2 天的精神良好)学习时推荐使用番茄钟,每过半小时就休息一小会,合理分配精力。(休息时不要看电子产品与动脑筋,要适当远眺)

5、学好英语

没什么说的,英语真的很通用很重要,为了阅读懂优质的国外资料。看着机翻的我太拉跨的,简直是哑巴英语。学不会也没关系,就算关了一扇窗,把开这扇窗的力量用到别的地方去,一定不会浪费的。

6、必学的知识点

从大多招聘岗位的要求取出交集:

IO、集合、JVM、多线程、Spring、SpringBoot、SpringMVC、MyBatis、Dubbo、SpringCloud、JavaScript、Vue、MySQL 取其一、SQL 调优、Redis、Tomcat、Nginx、Docker、Zookeeper、RabbitMQ、Kafka、Linux、HTTP 与 TCP / IP 协议、Socker、Maven、Git、AJAX、ElasticSearch

剩下的知识,应聘意中岗位时再选择性补全。

7、选择书籍还是视频

视频时间看完所需时间更长,但可以一步步来,如果章节内容划分合理,每个视频时常合适,学习者更轻松完成每个目标,掌握自己的进度。适合初学者。

书籍花费时间较少,但经常有断节之处,初学者搞不明白缺少哪一个环节,看着晦涩难懂的文字,翻不了几页就草草放弃,适合耐得住性子的人。

8、不要过分追求完美(承认自己的不足之处)

想做就直接放手干,不要计划的那么周全,稍微一有变动,就放弃目标,想明天再做。是吧,别觉得只有从容不迫、不慌不忙、按部就班地才叫做事,而达不到自己的心理预期就不做了,大多数人都是计划赶不上变化,被搞得灰头土脸的。

另外人都是有惯性的,如果设置了太高的目标难度,只要有一天没坚持下来或不想做了,那么最终结果一定是放弃。

这不禁让我怀疑,以前对生命的定义。我本来以为生命是一种奇迹,我感到自豪,超脱于物质之上;比如从下坡推一个石头,它只会毫无疑问的滚落下去,而我们可以做出反应。

但经过太多的事后,我发现生命的本质与死物没有太大区别;生命就像是一台精密的操作仪器,如同电脑、机器人,只不过比它们先进点。

接收输入做出反应,将应对方式与最终结果存储;等下一次事件再发生时,可以不断优化脑海中存储的应对危机的方法,达成自我学习的本领。

9、学会分享

不要闭门造车,要发在各大网站上分享,Markdown 语法如果你都会了,直接发在博客网上。不要觉得自己技术菜。

第一,人人都有开始,你发出来了,别人才能纠正你的错误,避免成为井底之蛙。

第二,你又开始自耗了,不停地在脑海天人交战,一顿脑补:会不会万一发出来被人嘲笑怎么办?…于是藏着掖着,生怕别人知道,出丑,事情还未做,就想一系列的后果,别人有多可恶。我觉得世上还是好心人多,当然不要被零星几个恶评就忽略了大多数支持你的人。

第三,百分之 99.9 的人根本刷不到你的文章,或者一下就 × 过去了,即使刷到了,那还有 9.9 成人浏览刷的一下就关了,评论的那是少之又少,凤毛麟角。如果帮助不到他,谁还关心你是谁,最多充当局外客感到可笑。当你还在纠结别人的看法时,纠结要不要做时,别人根本记都不记得你。我们在网络时代那是十分渺小,沧海一粟,很快被淹没,就算有弄潮儿掀起了几朵浪花,也会很快平息,所以别再纠结丢不丢脸了。

10、关于努力与勤奋

有人经常说,要自律,要吃苦,要努力,才能成功,你看看这些成功人士都是这样…努力才能得到一切,才能成功。但我抛出一个结论:努力与吃苦,并不能成功,也不能改变命运。

他们忽略了一个东西,自律、吃苦等只是个表面行动展现出来的结果,并不是成功的原因。比如你打王者,技术很菜,但是你就想升段位,不用别人提醒,开了一把有一把,一直连跪,日夜颠倒,身体早就向你警告了,这种违反本能的行为真够自律的。不打一定不会上王者,打了无数盘由于技术太菜,也不一定能上王者。

另外无论是游戏、还是学习,多了总会令人厌烦,这不是真心喜欢,大多数人并不喜欢打游戏,这只是无声的对抗与放纵罢了。

如果你真心地想要完成某个目标,你不会觉得这是折磨的。再次声明,不是自律、努力才会成功,它们实际是想到达成目标,而自发控制自己身体机能活动的行为。

所以努力只是达成目标的一种手段;由于基因与环境很难改变,于是性格也几乎定型,形成了独有的接人待物的一套行为模式,感兴趣并为之付出汗水的也就那么几件,还要承受不理解;

之所以说“努力改变命运”这种只是安慰、激励自己的空话,是因为至少要给一点希望,好被利用,而不是自暴自弃,十分绝望,没有向上的动力;如果让“唉,都是自己不够聪明,天赋不好,于是就不努力了,让子代好好搞吧(甚至认为改变不了,都不要后代了)”的观点占了主流,那么原本有希望改变的人也会受到负面影响;

所以人们不太乐意听“唉呀,只是你天赋好”之类的话,无法改变的事实对其他人是沉重的打击。这就是不要将过错、天赋归咎于自身,而是归因于经验水平不足,认为只要努力就还有希望进步。

我之前都说过部分人根本就谈不上拼努力与天赋,正常学习不放弃就 OK,没有必要与头部的那群神仙比;刷熟练度而已,当然在没有专家指点迷津的情况下,自己总结出的经验(甚至还没有,只是靠肌肉记忆)很可能不完善,很快就会达到瓶颈,再无寸进,这时就比拼天分与悟性了,但不管怎么说总比从来都不碰强。

“努力才能成功”这种原意激励人给以力量,逐渐成了合法霸凌其他人的手段,潜台词被恶意解读成“不成功就是你还不够努力”、“不成功就是你在假努力、无效努力”、“什么比不过人,就说你还不够努力”,偏偏还难以反驳,一说就是找借口,只能怀疑自己;得,由此观点诞生了一个又一个诱捕器,看着似乎有道理,其实空空如也。

自从这句话变味后,努力似乎慢慢变得廉价,成为人最基本的底线。

那么我换一种说法:“知识就是力量”。

友情提醒:全身心很耗精力,记得番茄钟打断此状态(半小时),休息的时间眺望远方,不要看电视、玩智能设备,否则越来越累。

11、学完要多久?

如果你不复习,不怎么练,只看视频的话,最多半年。能够记住多少看命。

正常一年半(每天 8 小时以上不间断)

12、是不是很难?

相比越到后面越抽象,一环扣一环的数学,Java 其实还算好,小白也能调用方法完成工作,理解一下就行,屏蔽了底层如何实现的繁琐细节,看看 API 即可拿来用。

至于为什么一看就会,一敲就废?是不是我没有天赋?

说实话,这些东西不会就跳过,以后再补,只要学会调用方法,看看 API 就行。还没有达到拼天赋的地步,努力也无需拼,努力只是外表展现的结果,而不是因,若你感觉自己很努力了,很痛苦,就像我之前说的这样,你想想哪里出现了问题,是不是真的不感兴趣,居然会觉得要强逼自己,努力才会成功?想着人只有逼逼自己才行?

话说回来,不会不是真的完全不会,而是你看时觉得很正常,但一到做时脑海中缺少一些关键片段,甚至连思绪的头都没有,无法串联成珠,往往出错,其他人只不过是由于过往经历(熟能生巧)或者下自然地就补齐了这个漏洞。

没必要担心,如果你接触它的时间过长,会弥补的。不用特意寻找解决它的办法,多看看就行。(把同一个知识点学三遍差不多就熟了)

此外我觉得人略微笨些,是好事,意味着你能够帮助这世界绝大多数人,不会出现理所当然,而一些人却不能理解的事,知道哪里有槛,知道一些人哪里有误区。只要你走通了,其他人就能走通。

花自己的时间,让更多人节省了时间,值。努力活完短短的一生,将所得成果留给后代分享,人类真的是很了不起呢。

2021.2.11

第 0 版自序

今天是网上学习 Java 的第一天,自学,根据学习路线图一篇篇在网上搜来的知识。

本人才疏学浅,感悟还不够深,只能根据些许痕迹揣摩出背后道理。主要是臆想成分居多,如果有什么不对的地方,还请各位大师指点,大家一起共同进步。

另外希望把已建立的认知体系撕开一个口,推倒。包容,承认自己的失败,不要斗气就认这个死理,大不了掌握其它方法重头再来。

2020.6.13

第一章 JDK 下载及准备工作

内容导视:

  • Java 介绍
  • JDK 下载
  • 编写代码前的准备
  • Typora 软件简单使用
  • 常用的 DOS 命令
  • Jopin 使用
  • MarkText 使用

1.1 Java 介绍

内容导视:

  • Java 简介
  • Java 技术体系
  • 前后端的工作内容
  • Java 语言特性
  • Java 用途

看不懂就跳过,这里不是重头戏,说实话,挺无聊的,我也不是很懂,这根本不是初学者应该考虑的,直接跳过也没问题,但又不能不讲,否则感觉缺了点啥。其次我一直孤军奋战,没有评判体系,只能靠自己甄别好坏,难免有些遗漏。

但其实这也是一种好处;如果一切都是可以被量化的,如分数、金钱,人变成了数字化的商品,那么不是前几名的人,那种付出、比较后的失落与无力感;就彷佛看小说变成了只看评分前几名的一样,一切都在往上赶,时时刻刻都在提醒你所处的位置,被时代裹挟不得不拼命增加自己的评分与排名获得显露被青睐的机会;如此一来,这个混沌的、可以躲藏的空间显得极为重要,说起来好像是自欺欺人,就是不看一样。

1.1.1 Java 简介

Java 最早是由 SUN 公司(已被 收购)的 James Gosling(詹姆斯·高斯林)在 1992 年开发的一种编程语言,最初被命名为 Oak,目标是针对小型家电设备的嵌入式应用,结果市场没啥反响。谁料到互联网的崛起,让 Oak 重新焕发了生机,于是 SUN 公司改造了 Oak,在 1995 年以 Java 的名称正式发布,原因是 Oak 已经被人注册了,因此 SUN 注册了 Java 这个商标。随着互联网的高速发展,Java 逐渐成为最重要的网络编程语言。

有兴趣查看以下文章,了解 Java 发展历史

  • 作者:JMCui,https://www.cnblogs.com/jmcui/p/11796303.html
  • 作者:苗子说全栈,https://baijiahao.baidu.com/s?id=1714823765201515049

此外 JDK1.5 与 JDK5 是一样的意思。因为比之前版本的变化大,以此作为区分,表示与众不同。就像美猴王自封齐天大圣,都是一个人(猴)。

此外还有 J2EE 、JavaEE,只是叫法不同,不必纠结。

正式发行名称

昵称

JDK 1.0.x

Java 1.0

JDK 1.1.x

Java 1.1

Java 2 Platform,Standard Edition,v1.2

Java 2

Java 2 Platform,Standard Edition,v1.3

Java 3

Java 2 Platform,Standard Edition,v1.4

Java 4

Java 2 Platform,Standard Edition,v5.0

Java 5

Java Platform,Standard Edition 6

Java 6

Java Platform,Standard Edition 7

Java 7

Java Platform,Standard Edition 8

Java 8

1.1.2 Java 技术体系

分成了三个技术体系

(以前被称为 J2SE、J2EE、J2ME)

JavaSE(Java Standard Edition):Java 标准版,包含核心的类库,主要开发桌面应用(如 Windows 下的应用程序)。允许您在桌面和服务器上开发和部署 Java 应用程序。JavaSE 和组件技术提供了当今应用程序所需要的丰富的用户界面、性能、多功能性、可移植性和安全性,并为 JavaEE 提供基础。

JavaEE(Java Enterprise Edition):Java 企业版,为开发企业环境下的应用程序提供的一套解决方案,包括 Web 网站后台开发等。该技术体系包含的技术:Servlet、JSP 等。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务端Java 应用。JavaEE 是在 JavaSE 的基础上构建的提供 Web 服务、组建模型、管理和通信 API。

JavaME(Java Platform Micro Edition):Java 微型版,JavaSE 的瘦身版。主要做嵌入式开发。 JavaME 是专门为资源受限的设备设计的,如为 M2M、工业控制、智能电网基础设施、环境传感器和跟踪等的无线模块、手机、PDA、电视机顶盒和打印机上运行的应用程序提供一个健壮且灵活的环境。自从安卓系统出来后, JavaME 就用的比较少了。

JavaSE 是整个 Java 平台的核心,做 Java 后端先学 JavaSE。

1.1.3 前后端的工作内容

前端

编写 html 代码搭建一个框架展现网页内容,如图片、文字、视频…,打开浏览器的任意网页,按下 F12 可以看到网页对应的 html 文件

用 CSS 技术美化页面,指定 html 标签的位置、样式等;

用 JavaScript 语言控制与用户的交互,比如网页弹窗、动态改变网页内容、验证登录信息、跳转页面等。

例:点击登录页面,输入用户名与密码,按下回车,会触发事件执行 JavaScript 代码,给用户响应(登录失败或成功)。

可以说前端相当于前台,是可以看的见的内容。

后端

接收从前端页面或其他后端服务传递过来的请求,处理业务逻辑,对数据库中的数据增删改查 CRUD。

给调用者一个响应,如把数据返回给调用者、操作是否失败、返回对应的 html 代码等,用户是看不见的。

例:接收到前端传过来的用户名与密码,查询数据库中是否存在,若不存在返回用户不存在。前端接收到后,改变页面信息给用户提示。

不限于使用哪种编程语言,只要能把正确的数据返回给调用者即可。

要保证访问量很大时(同一时间内能够处理尽可能多的请求)而服务器不宕机、响应时间短不至于用户长时间等待、多个用户访问时保证数据的一致性等。(高可用、高并发、分布式、自动化)

1.1.4 Java 语言特性

Java 是一门编程语言,特性如下:

1、面向对象

Java 以类为结构组织代码,对对象、继承、封装、多态、接口、包等均有很好的支持。为了简单起见,Java 只支持类之间的单继承,但是可以使用接口来实现多继承。使用 Java 语言开发程序,需要采用面向对象的思想设计程序和编写代码。

如果不想使用此特性,Java 也可以写出面向过程的代码。

2、平台无关性

一次编写,到处运行(Write Once,Run any Where)。因此采用 Java 语言编写的程序具有很好的可移植性,而保证这一点的正是 Java 虚拟机。在引入虚拟机之后,编译后的 class 文件可以在不同的平台上运行,不需要重新编译。

3、简单性

Java 语言的语法与 C 语言和 C 语言很相近,使得很多程序员学起来很容易。对 Java 来说,它舍弃了很多 C 中难以理解的特性,如操作符的重载和多继承等,而且 Java 语言不使用指针,加入了垃圾回收机制,解决了程序员需要管理内存的问题,使编程变得更加简单。

4、解释执行

Java 程序在 Java 平台运行时会被编译成字节码文件,字节码与所在平台无关,可以在有 Java 环境的操作系统上运行。在运行文件时,Java 的解释器对这些字节码进行解释执行,执行过程中需要加入的类在连接阶段被载入到运行环境中。

解释型的转换工具称为解释器,程序在运行时使用解释器。每翻译一句,就执行一句,效率低,但跨平台性能好。

编译型的转换工具称为编译器,事先把源代码交给编译器,它一下子全部翻译,得到编译后的代码,可以直接被机器执行。

例如 JavaScript 语言有编译型的转换工具,如 chrome 的 V8 引擎,也有解释型的转换工具如 Netscape Navigator 的 JS 引擎。

5、多线程

Java 语言是多线程的,这也是 Java 语言的一大特性,它必须由 Thread 类和它的子类来创建。Java 支持多个线程同时执行,并提供多线程之间的同步机制。任何一个线程都有自己的 run() 方法,要执行的方法就写在 run() 方法体内。

6、分布式

Java 语言支持 Internet 应用的开发,在 Java 的基本应用编程接口中就有一个网络应用编程接口,它提供了网络应用编程的类库,包括 URL、URLConnection、Socket 等。Java 的 RIM 机制也是开发分布式应用的重要手段。

7、健壮性

Java 的强类型机制、异常处理、垃圾回收机制等都是 Java 健壮性的重要保证。对指针的丢弃是 Java 的一大进步。另外,Java 的异常机制也是健壮性的一大体现。

8、高性能

Java 的高性能主要是相对其他高级脚本语言来说的,随着 JIT(Just in Time)的发展,Java 的运行速度也越来越高。

9、安全性

Java 通常被用在网络环境中,为此,Java 提供了一个安全机制以防止恶意代码的攻击。除了 Java 语言具有许多的安全特性以外,Java 还对通过网络下载的类增加一个安全防范机制,分配不同的名字空间以防替代本地的同名类,并包含安全管理机制。

1.1.5 Java 用途

1、Android 应用

许多的 Android 应用都是由 Java 程序员开发者开发。虽然 Android 运用了不同的 JVM 以及不同的封装方式,但是代码还是用 Java 语言所编写。相当一部分的手机中都支持 Java 游戏,这就使很多非编程人员都认识了 Java。

2、在金融业应用的服务器程序

Java 在金融服务业的应用非常广泛,很多第三方交易系统、银行、金融机构都选择用 Java 开发,因为相对而言,Java 较安全 。大型跨国投资银行用 Java 来编写前台和后台的电子交易系统,结算和确认系统,数据处理项目以及其他项目。

3、网站

Java 在电子商务领域以及网站开发领域占据了一定的席位。开发人员可以运用许多不同的框架来创建 Web 项目,如 MyBatis、Spring 全家桶。

4、嵌入式领域

Java 在嵌入式领域发展空间很大。是指各种小型设备上的应用,包括机顶盒、车载的大屏影音娱乐设备、POS 机等。在这个平台上,只需 130KB 就能够使用 Java 技术。(在智能卡或者传感器上)

5、大数据技术

Hadoop 以及其他大数据处理技术很多都是用 Java,例如 Apache 的基于 Java 的 HBase 和 Accumulo 以及 ElasticSearchas。

6、框架

解决企业应用开发的复杂性,让开发更加方便。

7、软件

制作小游戏、开发工具 IDE 。

1.2 JDK 下载

内容导视:

  • JDK 与 JRE 的区别
  • JDK 下载与安装
  • 如何卸载
  • 如何禁止 JDK 检查更新

即使编写了 Java 源代码,系统也无法直接执行,需要 JDK 提供编译和运行 Java 程序的环境,将代码解释为系统可识别的机器码。

1.2.1 JDK 与 JRE 的区别

JRE(Java Runtime Enviroment):是 Java 的运行环境。面向 Java 程序的使用者,而不是开发者。

如果你仅下载并安装了 JRE,那么你的系统只能运行 Java 程序。JRE 是运行 Java 程序所必需环境的集合。它包括 JVM(虚拟机)、Java 平台核心类库(如 rt.jar)和支持文件。它不包含开发工具(编译器、调试器等)。

JVM(Java Virtual Machine):Java 虚拟机。是整个 Java 实现跨平台的最核心的部分,能够运行以 Java 语言编写的程序。其中的虚拟机屏蔽了底层运行平台的差别。

JDK(Java Development Kit):是 Java 开发工具包,它提供了 Java 的开发环境(提供了编译器 javac.exe 等工具,用于将 java 文件编译为 class 文件)和运行环境(提供了 JVM 和 rt.jar 即 Runtime 辅助包,用于解析 class 文件使其得到运行)。

如果你下载并安装了 JDK,那么你不仅可以开发 Java 程序,也同时拥有了运行 Java 程序的平台。JDK 是整个 Java 的核心,包括了 JRE 和 开发工具 jar 包,如 tools.jar。

核心类库:主要是开发经常使用的类库,避免重复造轮子。如 java.lang 下的 String、包装类等,已经被编译成了 .class 文件,需要时直接拿来用,不用自己重新写一份。

JDK > JRE > JVM

如果你只是想运行 Java 程序,就只安装 JRE 即可。

1.2.2 JDK 下载与安装

有 JDK7、8、11,通常使用的是 JDK8、11,因为它们是长期支持版本,一般的版本支持半年就不再显示。此时的你点开链接,说不定已经看不到 JDK7 了。

LTS 代表长期支持的版本。

产品支持的三个策略:https://blog.csdn.net/iteye_21199/article/details/82305640

JDK8 扩展支持到 2030 年,将每三年指定一个版本作为长期支持版本。

查看自己电脑位数

x86 是 32 位,x64 是 64 位。

打开文件资源管理器,右键此电脑属性查看系统类型是 64 位操作系统,还是 32 位。

根据自己的系统、位数决定下哪个

比如我的电脑是 windows 系统 64 位,我使用的是 JDK8,按图选。

特别说明

需要自己创建账户,若不想可在网上搜索 JDK8 下载,或下载最新版本,此时是 JDK16,下载 zip 和 exe 格式的都行。我将网盘链接放在了资源地址这章中,需要自取。

安装

如果下载的是 exe 文件,直接双击,指定安装目录,一直下一步,就安装成功了;

(安装后我又卸了,使用了 zip,所以地址前后不一致)

是 zip 解压即可,点击解压后的文件夹,地址栏上显示的就是安装目录,要看到 bin 和其它目录,如图:

认为安装目录是 D:cqh_environmentJava 就错了。

记住 JDK 的安装目录,配置环境变量要用

安装好后,看看目录:

bin 目录存放命令,如常用的 javac.exe、java.exe,用于编译,运行程序。

lib 存放着 jar 包,如 dt.jar 是运行环境类库,存放了 Swing 组件;tools.jar 是工具类库,用来编译与运行 java 文件。

src.zip 存放着 Java 源代码压缩文件。

rt.jar 在 jrelib 中。

解释

我们编写源代码使用的文件后缀为 .java,这种 .java 文件经过编译生成 .class 文件,多个.class 打包放在 .jar 包中。

1.2.3 卸载

呃,这只是教你如何卸载,并不是现在让你卸载…

打开控制面板/卸载程序,找到 Java。

或者打开 Windows 设置/应用/应用和功能,单击要删除的软件,会弹出卸载字样。

如果你不知道如何打开它们,请用百度搜索,如如何打开 Windows 设置;其实由很多问题都已经得到回答,没必要重复造轮子。学会使用搜索,对自学很有帮助。

卸载成功后,所有目录名带 Java、Sun 的一律删掉,如:

删除安装 JDK 的目录、删除 C:Program Files (x86)Common FilesC:Program Files 下的的 Java 目录、C:Users用户名AppDataLocalLow 下的 Sun 目录、C:Users用户名AppDataRoamingSun

1.2.4 禁止 JDK 检查更新

这是可选项,不是必须要做的,因为我觉得时不时弹出来像牛皮癣一样挺烦。

打开控制面板/程序/Java,取消勾选自动检查更新,不检查;

高级/应用程序安装/从不安装。

1.3 编写代码前的准备工作

如果你是什么都不懂的新手,请别慌着写代码,还有如下几件事要做:

内容导视:

  • 为何要写笔记
  • 使用什么软件编写源代码
  • 练习双手打字
  • Windows 10 系统常用的快捷键
  • 给初学者的一点建议

1.3.1 为何要写笔记

为了对抗遗忘,可以快速回顾、促进理解、加深记忆,将知识有条不紊地归类,提炼反思应用。

不建议使用纸质的笔记,记录麻烦,不方便携带,有老化被撕毁的风险,摘抄代码时不能 Ctrl C 快速复制粘贴。

推荐使用 Typora 软件、博客、等各大网站记录。

1.3.2 编写源代码使用的记事本

工欲善其事必先利其器,使用系统自带记事本编写程序,按下 Tab 缩进一大节,逼得我每次使用 4 个空格,回退也难;关键字没有颜色,不易于识别与查看。

下面介绍几个更好的工具,安装后,右键文件选择打开方式即可。

EditPlus

建议网上搜下汉化版的,下面是官方的收费的。

下载页面:https://www.editplus.com/download.html

有 30 天的试用期,过后要购买许可证。

Notepad

下载页面:https://notepad-plus.en.softonic.com/download

Download 就是下载的意思。

如何设置主题

设置/语言格式设置/选择主题,此外还可以根据不同语言设置样式。

Sublime Text

官网:https://www.sublimetext.com/

Visual Studio Code

官网:https://code.visualstudio.com/

Atom

官网:https://atom.io/

不能指定安装目录;这种是以项目的方式管理文件。

也可以搜索一下其他的文本编辑器,看哪款适合你。

编写代码

打开刚刚下好的软件,输入源代码,最后 Ctrl S 保存,另存为 First.java。但是现在还不到写代码的时候,下一章好吗?

1.3.3 练习双手打字

一个指头敲字,一边看键盘,一边看输入的代码,很容易出差错。

既然选择了在电脑上打字,就要提高自己的指法速度,敲代码和写笔记才会快,两只手共同配合。

不用担心,我也这么走过来的,虽然一开始没有单只手指头快,但坚持下来,不看键盘,手势正确,打字速度会有明显的提升。

推荐使用金山打字通。

下载页面:http://www.51dzt.com/

从第一步,跟着图中手势位置慢慢打,差不多跟着敲一个星期,就基本实现盲打了。

页面上有金山打字通的下载,点击下载。

下载好后,双击执行 exe 文件,安装界面会跳出是否安装其它软件,根据自己需要确认是否勾选。

安装好后点击新手入门,练到不用看键盘,打字速度超过 30 ~ 60 字/分钟差不多够用了。(只需练习英文部分即可)

1.3.4 Windows10 系统常用快捷

掌握常用的快捷键,能够极大地提升效率,节省时间。

如果是有触摸板的笔记本电脑。单击是鼠标左键,双击是鼠标右键。

请打开 windows 设置/设备/触摸板查看:(Windows i 打开设置)

下面是我总结的常用几个快捷键。如 Ctrl A,在电脑键盘上找到这两个键,同时按下去即可触发全选操作。

如果打不出中文,怀疑是按 Caps Lock 开启了大写或者连续按下 Shift 启动了粘滞键,再次按下此键即可恢复。

提前说明:

Ctrl 指同时按下 Ctrl、 这个键,别看见两个加号就懵了。

文本相关

先选中文字,Windows 键是 Alt 左边的

内容如下:

  • 常用的粘贴、选中、删除文字的快捷键
  • 翻页、浏览文字的快捷键
  • 切换输入法、中英转换

操作

快捷键

跳过单词

Ctrl 左右箭头,可配合 Shift 使用选中文字

选中文字

Shift 箭头、Shift Home/End/Pgup/Pgdnd

复制

Ctrl C

粘贴

Ctrl V

全选

Ctrl A

撤销

Ctrl Z

查找

Ctrl F

替换

Ctrl H

删除文字

Del、Backspace

上翻

Pgup Pause

下翻

Pgdn Break

行首

Home

行尾

End

页首

Ctrl Home

页尾

Ctrl End

切换当前语言下的输入法

Shift Ctrl

切换输入法

Windows 空格

中英文切换

Shift、Ctrl 空格

切换语言

Shift Alt

热键相关

若桌面崩了,使用快捷键打开任务管理器,运行新任务,输入 explorer 后回车。

内容如下:

  • 创建文件、查看文件属性
  • 切换窗口,窗口最大化、最小化
  • 切换桌面,查看桌面
  • 截屏
  • 放大镜
  • 快捷方式打开应用、资源管理器

有的快捷键按下去时讲究先后顺序。

例:如 Alt Tab ,先按住 Alt 键不要松,再按 Tab,有先后顺序(同时按也行),自己试试就知道我在讲什么了。

← 指的是左箭头。

说实话我向来很反感背知识,随用即取就行。但是那面试题人人都背,你不看看,万一被难倒了怎么办?算了不考虑这些,下面这些快捷键你只看看经常使用的即可。

操作

快捷键

改变桌面图标大小

按住 Ctrl 鼠标滑轮滚动、触摸板两指缩放

将文件放入回收站

Ctrl D 、 Del

永久删除文件

Shift Del

创建文件夹

Alt 2

查看当前文件属性

Alt 1

所有窗口最小化

Windows D 、 Windows M 、三指下滑

所有窗口最小化又还原

双击 Windows D 、三指下滑又上滑

当前窗口最小化

Windows ↓

当前窗口还原、最大化

Windows ↑

查找文件

Alt 空格

浏览器打开新的标签页

Ctrl T

浏览器查看下载文件

Ctrl J

浏览器当前页面静音

Ctrl M

浏览器切换页面

Ctrl 数字、 Ctrl Tab (Shift)、 Ctrl Pgup 和 Pgdn

打开新的窗口

Ctrl N

使当前窗口失去焦点,图层置于底下

Alt Esc

打开任务管理器

Ctrl Shift Esc

锁屏

Windows L

关闭文件

Ctrl W

强制关闭文件

Alt F4

关机

Alt F4

打开文件资源管理器

Windows E

将焦点定位到地址栏

Alt D 、 F4

后退

Alt ←、 Backspace

前进

Alt →

返回上一级

Alt ↑

在窗格、功能区域之间切换

F6

重命名

F2

切换至下一个,配合 F2 有奇效

Tab

有些快捷键再加上此键,实现逆向选择

如 Shift Tab

即时切换应用

按住 Alt 不要松开单击 Tab 、三指左右滑动

来回切换引用

同时按下 Alt Tab

切换应用

Alt Ctrl Tab 松开,单击 Tab 选择应用后回车

刷新

F5 、 Ctrl R 、 Ctrl F5

同一应用不同窗口切换

Ctrl Tab

浏览器不同窗口切换

Ctrl Pgup Pause 、 Ctrl Pgdn Break

创建新桌面

Ctrl Windows D

关闭新桌面

Ctrl Windows F4

查看已有桌面

Windows Tab (再按还原)、三指上滑(下滑还原)

切换桌面

Windows Ctrl 左右箭头

两个应用分屏

Windows ←、 Windows →

放大缩小屏幕

Windows 加 /-

浏览器放大缩小

Ctrl 加 /-

打开/关闭管理通知

Windows A

打开 Windows 设置

Windows i

锁定、切换用户、注销、打开任务管理器

Ctrl Alt Del

截屏

1)快捷键打开截全屏的工具

Windows W

2)区域截屏

Windows Shift S

若点击了截图,照片会在 C:Users你的用户名AppDataLocalPackagesMicrosoft.ScreenSketch_8wekyb3d8bbweTempState 下保存。

3)截全屏

Windows PrtScSysRq

PrtScSysRq 键在 F12 右边,保存的图片在 C:Users自己的用户名PicturesScreenshots 下。

PrtScSysRq

打开画图工具,Ctrl V 将截屏捕捉。

4)截屏,范围限制在当前工作页面(得到焦点的页面)

解释,比如你打开了 QQ,正在使用它聊天,按下了这个快捷键,只会截 QQ 界面。

Windows Alt PytScSysRq

5)录屏,范围限制在当前工作页面

Windows Alt R

捕获的图片和视频在 C:Users用户名VideosCaptures 里。

6)游戏栏工具

Windows G

Alt

打开软件,按一下 Alt ,会有字符提示,并且将焦点定位到菜单栏,此时可按左右键切换功能区,上下(不行就 Enter 回车)键打开功能区。

字符提示会显示出功能的快捷键,例:文件功能区会显示出 F ,代表只需要 Alt F 就可以打开此功能,弹出的下拉列表一般也有字母提示,按下对应字母即可。(有时需同时按下 Alt )

总结: Alt 划下划线的字母,可以快速打开菜单。

快速启动任务栏上的软件

你看看你的任务栏(屏幕的最下方),打开应用后可以右击任务栏上的应用图标,将其固定到任务栏,下次直接单击此图标就可以打开应用。或者 Windows键 数字,比如

浏览器在任务栏的第 1 个位置,只需 Windows 1 就可以打开。或者 Windows T,左右箭头选择后回车。

1.3.5 给初学者的一点建议

我希望你能后来居上,分享你的经验让我开开眼界。

下面是本人经过大量时间总结的经验,但你可以不看,因为没有什么规则可以量身定制。

1、约束好奇心,停止收藏资源

我直接说,你是学到死都学不完的。

资源无穷尽也。不要看到什么都想学,什么都想买,一直在搜,知识太多,你学不过来的。你先在网上搜索,比如后端的整套知识点,按顺序来,一心一意,一套教程为主,有疑惑的再去别的地方比对。不要没事就搜索一大堆资料收藏,又不开始,资料一定要精简,那些看上去有用的知识但短期用不上的,直接取消收藏(也包括我)。等你到了这步,再找资源,别做松鼠。

关于难度高的,可以先跳过,记录下来,后面再补上,比如数据结构、JVM 底层、多线程与高并发、GUI 等等…别把初学时间浪费在这上面,这些东西都是唬人放弃的。

不要背代码,要掌握原理,方法可以到 API 文档上查。之前基本都是概念上的东西,理解就好了,但学到集合、IO、常用类如 String,只背方法名一定会消灭你学习的兴趣。

这东西是一回生二回熟,第一遍不要想着要弄的多明白,简单过一下即可。下次复习的时候,无师自通,我敢说人就是最强的智能机器人。

至于看视频还是阅读书籍,我感悟如下:

视频时间看完所需时间更长,但可以一步步来,如果章节内容划分合理,每个视频时长合适,学习者更轻松完成每个目标,掌握自己的进度。适合初学者。

书籍花费时间较少,但经常有断节之处,初学者搞不明白缺少哪一个环节,看着晦涩难懂的文字,翻不了几页就草草放弃,适合耐得住性子的人。

2、管理好精力

人一天能够利用的时间极其有限,所以要学会合理分配精力。学习并不是生活的全部,要参与家务,如果你整天扑到学习上,只会感动自己。随着精力的消耗,自控力的减弱,一定会在某天突然崩掉,开始变得什么都没有兴趣,行动力拉到最低,即使强迫在学,也只是枯坐原地,享受着左耳进右耳出的枯燥感。

早起别熬夜,每天一定留至少 30 分钟的时间午睡,为了第 2 天的精神良好。学习时推荐使用番茄钟,每过半小时就休息一小会,合理分配精力。(休息时不要看电子产品与动脑筋,要适当远眺)

3、学会分享

不要闭门造车,要敢于发在各大网站上分享,Markdown 语法我会在下节中讲到,你学会了,注册个号,把笔记直接复制粘贴,发在博客网上;不要觉得自己技术菜。理由如下:

  1. 人人都有开始,你发出来了,别人才能纠正你的错误,避免成为井底之蛙。
  2. 你又开始自耗了,不停地在脑海天人交战,一顿脑补:会不会万一发出来被人嘲笑怎么办?…于是藏着掖着,生怕别人知道,出丑;事情还未做,就想一系列的后果,别人有多可恶。我觉得世上还是好心人多,当然不要被零星几个恶评就忽略了大多数支持你的人,这么大的林子总会有几个脑残。
  3. 百分之 99.9 的人根本刷不到你的文章,或者一下就 × 过去了,即使刷到了,那还有 9.9 成人浏览刷的一下就关了,评论的那是少之又少,凤毛麟角。
  4. 对于四处搜索资源的人,是没有精力留下痕迹的,没有用的直接毙掉,有用的看完理解后也直接毙掉;这么快节奏的生活,没人关心你是谁,最多充当局外客。当你还在纠结别人的看法时,纠结要不要做时,别人根本记都不记得你。我们在网络时代那是十分渺小,沧海一粟,很快被淹没,就算有弄潮儿掀起了几朵浪花,也会很快平息,所以别再纠结丢不丢脸了。
  5. 帮助别人就是帮助自己。虽然这个地球少了谁都能转动,但我愿意相信天生我材必有用,自己的不可替代性。
  6. 你已经落后别人太多了,得到的都不是最新的知识;不要求自己跑的更快,但是也要有行动的勇气吧,就算有 1000 个人从众笑你、反对你,我也不会笑你,只会支持你,为你的敢于行动喝彩。
  7. 或者你担心教会了徒弟饿死了师傅,认为自己凭什么白白让别人分享自己的辛苦所得,让那些白嫖怪轻而易举获取到所有。 呃,我也不反对你,曾经的我认为那些动不动说要分享,文章标题、内容弄得很吸引人;结果在文章底部放了个二维码,说要关注才能获取验证码与资源,我一向嗤之以鼻,这不就是引流吗,能赚多少钱啊?但是现在觉得别人有权力这么做,没有人必须无偿满足你,因为用爱发电,得不到利益,很容易让人寒心。既然付不了金钱,就只能搭进时间和人脉,等价交换而已。 对于那些开源的人,要不是他们的分享,让我窥见一斑,那我现在应该不在家,而是进厂做流水线去了,是不会发文章的,或许抱怨这个世界不公平。所以再次感谢开源的人,感谢你们的无私奉献,你们就是一道光,照亮被淘汰看不见希望的我,至于我的信念就从此转变为萤火虫也可与日月争辉。(不禁想起了一句话:为众人抱薪者,不可使其冻毙于风雪;为大众谋福利者,不可使其孤军奋战;为自由开路者,不可使其困顿于荆棘)很抱歉我现在捉襟见肘,无法回馈你们。 说实话,现在当我使用手机、电脑、冰箱、自来水等一切产品时,都会惴惴不安,一是因为怕现在习惯了离不开了,但是不了解底层原理,要是他们以后技术垄断,坐地起价…;二是当我还在感叹新技术新发展新气象,日新月异,这些东西如此方便快捷,被制作被运送,傻瓜都能轻松使用。但是到底以牺牲了多少人的自由空暇为代价,令他们如同机械一般麻木,我们却理所当然,嘻嘻哈哈,嘲笑着都是因为不努力,教导下一辈不要学他们,要成为人上人…扪心自问,真的能够心安理得使用吗?平等或许只是伪命题。

4、承认自己的不完美

人无完人,总有顾及不到,犯错的时候。想做就直接放手干,不要计划地那么周全,稍微一有变动,就放弃目标,想明天再做。是吧,别觉得只有从容不迫、不慌不忙、按部就班地才叫做事,而达不到自己的心理预期就不做了,大多数人都是计划赶不上变化,被搞得灰头土脸的。

人是一种很奇怪的生物,我把人称为石头,有 1 就有 2。当难度设定太高,有一次累了没去执行,那么最后结局就是放弃。我就改变思路,将难度设定为合适、简单。还是如此,不管之前坚持了多少天,只要有一次意外,没做,结局还是放弃。

结论:没有外力时,一直滚动;有外力一碰,就停了;结论:维持当前状态,会被外力改变。

但是在滚动的过程中,会磨去棱角,那么下一次进入相同的环境,会很容易滚落下去,很难控制。所以每一次尝试,都是为下一次作铺垫,不要认为失败就是无用功。

5、调整心态(找准目标)

如果你学这个只是为了找工作,那么你一定会很痛苦。为了以后不再工作而工作,为了以后享福而选择现在吃苦(为了不再吃苦而吃苦),为了将来而牺牲现在;这种矛盾的做法,并且大部分人实现不了财务自由,如果你只靠出卖自己的时间换来金钱的话。

你想得又得不到,或追赶不上前面的事物,你会处于十分焦虑的状态。你真想财务自由,那么就要垄断其他人的时间,给自己带来利益(用金钱换他们的时间,创造价值收入囊中),或者搭上顺风车。

但我不一样,我写这个,并不奢求得到回报,因为我写这个同时,我就很满足了。

但也不要担忧,如果企业家全都使用机器人或者雇很少的人,短时间的确能够让利润增加,因为减少了给员工那一项的支出;但是员工既是生产者也是消费者,如果他们没有时间买或者没有钱买,就算降低商品的价格,但为了有利润可赚,员工的工资也会降,那就更没有钱买,继续降低商品价格…如此反复,就倒闭了;所以他们是不会让穷人更穷的。

(我只是安慰你,这些玩意早被研究透了,说不定命运都被安排的明明白白)

6、相信自己

可你也与我有着同一样的感受,为什么这些大佬如此牛逼,而自己什么都看不懂,不能理解,沮丧睡不着觉。我觉得这不是你的问题,而是每个人的必经之路。希望你能够坚持下来,即使在人生最黑暗的时候也能与本心融为一体,认同自己,一起冲向光明;最后祝你学业有成,找个好饭碗。

7、选择城市

之前聊天时,问到了这个问题:去大城市还是小城市发展?然后又说小城市容不下灵魂、大城市容不下肉身。其实我都没有工作,村里人都知道我是游民,我给不了什么实质性的意见。

哈哈,没关系,任何一个选择都有得有失,你看看代价与风险是否自己能够承受:是接受安稳,被人看扁;还是避开喧嚣之地,舍命一拼,打下一片未来;就看你怎么选了。

说到底,被人欺,与老不老实无关,而是与实力相关;假如你不讨喜,没有什么朋友,与他人的联系几乎没有,有你没你一个样,未来也不可期;你无法变现自己的价值,别人凭什么要帮你,给你留一点蛋糕?另外一点,别人也无法以你为桥,认识更多有价值的人,那么纯粹是浪费时间。

当出现不是让所有人都满意的结果时,别人权衡利弊后觉得你很好欺负,得罪你的代价可以承受,你没有价值,削去你的利益,事卡着不给你办,或者祸水东引,反正你也掀不起大浪。

实力不够,人间处处是地狱。不想融入阻扰了别人利益,被排外,没有晋升的机会。你佯装融入,等你实力终于够了,你也已经同化成其中一员,将曾经的憋屈发泄,迫害如同当年的像你一样的人,十分地爽,开始心安理得,阻扰那些想要发声的人,觉得凭什么我受而你们不用受,心理不平衡,主动维护旧有秩序。

8、没有绝对正确的理论

给出一个貌似符合常理的结论,有人举出反例,然后结论被推翻,再重新给出符合此反例的新的结论,不停周而复始…

如果这个结论目前还未被推翻,就暂时当作正确的吧,不需要怀疑一切,那样会很累的;我的知识体系到处东拼西凑,别人说什么如果验证不出来,就分不清真假,只能暂时当成对的。

1.4 Typora 软件使用

简洁、功能强大、实时预览的 md 编辑器。

1.4.1 下载与安装

下载地址:https://www.typora.io

往下翻,点击 Windows(我的是 Windows 系统 64 位),点击 Donwload Beta(x64),就会自动下载;

双击下载好的 .exe,

指定安装位置,

下一步 next,

选中复选框代表创建桌面快捷方式。

1.4.2 如何创建 Markdown 文件

创建以 .md 结尾的文件,如 test.md,鼠标右键新建/文本文档,双击打开发现怎么还是记事本?

打开文件资源管理器,把文件扩展名和隐藏的项目打上对勾,就可以看到隐藏的后缀和文件夹如 AppData;

此时刚刚创建的文件显露真身,原来还是 txt 文件;右键重命名,把 .txt 去掉,再双击点进去。

1.4.3 常用的 Markdown 语法

此软件使用的是 Markdown 语法,一种纯文本格式的轻量级标记语言。通过简单的标记语法,它可以使普通文本内容具有一定的格式。

md 语法的出现不是为了替代 html,而是更方便书写。如果让我写那么多的 <>,不停思索如何嵌套,写一大堆长长的 css,我会疯掉的。

这款软件它可以你更加关注内容,而不是注意怎么摆弄格式。Word 是边写边在上面的边栏调字体大小、颜色、格式,很不方便。

内容如下:

  • 字体格式:如标题、斜体、加粗
  • 跳转链接:如超链接与图片
  • 内容排列:如表格、有序无序列表、各种图表、分割线

标题

一个 # 空格,跟上标题内容即可。(Ctrl 1 是一级标题,以此类推)

代码语言:javascript复制
# 我是什么人
## 我是第2种人

一个 # 是一级标题,两个 # 是二级标题,依此类推,直到 6 级标题。(越来越小)

复选框

一个减号 空格 [ ] 空格

代码语言:javascript复制
- [ ] 锻炼
  • 锻炼,可以点击就能打上对勾。

粗、斜、斜加粗等字体

1、被两个星号包裹的字自动变粗(Ctrl B);

代码语言:javascript复制
**我是粗**

我是粗

2、被一个星号包裹的字是斜体(Ctrl i);

代码语言:javascript复制
*我是斜*

我是斜

3、被 3 个星号包裹的字是粗斜;

代码语言:javascript复制
***粗斜体***

粗斜体

4、Tab 上面有一个键,按住 Shift,再按住它,可以打出 ~。

代码语言:javascript复制
~~废弃~~

废弃

引用

大于号 空格 内容

代码语言:javascript复制
> 摘抄自大文豪张三的一句话

摘抄自大文豪张三的一句话

键盘风格

被成对的 kbd 标签的内容。

代码语言:javascript复制
<kbd>ctrl</kbd>

ctrl c是复制

超链接和图片

这些地址就是网址。

代码语言:javascript复制
![图片名](图片地址)
[超链接名](超链接地址)

百度(右击打开链接或按住 Ctrl,再单击此链接)

表格

Ctrl T 快捷键创建表格,Ctrl Enter 添加新行,Shift Ctrl Del 删除一行。

代码语言:javascript复制
名称|性别|生日
--|--|--
赵三|男|1213.2.1

名称

性别

生日

赵三

1213.2.1

代码

单行使用 `,多行三个 `,指定代码语言:

代码语言:javascript复制
`单行代码`
```java
多行代码
```
```javascript
//实际写法var foo = 'bar';
```

单行代码

代码语言:javascript复制
多行代码
代码语言:javascript复制
//实际写法var foo = 'bar';

列表

1、无序列表

单个星号 空格 内容

代码语言:javascript复制
* 语文
* 数学
* 英语
  • 语文
  • 数学
  • 英语

2、有序列表

数字. 空格 内容

代码语言:javascript复制
1. 起床
2. 刷牙
3. 吃饭
  1. 起床
  2. 刷牙
  3. 吃饭

3、列表套列表

代码语言:javascript复制
* 起床  
    * 睁开眼睛  
    * 我是沙福林
* 刷牙
  • 起床
    • 睁开眼睛
    • 我是沙福林
  • 刷牙

大纲

可以把标题列出来,即 # 后的内容。

代码语言:javascript复制
@[toc]

分割线

三个减号 回车(Enter)


以下内容不需要了解,几乎不用,有很多网站不支持这种语法。

甘特图

代码语言:javascript复制
```mermaid
gantt
        dateFormat  YYYY-MM-DD
        title 这是标题,上面是日期格式年月日
        section 计划表
        准备行李(已完成)               :done,    des1, 2014-01-06,2014-01-08
        买机票(进行中)               :active,  des2, 2014-01-09, 3d
        拍照(计划)               :         des3, after des2, 5d
```

Mon 06 Mon 13 准备行李(已完成) 买机票(进行中) 拍照(计划) 计划表 这是标题,上面是日期格式年月日

UML图表

代码语言:javascript复制
```mermaid
sequenceDiagram
张三->> 李四: 你好!李四, 最近怎么样?
李四-->>王五: 你最近怎么样,王五?
李四--x 张三: 我很好,谢谢!
李四-x 王五: 我很好,谢谢!

李四-->>张三: 打量着王五...
张三->>王五: 很好... 王五, 你怎么样?
王五->>张三: 不好
```

#mermaid-svg-uTXHmHmsKShHARwk {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uTXHmHmsKShHARwk .error-icon{fill:#552222;}#mermaid-svg-uTXHmHmsKShHARwk .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-uTXHmHmsKShHARwk .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-uTXHmHmsKShHARwk .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-uTXHmHmsKShHARwk .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-uTXHmHmsKShHARwk .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-uTXHmHmsKShHARwk .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-uTXHmHmsKShHARwk .marker{fill:#333333;stroke:#333333;}#mermaid-svg-uTXHmHmsKShHARwk .marker.cross{stroke:#333333;}#mermaid-svg-uTXHmHmsKShHARwk svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-uTXHmHmsKShHARwk .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uTXHmHmsKShHARwk text.actor&gt;tspan{fill:black;stroke:none;}#mermaid-svg-uTXHmHmsKShHARwk .actor-line{stroke:grey;}#mermaid-svg-uTXHmHmsKShHARwk .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-uTXHmHmsKShHARwk .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-uTXHmHmsKShHARwk #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-uTXHmHmsKShHARwk .sequenceNumber{fill:white;}#mermaid-svg-uTXHmHmsKShHARwk #sequencenumber{fill:#333;}#mermaid-svg-uTXHmHmsKShHARwk #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-uTXHmHmsKShHARwk .messageText{fill:#333;stroke:#333;}#mermaid-svg-uTXHmHmsKShHARwk .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uTXHmHmsKShHARwk .labelText,#mermaid-svg-uTXHmHmsKShHARwk .labelText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-uTXHmHmsKShHARwk .loopText,#mermaid-svg-uTXHmHmsKShHARwk .loopText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-uTXHmHmsKShHARwk .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-uTXHmHmsKShHARwk .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-uTXHmHmsKShHARwk .noteText,#mermaid-svg-uTXHmHmsKShHARwk .noteText&gt;tspan{fill:black;stroke:none;}#mermaid-svg-uTXHmHmsKShHARwk .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uTXHmHmsKShHARwk .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uTXHmHmsKShHARwk .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-uTXHmHmsKShHARwk .actorPopupMenu{position:absolute;}#mermaid-svg-uTXHmHmsKShHARwk .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-uTXHmHmsKShHARwk .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-uTXHmHmsKShHARwk .actor-man circle,#mermaid-svg-uTXHmHmsKShHARwk line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-uTXHmHmsKShHARwk :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 打量着王五… 很好… 王五, 你怎么样? 不好 张三 李四 王五

流程图

代码语言:javascript复制
```mermaid
graph LR
A[长方形] -- 链接 --> B((圆))
A --> C(圆角长方形)
B --> D{菱形}
C --> D
```

#mermaid-svg-39K443dhZb9EDjHB {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-39K443dhZb9EDjHB .error-icon{fill:#552222;}#mermaid-svg-39K443dhZb9EDjHB .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-39K443dhZb9EDjHB .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-39K443dhZb9EDjHB .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-39K443dhZb9EDjHB .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-39K443dhZb9EDjHB .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-39K443dhZb9EDjHB .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-39K443dhZb9EDjHB .marker{fill:#333333;stroke:#333333;}#mermaid-svg-39K443dhZb9EDjHB .marker.cross{stroke:#333333;}#mermaid-svg-39K443dhZb9EDjHB svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-39K443dhZb9EDjHB .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-39K443dhZb9EDjHB .cluster-label text{fill:#333;}#mermaid-svg-39K443dhZb9EDjHB .cluster-label span{color:#333;}#mermaid-svg-39K443dhZb9EDjHB .label text,#mermaid-svg-39K443dhZb9EDjHB span{fill:#333;color:#333;}#mermaid-svg-39K443dhZb9EDjHB .node rect,#mermaid-svg-39K443dhZb9EDjHB .node circle,#mermaid-svg-39K443dhZb9EDjHB .node ellipse,#mermaid-svg-39K443dhZb9EDjHB .node polygon,#mermaid-svg-39K443dhZb9EDjHB .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-39K443dhZb9EDjHB .node .label{text-align:center;}#mermaid-svg-39K443dhZb9EDjHB .node.clickable{cursor:pointer;}#mermaid-svg-39K443dhZb9EDjHB .arrowheadPath{fill:#333333;}#mermaid-svg-39K443dhZb9EDjHB .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-39K443dhZb9EDjHB .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-39K443dhZb9EDjHB .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-39K443dhZb9EDjHB .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-39K443dhZb9EDjHB .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-39K443dhZb9EDjHB .cluster text{fill:#333;}#mermaid-svg-39K443dhZb9EDjHB .cluster span{color:#333;}#mermaid-svg-39K443dhZb9EDjHB div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-39K443dhZb9EDjHB :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}

链接

长方形

圆角长方形

菱形

1.4.4 常用的设置

内容如下:

  • 常用的快捷键:如加粗、标题、表格等
  • 更改风格:如字体颜色、样式,显示代码行号
  • 将笔记导入导出
  • 支持数学符号

因为都是中文,只讲一点点,剩下的自己在菜单栏上研究吧。

快捷键

直接点击菜单栏,查看快捷方式,如点击视图、段落,上面显示了快捷方式更方便触发;或者按住 Alt O,即可打开格式:如 Ctrl B 是加粗的快捷键,Ctrl 是清除样式,Ctrl T 是创建表格的快捷方式,Ctrl / 是查看源代码,Windows 句号是表情符号、视图可以放大、缩小…

段落/YAML Front Matter(前言),有些博客需要这些属性值获取信息。

主题

Alt T 选择自己想要的主题。

偏好设置

Ctrl ,

如通用的自动保存选上,每次修改自动保存,不用按下 Ctrl S。

高级模式选中调试模式,关闭文件后重新打开,右键检查元素(或 Shift F12),会发现此软件就是一个浏览器,(浏览器按住 F12 键,会打开开发者模式,与这差不多)我们看到的笔记,实际是 md 语法被解析后生成的 HTML 标签与 CSS 相配合展现的页面;现在你再看看 md 语法到底有多方便了吧,这些标签要你自己写该多麻烦。

代码块显示行号

Markdown,将显示行号复选框勾选。

代码语言:javascript复制
你看左边的1
你看左边的2    

更换主题

学了 CSS 后,再来。

之前创建 md 文件时,给隐藏的项目了打上对勾,代表显示隐藏的项目。其中 AppData 就是隐藏的项目,一般存放软件的配置文件。

C:Users你的用户名AppDataRoamingTyporathemes 下的几个 CSS 文件代表着不同的主题,如果不满意页面样式,可以修改对应主题 CSS(记得留个备份)或自定义 CSS,重新打开笔记后,可以在主题中看到你的 CSS,随便更换。

补丁:蓝色背景下的 gif 动图字体会模糊,必须在纯色红或白色背景下,gif 动图字体才会清晰,所以取消动图的使用。

将笔记转成其他类型的文件

文件/导出,

PDF、HTML 等类型的都行,(without styles 是不带样式即没有 CSS 修饰,自己试试就知道区别了)

或者打开浏览器,使用打印功能(Ctrl P),无渲染与解析,很差劲。

支持数学公式

显示常用的数学符号。(当内联公式过多,可以考虑使用

某字母

代码语言:javascript复制
$$
in
$$

∈ in ∈

常用的的数学符号写法:

  • 作者:DaneAI,https://blog.csdn.net/happyday_d/article/details/83715440
  • 作者:韩湘,https://blog.csdn.net/qq_38228254/article/details/78515800
  • 作者:白白旧维,https://www.cnblogs.com/1024th/p/11623258.html
  • 作者:樱花赞,https://blog.csdn.net/weixin_43444930/article/details/119791074

恢复未保存的文件

打开偏好设置,点击恢复未保存的草稿。

1.4.5 官网打不开的原因

它升级到了 1.0 版本了!收费了。

不要惊讶,能够开源一定要有其它稳定的收入作为支撑;否则没钱,功能不会太强大,作者都快饿死了,当然没有功夫贡献自己的力量,进行频繁更新,跟上时代。

Typora 代理商:https://typoraio.cn/

最后一个免费版,分享者:王炳明,https://wwe.lanzoui.com/i8PP3wzahrg

其实从来都没有说过免费,之前只是 Beta 测试版,类似于游戏中的公测吧,也不知道免费版什么时候就“关服”了。

作为一个即时渲染,所见即所得,按下 Ctrl / 就可以看源码,简洁实用,早已习惯,离不开它了。其它的软件花里胡哨,什么功能都往里面加,试图想代替其它同类型的软件,结果搞得不伦不类,十分臃肿。

像其它 md 编辑器,大部分都是双栏丑丑的大屏幕,十分占空间,并且滚动内容时,左右视图不一致,还得分心同时看两边,真的是种折磨。应该让软件配合人,而不是让人记住软件的用法,主次关系要分清;真希望以后能够统一,有个规范,其它软件实现就可以了。

如果下载的是收费版,记得打开偏好设置/通用,将 Typora 服务器使用国内服务器复选框勾选一下,怕连不上服务器,激活不了此软件。

1.4.6 自动上传图片

你如果使用久了,经常在网上发布文章,一定会遇见这个问题。

把写好的 md 文件,复制粘贴到博客园中。结果你发现图片加载不出来,一看地址,C:Users自己的用户名AppDataRoamingTyporatypora-user-imagesxxx

这才知道原来图片被保存到了本地中,也难怪网上读取不到。那么你发现了,将图片直接拖拽到博客园的编辑页面,会自动生成网络上的 URL,可以在全网都能访问到。

但是时间长了,一张、一张拖拽也不是事啊。这时就需要图床替我们自动保存图片。下面介绍两种方式;

命令行上传图片

打开偏好设置/图像,

意思是当本地图片被你拖进 md 文件中,会自动上传图片。

点击下载或更新,下好了后会出现打开配置文件按钮,点击弹出 JSON 文件,将以下代码粘贴到这个文件中。

代码语言:javascript复制
{ 
   
  "picBed": { 
   
    "uploader": "smms",//代表当前的默认上传图床为 SM.MS
    "smms": { 
   
      "token": "LFJLSJljlfaoFJOLAF"//这里面的token换成自己生成的token,一定要换
    }
  },
  "picgoPlugins": { 
   }//为插件预留
}

这个 token 如何填?

打开 SM.MS 图床:https://sm.ms/register

自己注册账号后,再登陆:https://sm.ms/login

点击 User/Dashboard/API Token,进入:https://sm.ms/home/apitoken

点击 Generate Secret Token 按钮生成 token,将其填入 JSON 文件。

填完后,保存 JSON 文件。将图片拖拽 md 文件时,如有 Uploading 字样,就成功了。

在 Pictures 可以管理或删除这些文件,可惜根本没法根据 URL 找到图片,时间长了,定位删除图片还是不方便。

说实话我很担心,手贱全删了,导致 md 文件图片全部失效,还是放在博客园中保险些,真可惜我的硬盘不能作为服务器。

PicGo app 上传图片

下载地址:https://github.com/Molunerfinn/PicGo/tags

选择一个版本点击,下翻,在 Assets 中选择 exe 文件下载,安装后直接运行。

但无论怎么双击就是不会显示窗口,看看电脑右下角,点击蓝色图标:

图片上传区:图片上传 – SM.MS

图床设置/SM.MS,填入 Token 后确定,设为默认图床。

Typora 软件,偏好/图像,按图设置

在 PicGo 的安装目录下有个 PicGo.exe,PicGo 路径就选择此 exe 的绝对路径。

1.5 常用的 DOS 命令

内容导视:

  • 打开 DOS 窗口的几种方式
  • 进入目录内:使用绝对路径与相对路径演示
  • 常见的 DOS 命令

写出来的 Java 代码,需要在命令窗口中执行编译与运行命令,需要知道如何打开此黑窗口(Disk Operating System)。

1.5.1 打开 DOS 窗口的几种方式

  1. 屏幕最左下方,右击 Windows图标,点击 Windows PowerShell,管理员权限更高,可以修改系统关键文件。
  2. 点击 Windows 图标,往下翻在所有程序中找到 Windows 系统,点击命令提示符。(可以右键以管理员权限运行)
  3. Windows R 输入 cmd 回车。(最常用)
  4. 打开文件夹资源管理器,在地址栏输入 cmd 回车。(其次常用)
  5. 按住 Shift 别松,鼠标右击,在此处打开 PowerShell(S)。

1.5.2 进入目录内:使用绝对路径与相对路径演示

下面说的目录和文件夹是一个意思。 输入命令后按下回车才能执行,回车键是 Enter。

由于不是可视化界面,不能像之前一样,点到哪里就跳到哪个文件夹下,需要使用 cd 命令,跳转到某路径下。

路径分为绝对路径和相对路径。

打开文件资源管理器(Windows E),随便打开某盘下的文件夹,可以看到地址栏上的路径。假如以 D: 开头,D: 称为盘符,显示的路径称为绝对路径D: 称为 D 盘的根目录(最上一级,不能再上了)。

绝对路径:从盘符开始的路径,能够完整的描述文件位置的路径就是绝对路径。(唯一确定资源位置) 如路径 D:cqh_environment,指向 D 盘下的 cqh_environment 文件。

相对路径,是以当前路径作为出发点的路径,比如进入当前路径的 a 目录。

首先打开 DOS 窗口,切换盘符。

例:想要到 E 盘下,就输入 E: 后回车,输入 dir 回车查看当前路径下有那些子文件(没有就在该盘手动创建文件夹),使用 cd 文件夹名称 进入此文件夹。

使用 cd a 时,单看这个 a,鬼才知道这是哪个地方的文件夹,在哪里才能找到它,需要结合当前路径 E: 才能知道,原来是要到 E 盘下去找 a,那么这个 a 就是相对路径。

可以这么理解,我说北京市某某地址的小区,你马上理解了要在哪去找,这是绝对路径;但我说我家旁边的一家店,你必须先知道我家在哪,再根据我家的位置确定这家店的位置,这就是相对路径。


..:上级目录

.:当前目录

现在回到上级目录,使用cd ..,现在演示一下绝对路径,cd 绝对路径,使用绝对路径时,必须是当前所在盘下的路径。

注意:路径必须存在,你需要把目录创建出来,才能使用 cd 命令进去。

如果使用相对路径,先切换到根目录,再执行 cd abcd

怎么回到根目录?使用 cd E: 吗?或者 cd ........?

还有一种简单的方式 cd 即可


一个 cd .. 是回到上级目录, cd .... 是回到上上级目录。


若文件名太长记不住,可以打出首字母,再按下 Tab 键,也可上下键切换已经输入过的命令,或者你直接将文件拖入这个黑窗口,地址就出来了。

通过刚才的例子,发现跳转路径时,必须是当前盘下的路径,那么还不如使用相对路径,反正盘名写其它盘也没用。解决办法:加个参数 /d 即可。

例:现在在 C 盘下,我要直接到 E:abcd,输入 cd /d E:abcd 即可。

1.5.3 常用的 DOS 命令

内容如下:

  • 进入目录、返回上级目录
  • 打开常用的软件
  • 清空屏幕
  • 新建、删除文件
  • 查看系统变量
代码语言:javascript复制
#切换盘符 C:
#查看当前目录下的文件 dir
#改变目录 cd /d C:abc
#返回上一级 cd..
#直接回到根目录 cd 
#进入子目录 cd 文件夹名称
#清空屏幕 cls
#退出 exit
#查看ip ipconfig
#查看ip详细 ipconfig/all

#打开软件
#打开计算器 calc
#打开绘图 mspaint
#打开记事本 notepad

#查看网络 ping www.baidu.com
#网络诊断 ping www.baidu.com -t
#终止 Ctrl   C

#新建文件夹 md 文件夹名
#新建文件 cd>文件名.后缀
#删除文件 del 文件名.后缀(可带*,*表示任意,小心别把所有东西删了)
#删除文件夹 rd 文件夹名
#打开文件 文件名.后缀

#打包
#把当前的路径下所有打包进a.jar
jar cvf a.jar .
#把当前的路径下所有打包进b.war
jar cvf b.war .
#可以使用绝对路径
jar cvf E:cqhb.war .

#查看系统变量的值,如第一个是C:Windows
echo %SystemRoot%
echo %ProgramFiles%
echo %Path%

#咳咳,你打开环境变量(网上搜,下节也有),左边是变量,右边是值

1.6 Joplin 使用

与其说是 Markdown 编辑器,倒不如说它是一个同步小云盘、整理目录的大师,不与 Typora 冲突。整个页面布局(左中上下):目录树、笔记列表、笔记标题、笔记正文。

由于可以设置中文,只讲一点点。

菜单栏的 Tools/Options/General,右边的 Language,下拉列表,选择中文(简体)。

Alt ?打开对应的菜单栏:


F:文件 E:编辑 V:视图 G:跳转 B:笔记笔记本 N:笔记 T:工具 H:帮助


Ctrl Q:退出。

1.6.1 下载地址

官网:https://joplinapp.org

github下载地址:https://github.com/laurent22/joplin/releases

往下翻,选择一个版本,点击 Assets 选择 exe 文件下载。

1.6.2 常用设置

导入 md 文件

文件/导入,选择导入的是 Markdown 文件还是目录。(不要选带文章前言的,导出时会自动在文章前面加标题、创建和修改日期、时间,即 YAML Front matter)

把文件同步到本地

工具/选项,同步,同步目标设为 File system,设置同步目录。(当然你也可以花钱存云)

给同步目标上的备份文件加密

工具/选项,加密,启动加密;这样的话,如果把同步文件上传到云端,也不怕别人偷看。


如果删除了同步目标的文件,为了安全(故障保护默认开启),不会删除本地文件。

如果删除了本地文件,同步时间一到,同步目标的文件也会被删除。 可以趁着这时间差,从同步目标导入数据到本地。

同步/显示高级选项,自己重新上传数据到同步目标或删除本地数据并从同步目标导入数据


如果两个终端数据不一样(同时修改一个文件,为不同内容),会把冲突的文件移到新创建的”冲突”笔记本中,等你处理。

使用外部 md 编辑器

使用自己的 Markdown 编辑器:工具/选项/通用选项,右边的文本编辑器命令,选一个能够打开 md 文件的 exe 命令,如 Typora.exe。(你还记得此软件的安装目录吗?)

在 Joplin 上任意选一个笔记,按下 Ctrl E,自动转用外部编辑器编写文件。

自定义笔记本图标

笔记本右击/编辑,图标/Select emoji,选一个表情。

网页剪藏器

知识太多了,短时间内是看不完的,如果收藏,也有链接失效的风险,需要将文章内容复制下来。

工具:Chrome 浏览器。

由于插件市场打不开,点击:https://www.extfans.com/

搜索 Joplin Web Clipper,需要关注公众号,获取验证码后下载。下载后解压,里面有个 crx 文件,打开谷歌浏览器,地址栏输入:chrome://extensions/

把 crx 文件直接拖入此页面,添加扩展程序

Joplin 软件,工具/选项,网页剪辑器,启动网页剪辑器。

使用:

Clip simplified page:简化后的页面

Clip complete page:完整页面

In notebook:保存在哪个笔记本

Title:文件名

同步到手机

把自己电脑当作服务器,同步到手机,教程:https://lightzhan.xyz/index.php/2020/11/15/joplin-webdav/

作者:lightzhan,密码:h3mu,WebDAV 小秘:https://lightzhan.lanzoui.com/b015wjsri

打开 DOS 窗口,输入 ipconfig 命令,IPv4 地址对应的就是主机地址;用户名与密码自己设置。

代码语言:javascript复制
无线局域网适配器 WLAN:

   连接特定的 DNS 后缀 . . . . . . . :
   本地链接 IPv6 地址. . . . . . . . : fe10::209
   IPv4 地址 . . . . . . . . . . . . : 192.168.1.1
   子网掩码  . . . . . . . . . . . . : 289.2.52.2
   默认网关. . . . . . . . . . . . . : fu81::22l

手机上自己搜索 Joplin app 吧,因为谷歌你们可能访问不了,我总不能把如何翻墙写在这吧。

WebDAV URL:http://主机地址:端口号

填入自己电脑上设置的用户名与密码,然后检查同步配置,如果显示“成功!同步配置看起来没问题。”就 OK。

如果成功后依然没有开始同步,一直转圈,退出软件重新进入。

扩展语法

打开扩展语法,在工具/选项/Markdown,根据需要勾选,详细请看:https://lightzhan.xyz/index.php/2020/03/31/joplin-extension-usage/

如勾选启用 typographer 支持,让我试下:使用(c),©著作权所有人

1.7 MarkText 使用

是 Typora 的同类型产品,开源免费,略微有些小 bug。

下载地址:https://marktext.app/

有时候可能打不开,从 github 下载:https://github.com/marktext/marktext/tags

选择版本后,Assets 下点击 exe 文件进行下载。

由于作者计划 v1.0.0 以后支持其它语言(国际化),英语不好的,可以搜下汉化版。

如果 git 下载太慢:(慎用!!!)

作者:紫月java,https://www.cnblogs.com/ziyue7575/p/14157952.html

  • 安装用户脚本管理器:https://greasyfork.org/zh-CN/help/installing-user-scripts
  • 加速脚本:https://greasyfork.org/zh-CN/scripts/397419-fastgithub-镜像加速访问-克隆和下载

将 js 文件拖入其中,刷新页面,效果如图:

随便点击,开始下载吧。

英文 OK 的同学可以跳过以下内容…


1.7.1 编辑区域

查看源代码:Ctrl E

整体布局

正上方是 md 文件的绝对路径;

左上角 A 是总字符个数;点击可以切换。

  • Words:单词个数(一个汉字算一个单词)
  • Characters:可见字符个数
  • Paragraphs:段落个数

右键标签栏

Close:关闭文件(未 Ctrl S 保存会弹出提示)

Close others:关闭其它文件

Close saved tabs:关闭已保存的文件

Close all tabs:关闭所有文件

Rename:重命名文件

Copy path:复制文件的绝对路径

Show in folder:打开文件所在目录

段落快捷操作

当你每次移动光标时,当前段落对应的图标(最左边)就会显示,点击

Duplicate:向下复制当前段落

Turn Into:变成?

  • Paragraph(Ctrl 0):段落
  • Header 1(Ctrl 1):h1 标题
  • Display Math(Alt Ctrl M):内联公式块
  • HTML Block(Alt Ctrl J):div 标签
  • Code Block(Alt Ctrl C):代码块
  • Quote Block(Alt Ctrl Q):引用
  • Order List(Alt Ctrl O):有序列表
  • Bullet List(Alt Ctrl U):无序列表
  • To-do List(Alt Ctrl X):任务复选框

New Paragraph:创建新的段落

Delete:删除当前段落

选中文字

从左至右依次是:粗(Ctrl B)、斜(Ctrl I)、下划线(Ctrl U)、删除线(Ctrl D)、高亮(Ctrl H)、代码块(Ctrl `)、内联公式(Ctrl M)、超链接(Ctrl L)、插入图片(Ctrl Shift I)、清除格式(Ctrl Shift R)

插入表情

Windows 句号,或者 :a:,两个冒号跟一个字母

1.7.2 偏好设置

Ctrl 逗号

General

自动保存

Auto Save:

  • Automatically save document changes:更改时自动保存
  • Delay following document edit before automatically saving:延迟 ?ms 后保存

更改菜单栏位置

Window:

Title bar style:

  • Custom:左上角
  • Native:正上方

Editor

字体样式

Text editor settings:文本编辑设置

  • Font size:字体大小
  • Line height:行距
  • Font family:字体样式
  • Maximum width of text editor:编辑器最大宽度,单位有:ch、px、%,例:输入 100px;输入错误会报红。

Markdown

支持上下标

Markdown extensions:扩展语法

启用 Enable Pandoc-style superscript and subscript

  • 5^3^:53
  • 5~3~:53

Spelling

Enable spell checker:开启拼写检查

Default language for spell checker:检查器的默认语言

Key Binding

更改操作的快捷键方式

修改,重置,删除

每次修改后,需要翻到最下面保存

  • Save:保存
  • Restore default key bindings:恢复默认快捷键

1.7.3 图片上传

偏好设置/Image,

Default action after an image is inserted from local folder or clipboard:插入图片后的操作(只支持 macOS 和 Windows 系统)

  • Keep original location:保存在原位置
  • Copy image to designated relative assets or global local folder:复制图片至指定位置(绝对或相对路径)
  • Upload image to cloud using selected uploader(must be configured below):上传至云端

Global or relative image folder:指定图片保存的绝对路径

Prefer relative assets folder:…相对路径,开启后,图片会放在与 md 文件的同级目录下

  • Relative image folder name:目录名称,即图片会放在此目录下

说一下历程吧。

之前不是使用 Typora 软件时下载了 PicGo app 嘛,但是提示检查不出来,说不存在;试着使用命令行方式吧(github 方式将来会废弃),下拉列表切换为 Command line script,提示要安装 PicGo-Core,于是先安装 Node.js,打开 DOS 窗口,输入 npm install picgo -g 命令,安装位置:C:Users自己的用户名AppDataRoamingnpmnode_modules

C:Users你的用户名.picgo 下创建了 config.json 文件,复制了如下:

代码语言:javascript复制
{ 
   
  "picBed": { 
   
    "uploader": "smms", // 代表当前的默认上传图床为 SM.MS,
    "smms": { 
   
      "token": "" // 从 https://sm.ms/home/apitoken 获取的 token
    }
  },
  "picgoPlugins": { 
   } // 为插件预留
}

PicGo-Core 指南:https://picgo.github.io/PicGo-Core-Doc/zh/guide/config.html#自动生成

用法:https://github.com/PicGo/PicGo-Core

如上传文件:picgo upload 文件的绝对路径

于是学了一下 Shell 脚本的语法,提示说输入的唯一参数是图片路径,要求输出图片的 url 路径;于是上网搜,如何接收第一个参数、输出,分别是 $1、echo;尝试过程中发现路径必须以 / 分隔,而不是

代码语言:javascript复制
export LANG="en_US.UTF-8"

str=$(picgo upload $1)
img=${str#*"[PicGo SUCCESS]: "}
echo $img

测试中发现运行不了,需要环境,接着下载了 git,打开 bash 窗口使用 ./xxx.sh 命令运行此文件。

正以为大功告成,可 MarkText 保存不了此 Shell 脚本的绝对路径。没有办法,下载了 v0.16.3 版本覆盖安装,偏好设置里 Image 下多了一项 Image Uploader

选择,点击 Set as default,默认图片上传至 sm.ms。

然后下载新版本,再覆盖安装一次,打开

下拉框改为 Picgo 即可。

拖入图片到窗口时,必须拖到当前段落(会显示一条绿线),才会成功。

点击此图片,可以修改图片(查看是否为网络 URL)以及位置。

脚本:解释性语言,且是文本格式。

1.7.4 File

英语不好,又没有安装汉化版的…下面是菜单栏的各项,先从 File 开始:

New Tab(Ctrl T):新建文件

New Window(Ctrl N):生成新窗口

Open File(Ctrl O):打开文件(可以直接将 md 文件拖入此窗口)

Open Folder(Ctrl Shift O):打开目录(显示目录下的 md 文件、查找、显示文章中的标题)

Open Recent:打开最近文件

  • Clear Recently Used:清空最近文件(只是清除记录)

Save(Ctrl S):保存

Save As(Ctrl Shift S):另存

Auto Save:退出文件前自动保存

Move To:将文件移动至…

Rename:重命名

Export:导出为

HTML

  • Page:设置页面标题(title 标签里的文本)
  • Style
    • Overwrite theme font settings:更改字体样式、大小、行距
    • Auto numbering headings:自动为 h1 以下级别的标题编号
    • Show front matter:显示前言
  • Theme:选择主题
  • Table of Contents:目录列表

PDF

  • Page
    • Page size:设置纸张大小
    • Landscape orientation:是否横向
    • Page margin:页边距(毫米)
      • Top/Bottom:上下边距
      • Left/Right:左右边距
    • Header & Footer:页眉页脚
      • Header type:页眉类型
        • Single cell:单(中间)
        • None:无
        • Three cells:三(左中右)
      • Customize style:定制风格
        • Header and footer font size:页眉页脚字体大小
  • Preferences(Ctrl 逗号):偏好设置
  • Close Tab(Ctrl W):关闭文件
  • Close Window(Ctrl Shift W):关闭窗口
  • Quit(Ctrl Q):关闭所有窗口

导出时新增主题:https://github.com/marktext/marktext/blob/develop/docs/EXPORT_THEMES.md

1.7.5 Edit

Undo(Ctrl Z):撤销

Redo(Ctrl Shift Z):反撤销

Cut(Ctrl X):剪切

Copy(Ctrl C):复制

Paste(Ctrl V):粘贴

Copy as Markdown(Ctrl Shift C):以 Markdown 形式复制

Copy as HTML:以 HTML 标签形式复制

Paste as Plain Text(Ctrl Shift V):纯文本粘贴

Select All(Ctrl A):选中所有

Duplicate(Alt Ctrl D):向下复制一行

Create Paragraph(Ctrl Shift N):创建新的段落

Delete Paragraph(Ctrl Shift D):删除当前段落

Find(Ctrl F):查找

  • Case Sensitive:区分大小写
  • Select whole word:选择整个单词,如查找 a,不会出现包含 a 的单词如 puba,而是只有单独的 a。
  • Use query as RegEx:使用正则表达式
  • Find Next(F3):往下找
  • Find Previous(Shift F3):往上找

Replace(Ctrl R):替换所有、一个个替换

Find in Folder(Ctrl Shift F):在目录下的文件中查找(首先得 Open Folder 打开目录)

Line Ending:换行方式

  • Carriage return and line feed(CRLF):Windows 换行方式,即 rn
  • Line feed(LF):Linux换行方式,即 n

1.7.6 Paragraph

Heading 1、2、…、6 为 H1、H2、…、H6 标题

Promote Heading(Ctrl Shift =、Ctrl 加号):提升标题等级

Demote Heading(Ctrl -):降低标题等级

Table(Ctrl Shift T):创建表格

Code Fences(Ctrl Shift K):代码块

Quote Block(Ctrl Shift Q):引用

Math Block(Alt Ctrl N):内联公式块

HTML Block(Alt Ctrl H):HTML 标签

Ordered List(Ctrl G):有序列表

Bullet List(Ctrl H):无序列表

Task List(Alt Ctrl X):复选框

Loose List Item(Alt Ctrl L):增加列表之间的距离

Paragraph(Ctrl Shift 0):段落

Horizontal Rule(Ctrl Shift U):分隔线

Front Matter(Alt Ctrl Y):前言

1.7.7 Format

Bold(Ctrl B):粗体

Italic(Ctrl I):斜体

Underline(Ctrl U):下划线

Superscript:上标

Subscript:下标

Highlight(Ctrl Shift H): 黄色高亮

Inline Code(Ctrl `):单行代码块

Inline Math(Ctrl Shift M):单行内联公式

Strikethrough(Ctrl D):删除线

Hyperlink(Ctrl L):超链接

Image(Ctrl Shift I):图片链接

Clear Formatting(Ctrl Shift R):清除格式

1.7.8 Window

Minimize(Ctrl M):窗口最小化

Always on Top:总是显示在最上层

Zoom In:放大

Zoom Out:缩小

Show in Full Screen(F11):全屏显示

1.7.9 View

Command Palette(Ctrl Shift P):查看操作的快捷方式

Source Code Mode(Ctrl E):查看源代码

Typewriter Mode(Ctrl Shift G):打字机模式,保证光标在屏幕中间

Focus Mode(Ctrl Shift J):焦点模式,只关注当前输入行

Show Sidebar(Ctrl J):显示侧边栏(目录树、查找、文章标题)

Show Tab Bar(Ctrl Shift B):显示标签栏(md 文件名)

Toggle Table of Contents(Ctrl K):跳转至对应的 H 标题位置(点击左边侧边栏显示的标题)

Reload Images(F5):重新加载图片

1.7.10 Help

Quick Start:快速开始

Markdown Reference:Markdown 语法

Changelog:更新日志

Donate via Open Collective:赞助

Feedback via Twitter:反馈(使用推特)

Report Issue or Request Feature:报告问题或请求功能

Website:网站

Watch on GitHub:查看 Github 项目

Follow us on GitHub:关注我们(GitHub)

Follow us on Twitter:关注我们(Twitter)

License:许可证

Check for updates:检查更新

About MarkText:关于 MarkText

1.x 总结回顾

(不要惊讶怎么这么少,我说过别把大脑当成硬盘,记一个 cd 命令就足够了,记得看完后休息一会,欲速则不达)

Java 介绍与下载

Java是最早由 SUN 公司的 James Gosling 开发的编程语言。

SUN 在 2009 年被 收购;2014 年 3 月 19 日发布了 JDK8。

常用的 DOS 命令

cd 当前目录下的文件夹名 进入目录

1.y 脑海练习

1.1 JDK 和 JRE 的区别?

1.2 什么是编程?

1.3 Swing 组件是什么?

1.4 JAR 包是什么?

1.5 软件与程序指的是什么?

1.6 什么是编译型语言和解释型语言?

1.7 Java 语言特性?

1.8 能说下 JavaSE、JavaEE、JavaME 吗?

第二章 编写第一个程序

内容导视:

  • 编写源代码并运行
  • 代码书写规范
  • 注释

2.1 编写源代码并运行

内容导视:

  • 创建 .java 文件编写源码
  • 配置环境变量
  • 查看命令使用帮助
  • 解释代码含义
  • 编译与运行

2.1.1 创建 .java 文件编写源码

我们要开始写源代码啦!但只是在 DOS 窗口中输出一句话而已…

创建以 .java 结尾的文件,如 Hello.java。(以后统称为后缀或扩展名,打开文件资源管理器,查看,勾上文件扩展名)文件右击选择打开一种打开方式。(EditPlus 或其他文本编辑器,找不到选择其它应用,然后选中“始终使用此应用打开此类型的文件”复选框)这样你以后双击 .java 文件就可以直接使用此软件打开啦。

双击此文件,输入如下。还是直接复制、粘贴吧,记得保存。(Ctrl S)

代码语言:javascript复制
public class Hello { 
   
	public static void main(String[] args) { 
   
		System.out.println("hello world!");
	}
}

打开 DOS 窗口,使用 cd 命令切换到此文件的所在目录。

(如果你在桌面上创建的文件,路径是 C:Users自己的用户名Desktop,你可以自己打开文件资源管理器,点击左边的桌面图标,在地址栏上输入 cmd 后回车)

在 DOS 窗口中输入 javac Hello.java,得到如下诡异的结果。

代码语言:javascript复制
'javac' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

你可能会疑惑?怎么没有找到这个命令,不是在 JDK 的安装路径/bin 目录下有 javac.exe 命令吗?你说找不到?那为什么之前 DOS 窗口查看 IP 时,也就是 C:WindowsSystem32 下的 ipconfig 命令就可以执行?

此电脑右键/属性/高级系统设置/环境变量/系统变量/Path 下看到了 %SystemRoot%system32,即 C:WindowsSystem32

(如果桌面上没有此电脑图标)

  • 打开文件资源管理器,此电脑的图标在左边。
  • 或者 Windows i 打开设置,点击系统/关于,往下翻,相关设置/高级系统设置。
  • 右键/个性化/主题/桌面图标设置,勾选计算机图标后点击应用和确定。

猜想:难道系统只会在 Path 指定的路径下寻找命令吗?我随手就删了它(别试,否则手动还原),确定保存刚刚的修改操作,重新打开 DOS 窗口,再次执行 ipconfig,很明白了。

得出结论:执行的程序如果在当前目录下不存在,系统会在名为 Path 的环境变量指定的目录下查找。

好的,大概明白了,但我的电脑上有多个用户,那么为了不影响其他用户,我只配置用户变量的 Path,优先级当然没有系统变量的高。(系统变量针对所有用户生效)

2.1.2 配置环境变量

上节知道了 Path 变量的作用,现在该把命令地址添加到 Path 中了。

双击 Path,添加 javac 命令所在路径。(如果你还记得 JDK 安装的位置,打开 bin 目录,复制地址栏上的地址)

如果这个 JDK 安装目录,以后会重复使用(不用怀疑,肯定了)。为了方便,新建变量 JAVA_HOME 保存 JDK 安装目录,供其它地方使用。

再把之前的 javac 命令所在路径替换成 %JAVA_HOME%bin

%JAVA_HOME% 代表变量 JAVA_HOME 对应的值。以后 JavaEE、开发工具需要获取 JDK 的安装目录,这样就不需要再手动设置了。

有的人可能版本较老,Path 变量值在一行文本框上显示。那么添加路径时,注意路径与路径之前使用;分隔,注意这个分号是英文状态下的半角符号,你按下 Shift,看看电脑右下角是否中英在切换。写成 就错了。以后如果不说明,统一使用英文状态下的符号。

例:

检查自己是否配置好了:

代码语言:javascript复制
打开 DOS 窗口,输入 java -version 和 javac 等命令
如果显示版本信息,证明 java.exe 是可以用的

再输入 echo %Path%
查看刚刚配置的 JDK的家bin 路径是否在其中

有的人可能有疑惑,明明自己没配环境变量,为什么 java.exe 可以使用?

答:使用 exe 文件安装 JDK 后,会自动在系统变量 Path 添加如下图路径:

C:Program Files (x86)Common FilesOracleJavajavapath

所以没有手动配置环境变量时,java 命令可以用,但 javac 不行。

每次改动,都需要重新打开 DOS 窗口,配置才能生效。输入 javac Hello.java,如果你的语法正确,就会在当前路径下生成 class(字节码)文件,再输入 java Hello ,此时别带后缀。

有人就说了,每次运行 class 文件,都要使用 cd 命令进入此目录,再执行命令很麻烦。那么可以通过 classpath 变量指定字节码文件所在位置。

新建环境变量 classpath:

.是英文输入的句号,代表当前路径,如果不写就不会从当前路径寻找 class 文件。 由于我习惯把 class 文件放在桌面上,于是新增了桌面的路径,路径和路径直接使用;分隔,别使用中文的分号。

这样不管在任何地方,输入 java Hello 就可以执行了。

总结

Path 是 Windows 查找 .exe 文件的路径;classpath 是 JVM 查找 .class 文件的路径;如果你以后学会了如何打 jar 包,假如它的绝对路径为 E:acdTool.jar,如果想任何位置敲 java -jar Tool.jar 让 jar 包执行,就可以把 E:acdTool.jar 加到 classpath 变量值里。

javac Te*.java 会将文件名开头为 Te 的所有 .java 文件都编译

2.1.3 查看命令使用帮助

也许你总是会忘记,此命令应该携带什么参数…

想要执行的命令 -help,例举了可加的参数,如 -encoding。(对不起,我要给你埋坑了,如果你事先不知道此参数的作用…)

javadoc -helpjavac -help。(其实不加 -help 也行)

看,这不就出来了:

2.1.4 解释代码含义

看不懂很正常,学完面向对象就懂了。突然遇到看不懂的不要怀疑自己智力有问题,只是还没到这步而已,大不了直接跳过。

代码语言:javascript复制
public class Hello { 
   
    // args 是变量名,可以根据标识符的命名规则取名
	public static void main(String[] args) { 
   
		System.out.println("hello world!");
	}
}

从头开始说吧。

  • 关键字 public 是访问修饰符,表明该类是一个公共类,可以控制其他对象对类成员的访问。
  • 关键字 class 用于声明一个类,其后所跟的 Hello 是类名。
  • Hello 后跟的 {} 称为类体,包含了方法、字段…
  • public static void main(String[] args) {}:这个是 main 方法,由于被 JVM 调用,也被称为主方法、入口方法。所有 java 代码都是最先从入口方法开始执行的。
    • main 后的 {} 称为方法体,包含了 java 语句。
    • 关键字 static 表示该方法是一个静态方法,无须创建类的实例即可调用。
    • 关键字 void 表示此方法没有返回值。
    • void 后面的是方法名 main。
    • main 后的括号包含一个形式参数,这个形参是 String 类型的数组,参数名是 args。
    • System.out.println(""); 是 java 语句,代表打印(输出)括号中的内容到控制台(DOS 窗口)。
    • “hello world!” 是一个字符串。
    • ; 代表一条 java 语句的结束。

2.1.5 编译与运行

(字节码文件是 class 文件,由源代码中定义的 class 生成)

过程如下:

首先新建后缀为 java 的文件,编写出符合语法规则的代码。

编译:经过 javac 源文件名.java 命令编译生成字节码文件;

运行:使用 java 类名 命令在 JVM 虚拟机上运行此字节码文件,JVM 会调用此类的 main 方法。

(补充:因为一个源文件可以定义多个类,编译后生成多个 class 文件,所以 java 命令后面跟的不一定是源文件名)

编译

.java 文件是 java 的源文件,但是不能直接运行,必须先被编译成为 .class 文件才能够执行。别问,问就是电脑太笨,看不懂。

class 文件也称为字节码文件,上面的 javac 源文件名.java 就是编译的过程。

编译期将源码交给编译器,编译成可以被 JVM 识别的字节码,如果源代码不符合语法规则,就会报错(错误提示很智能,可以根据报错信息相应找到原因,自己试试比如删除一个大括号、引号等,看看 javac 命令给你报什么错)

运行

(当源文件修改后,必须重新编译才能生效)

编译后生成 class 字节码文件,使用 java class文件名 运行,别加 .class 后缀。

运行期类加载器(Class Loader)找字节码文件(如果没有配 classpath,默认从当前路径下找),找到了就加载字节码文件到 JVM 虚拟机,JVM 启动解释器对字节码文件进行解释,生成的二进制码读到内存中,由 CPU 进行二进制码的执行。

字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,编程人员和计算机都无法直接读懂字节码文件。它是一种二进制文件,是 Java 源文件由 Java 编译器编译后生成的目标代码文件。它必须由专用的 Java 解释器来解释执行,因此 Java 是一种在编译基础上进行解释运行的语言。

C 语言中文网下的解释,我觉得还行吧,我没玩过 C 语言。


1)将所有源代码一次性转换成二进制指令(也就是生成一个可执行程序,如 Windows 下的 .exe) 的转换工具称为编译器

比如 C 语言、C 的 GCC、Golang 的 GCC GO 等,源代码改动需要重新编译一次。

2)翻译一句,执行一句,不会生成可执行程序。 比如 Python 的 CPython 等,这种的转换工具称为解释器。

3)Java 和 C# 是一种比较特殊的存在。 如 java 有编译器 javac,但编译后的 class 文件计算机无法执行,还需要 java 解释器进行翻译。

它们的源代码需要先转换成一种中间文件(字节码文件),然后再将中间文件拿到虚拟机中执行。 Java 引领了这种风潮,它的初衷是在跨平台的同时兼顾执行效率;

C# 是后来的跟随者,但是 C# 一直止步于 Windows 平台,在其它平台鲜有作为。


Java 解释器负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行。因此 Java 程序不能直接运行在现有的操作系统平台上,它必须运行在被称为 Java 虚拟机的软件平台之上。

Java 虚拟机(JVM)是运行 Java 程序的软件环境,Java 解释器是 Java 虚拟机的一部分。在运行 Java 程序时,首先会启动 JVM,然后由它来负责解释执行 Java 的字节码程序,并且 Java 字节码程序只能运行于 JVM 之上。这样利用 JVM 就可以把 Java 字节码程序和具体的硬件平台以及操作系统环境分隔开来,只要在不同的计算机上安装了针对特定平台的 JVM,Java 程序就可以运行,而不用考虑当前具体的硬件平台及操作系统环境,也不用考虑字节码文件是在何种平台上生成的。

JVM 把这种不同软、硬件平台的具体差别隐藏起来,从而实现了真正的二进制代码级的跨平台移植。JVM 是 Java 平台架构的基础,Java 的跨平台特性正是通过在 JVM 中运行 Java 程序实现的。

Java 语言这种“一次编写,到处运行”的方式,有效地解决了目前大多数高级程序设计语言需要针对不同系统来编译产生不同机器代码的问题,即硬件环境和操作平台的异构问题,大大降低了程序开发、维护和管理的开销。

提示:Java 程序通过 JVM 可以实现跨平台特性,但 JVM 是不跨平台的。也就是说,不同操作系统之上的 JVM 是不同的,Windows 平台之上的 JVM 不能用在 Linux 平台,反之亦然。

2.2 代码书写规范

内容导视:

  • 代码细节
  • 代码规范
  • 标识符与关键字

2.2.1 代码书写细节

看不懂没关系,只挑能理解的。

1)字母严格区分大小写,如 class 不等于 Class。

2)在 java 中任何有效的代码必须写在“类体”中,就是 public class Hello 后的一对大括号 {} 中。

3)大括号必须要成对写,防止漏掉。

4)为了增加代码的可读性,大括号里的内容需要使用 tab 缩进,如 main 方法就比 class Hello 低一个层次。

代码语言:javascript复制
class Hello { 
   
    // 被 {} 包裹的部分选中,按下 tab
    public void some1() { 
   
        // 被 {} 包裹的部分选中,按下 tab
        int i = 10;
        if (i > 10) { 
   
            // 同理
            System.out.println("为何");
        }
    }
}

5)main 后的 {} 包裹的内容称为方法体,由一行行的 java 语句构成,任何一条 java 语句必须以分号结尾;。若无特别说明,默认为英文状态下的符号。

6)方法体中代码遵循自上而下的顺序依次逐行执行,不可随意颠倒顺序。

代码语言:javascript复制
System.out.println(i);// 执行到这句时,还没有 i 变量
int i = 10;

7)一个 java 源文件可以定义多个类。编译后,每一个类对应一个 class 文件,如以下编译后会生成 A.class、B.class、C.class 三个字节码文件

代码语言:javascript复制
class A { 
   
}

class B { 
   
}

class C { 
   
}

8)有 public 修饰的类可以没有,但如果有,被 public 修饰的类名必须与源文件名一致。 例:源文件名为 Hello,则 public class 后的类名也应该为 Hello。

9)被 public 修饰的类如果有,则最多只能有一个。类似一个家只有一个主人吧。

10)运行时,只会调用对应类的入口方法里面的内容,入口方法有固定的书写格式:

public static void main(String[] args) {}

那我偏不信邪,改下,再运行。

代码语言:javascript复制
E:cqh_demo1-JavaSE>java A
错误: 在类 A 中找不到 main 方法, 请将 main 方法定义为:
   public static void main(String[] args)
否则 JavaFX 应用程序类必须扩展javafx.application.Application

好吧,再改回去了。

2.2.2 代码规范

规范与规则不一样,不是必须遵守。但是如果你不遵守,代码可读性会很差。反例如下,虽然可以通过编译,但你看起来感觉如何?

代码语言:javascript复制
class
Hello{ 
   
public
    static
void
    main
    (String a[]){ 
   
System.
       out. println("你好")
       ; 
    int i=2
        ;
    			if
                    (i>
                     1&&i
                     <29){ 
   
                    System.out.println("e");
                }
}
	}

1)类和方法上的注释,以 javadoc 的方式,方便生成文档注释。

代码语言:javascript复制
class Test { 
   
    /** * 这个注释下节有讲,现在只是测试 * */
    public void some() { 
   }
}

2)非 javadoc 注释,用于给代码的维护者和读者看。(为什么这么写,如何修改,注意事项)

代码语言:javascript复制
// 这就是注释,解释下面是将 10 赋给了 int 类型的变量 i;
int i = 10;

3)运算符如 <、= 的两边使用空格与字符隔开,举出正反例:

代码语言:javascript复制
int a = 10;
int b=10;

if (a < 20 && b > 5) { 
   }

if(a<20&&b>5){ 
   }

4)代码编写使用次行风格或行尾风格。你可以理解为这就是对整齐风格的一种追求吧。

代码语言:javascript复制
// 行尾风格
public void add(int num) { 
   
    if (num < 0) { 
   
        this.age = 3;
    } else if (num < 6) { 
   
        this.age = 33;
    } else { 
   
    	this.age = 333;
    }
}
代码语言:javascript复制
// 次行风格
public void add(int num)
{ 
   
    if (num < 0)
    { 
   
        this.age = 3;
    } else if (num < 6)
    { 
   
        this.age = 33;
    } else
    { 
   
    	this.age = 333;
    }
}

2.2.3 标识符与关键字

声明:由于每次使用 import、带上完整类、main 方法比较繁琐。于是进行了简化,只提供关键部分,外面的类、方法等其它代码以后自己加吧,别直接复制代码,发现怎么跑不起来啊?

代码语言:javascript复制
class Hello { 
   
    public static void main(String[] args) { 
   }
    
    public int add(int num1, int num2) { 
   }
}

凡是程序员有权利命名的单词都是标识符。

比如:类名、方法名、参数名、变量名、接口名、常量名。(这些是什么,以后就知道了,现在只是看看)

代码语言:javascript复制
// add 是方法名有权利命名
public int add(int num1, int num2){ 
   
    // n 是变量名
    int n = num1;
}

你可以试试哪里可以修改,比如修改 public、int 等单词,是否会报错。你就明白,你可以动的地方有哪些。可以动而不报错的那些单词就是标识符,不可以动的就是关键字。

命名规则

  • 标识符只能由数字、字母、_、$ 组成。(标识符中不能有空格)
  • 标识符不能以数字开头。
  • 关键字和保留字不能做标识符。
  • 标识符严格区分大小写,理论上没有长度限制。(如 Public 与 public 不一样)

可以使用 Character 类的方法检验,isJavaIdentifierStart 方法可以确定某字符是否可以作为变量名的开头;

isJavaIdentifierPart 方法确定某字符是否可以作为变量名的一部分,不包括开头。

命名规范

见名知意,如 day 代表天数。

1)别用拼音与英语混合,那样很难理解。

代码语言:javascript复制
反例:tianKongBlue

2)杜绝完全不规范的英文缩写,避免望文不知义。

代码语言:javascript复制
反例:AbstractClass “缩写”成 AbsClass;
condition “缩写”成 condi;
Function “缩写”成 Fu;
此类随意缩写严重降低了代码的可阅读性。

驼峰命名,多个单词连在一起时,单词首字母大写,增加识别和可读性,下面是阿里巴巴开发手册(黄山版)详细:

1)类名使用 UpperCamelCase 风格(首字母大写,后面每个单词首字母大写),以下情形例外:DO / PO / DTO / BO / VO / UID 等。

代码语言:javascript复制
正例:ForceCode / UserDO / HtmlDTO / XmlService / TcpUdpDeal / TaPromotion
反例:forcecode / UserDo / HTMLDto / XMLService / TCPUDPDeal / TAPromotion

2)方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格(首字母小写,后面每个单词首字母大写)。

代码语言:javascript复制
正例:localValue / getHttpMessage() / inputUserId

3)常量名全部大写,单词间用_连接,力求语义表达完整,不要嫌名字长。

代码语言:javascript复制
正例:MAX_STOCK_COUNT / CACHE_EXPIRED_TIME
反例:MAX_COUNT / EXPIRED_TIME

枚举成员实际上也是常量,名称需要全大写,单词间用_连接。

4)抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾;枚举类名带上 Enum 后缀。

5)如果是形容能力的接口名称,取对应的形容词为接口名(通常是 –able 结尾的形容词)。

代码语言:javascript复制
正例:AbstractTranslator 实现 Translatable 接口。

6)在常量与变量命名时,表示类型的名词放在词尾,以提升辨识度。

代码语言:javascript复制
正例:startTime / workQueue / nameList / TERMINATED_THREAD_COUNT
反例:startedAt / QueueOfWork / listName / COUNT_TERMINATED_THREAD

7)POJO 类中定义的布尔类型的变量,不要加 is 前缀,否则部分框架解析会引起序列化错误。

备注:POJO(Plain Ordinary Java Object):普通的 Java 对象。

代码语言:javascript复制
反例:定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted()。
框架在反向解析时,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

8)包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。

代码语言:javascript复制
正例:应用工具类包名为 com.alibaba.ei.kunlun.aap.util;类名为 MessageUtils
(此规则参考 Spring 的框架结构)。

9)避免在子父类的成员变量之间、或者不同代码块的局部变量之间采用完全相同的命名,使可理解性降低。

代码语言:javascript复制
// 反例
public class ConfusingName { 
    
    protected int stock; 
    protected String alibaba;
    // 非 setter/getter 的参数名称,不允许与本类成员变量同名
    public void access(String alibaba) { 
   
        if (condition) { 
   
            final int money = 666;
            // ...
        }for (int i = 0; i < 10; i  ) { 
   
            // 在同一方法体中,不允许与其它代码块中的 money 命名相同
            final int money = 15978;
            // ...
        } } }
class Son extends ConfusingName { 
   
    // 不允许与父类的成员变量名称相同
    private int stock; 
}

说明:子类、父类成员变量名相同,即使是 public 也是能够通过编译,而局部变量在同一方法内的不同代码块中同名也是合法的,但是要避免使用。对于非 setter / getter 的参数名称也要避免与成员变量名称相同。

关键字

Java 关键字是对 Java 编译器有特殊含义的字符串,是编译器和程序员的一个约定,程序员利用关键字来告诉编译器其声明的变量类型、类、方法特性等信息。

关键字一律用小写字母标识,按其用途划分为如下几组。

1)用于数据类型的关键字有:

boolean、byte、char、 double、 false、float、int、long、new、short、true、void、instanceof。

2)用于语句的关键字有:

break、case、 catch、 continue、 default 、do、else、 for、 if、return、switch、try、 while、finally、 throw、this、 super。

3)用于修饰的关键字有:

abstract、final、native、private、protected、public、static、synchronized、transient、 volatile。

4)用于方法、类、接口、包和异常的关键字有:

class、 extends、 implements、interface、 package、import、throws。

5)保留字:

cat、 future、 generic、inner、 operator、 outer、rest、var、goto、byValue、cast、const 等都是Java尚未使用,但以后可能会作为关键字使用。

另外,Java 还有3个保留字:true、false、null。它们不是关键字,而是文字,包含 Java 定义的值。和关键字一样,它们也不可以作为标识符使用。

2.3 注释

内容导视:

  • 单行注释
  • 多行注释
  • 文档注释
  • IDEA 工具自动快捷键添加注释
  • 使用 javac 命令编译时出现的”错误: 编码 GBK 的不可映射字符”
  • 浅入编码
  • 查看系统编码
  • 使用 API 文档

注释是对代码的解释说明,方便理解代码的含义,提高代码的可读性。 注释不是编程语句,因此被编译器忽略。 如果不写注释,时间久了或代码过长本人也看不懂,所以编写注释是一个良好的习惯。

注释有三种,依次介绍。

2.3.1 单行注释

使用双斜杠 //,// 后的就是注释(仅一行),不会被编译器当成 java 语句。

代码语言:javascript复制
public class A { 
   
	public static void main(String[] args) { 
   
		// 打印()中的话到控制台上,这个()中的字面量(数据)如果是字符串类型,需要用""包裹起来
		System.out.println("Hello World A");
	}
}

2.3.2 多行注释

对于很多内容,单行放不下,可以使用多行注释,在 /**/ 里内写下内容,星号别省略。

代码语言:javascript复制
/* System 是类, 通过类名.调用 out 这个静态变量, 这个静态变量保存的是堆内存中的对象地址,被称为对象引用 再通过对象引用,调用对象的 println 方法 */
System.out.println("Hello World A");

2.3.3 文档注释

下面看看就行,以后使用开发工具 IDE 自动生成,没必要手动敲。

文档注释可以被 javadoc 命令解析,生成以网页形式(html)显示的 API 文档。(Application Programming Interface:应用程序编程接口)。

当类又多又杂,一个个找类、看注释很麻烦,于是提取出来生成网页。

用来说明类、成员变量和方法的功能。不用在一个一个 java 文件中查看注释,直接打开 html 查看想要的方法。

javadoc 默认只提取 public、protected 修饰的部分,javadoc -help 查看可加的选项。

文档注释必须写在类、接口、方法、构造器、成员字段前面,写在其他位置无效。

文档注释中可以识别的标签如下:

标签

说明

@version

指定类的版本,用于类上

@author

标注类的作者

@since

从哪个版本起有了这个方法

@param

参数详细信息

@return

说明返回值

@throws

可能抛出的异常

@deprecated

表示不建议使用

@see

另请参阅

文档注释的标签区分大小写,别写错了,也可以看看源码上的注释是怎么写的。(别省略 * 号,注意观察下面的格式)

代码语言:javascript复制
/** * @author 是在座的每一个人 * @version 2.0.0 */
public class Hello { 
   

    /** * 这个方法用来求两数之和 * * @param num1 第一个参数 * @param num2 第二个参数 * @return 返回两个数的和 * @throws 测试用而抛出的异常 * @since 1.8.2 */
    public int add(int num1, int num2) throws RuntimeException { 
   
        return num1   num2;
    }
} 

javadoc 命令只能提取文档注释。让我们试试吧。

javadoc Hello.java -encoding UTF-8 -version -author -private -charset UTF-8 -docencoding GBK

当前目录会生成 index.html 文件,双击此文件,交给浏览器解析(会自动打开浏览器),右键查看页面源代码,API 文档里的信息是读取 Hello.java 文件得来的。

使用此命令还可以追加其他 java 源文件的文档注释,例:javadoc -encoding UTF-8 Hello.java H.java

javadoc 命令中的参数说明


-encoding 是告知 java 源代码所用的字符编码;

-version、-author 是显示版本和作者;

-private 是显示所有类和成员;(包括显示私有,一般显示 protected 以上级别就行,可以不加此选项)

-charset 是告知浏览器此文件采用什么编码方式读取这个文件; 即 html 文件生成 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

-docencoding 是指定生成的 html 文件的字符编码,不写此选项,默认 UTF-8。


由于文件被保存时的编码和读取时采用的编码不一致会出现乱码,所以别掉坑。咳咳,你知道自己的文件编码吗?在哪如何查看?编码是什么?你可以先了解下相关知识,或者你之前已经掉坑了,不知道满屏的 GBK 不可映射是啥意思,后面再讲好吗?

指定文档生成的位置

使用 -d 指定文件在 E:abc 下生成,很抱歉让你的桌面生了一大堆 html 文件。

javadoc Hello.java -d E:abc -version -author

代码一改,注释说明也得跟着改;为了避免无用功,代码中给标识符命名,见名知意,最好让所有人看到这段代码就知道它是干什么的,避免冗余无效注释。

示例如下:

代码语言:javascript复制
import java.nio.channels.ReadableByteChannel;
import java.nio.charset.CharsetDecoder;

/** * 这是测试如何制作 API 文档的类 * * <p> p 标签包围的文字代表一段,ul 和 li 标签是无序列表</p> * <ul> * <li>呵呵 {@code test} 呵呵</li> * <li>呵呵 <code>test</code> 呵呵</li> * <li>被上面 code 标签包裹的内容会更显眼,更细,一般用于标识符</li> * <li>see 标签另请参阅,格式:引用类的全类名#方法名(形参类型, 形参类型...) * java.lang 包下的类可以省略包名。如果引用的类在 API 文档上,点击后会自动跳转 * 这个 H 类我也打包到了此文档</li> * </ul> * * @author cqh * @author 作者甲 * @version 1.0.0 * @see Object#wait(long) * @see Object#toString() * @see StringBuffer * @see H#hh() * @since 0.8.0 */
public class Test { 
   
    /** * 介绍属性的作用 * * @see java.util.Scanner#makeReadable(ReadableByteChannel, CharsetDecoder) * @since 0.8.1 */
    public String[] name;

    /** * 说明方法的作用 * * @param name 这个name是 {@code String} 类型 * see参阅本类中其它方法省略类名。link如 * {@link #getAge(int, int)}也可以跳转,例 * {@link H#hh()},{@link H} * @return 返回一个人名 * @throws ArrayIndexOutOfBoundsException 下标越界抛出此异常 * @see #getAge(int, int) * @see H * @since 0.8.1 */
    public String getName(String name) throws ArrayIndexOutOfBoundsException{ 
   
        return name;
    }

    /** * 另一种格式,把解释放到下一行 {@link java.lang.Object#notify()} 你好 * * @param age * 这是人的年龄 * * @param count * 总个数 * * @throws IndexOutOfBoundsException * 如果满足如下几种条件之一就抛出该异常 * <ul> * <li> {@code age} 不是整数 * <li> {@code age} 没有填入 * <li> {@code age (end-begin)} 超过了 * {@code name.length} * </ul> */
    public void getAge(int age, int count) throws IndexOutOfBoundsException{ 
   

    }
}

2.3.4 IDEA 工具自动快捷键添加普通注释

以后有了 IDEA 工具再试,现在不用看,直接跳过;放心 IDEA 工具中会更详细地说明。

在 IDEA 中每创建一个类时,自动在类上加注释

左上角 File/Settings/Editor/File and Code Templates,includes/File Header

里面粘贴

代码语言:javascript复制
/** * 现在北京时间:${YEAR}/${MONTH}/${DAY} ${TIME} * 本类用于某某某 * * @author 作者 * @version 版本 * @see 另请参阅 * @since 从哪个版本有的 */

点击 apply 和 OK。

在方法上加注释

左上角 File/Settings/Editor/Live Templates

点击加号 Template Group 自己创建个组后,再选择你刚刚创建的组点击加号 Live Template。

解释:

代码语言:javascript复制
Abbreviation:**

Description:解释快捷键的描述,自己填写

Options
Expand with Enter

Template text:
**
 *
 * @param   $param$
 * @return  
 * @throws
 */

当输入 Abbreviation 所写内容”**“时,按下 Enter 就把 ** 转成 Template text 中的内容

$$ 包围的变量需要点击 Edit vaiables 设置。

选择 Define 勾选 Java,就可以定义此模板只有在编写 java 文件才能使用。

点击 apply 和 OK。

然后我又定义了一个方法模板,缩写词:psvt;设置好后 OK 返回。

在 java 文件输入 psvt 后按下 Tab 键,光标停在 VAR 等我们输入;按下回车,光标到了 END 处。

2.3.5 使用 javac 命令编译时出现的”错误: 编码 GBK 的不可映射字符”

内容如下:

  • 解决 GBK 乱码问题
  • 普及编码格式知识

本节片段提取:

友情提示,先复制文本,转换后直接粘贴。目的是避免转换编码后造成中文乱码,又得一个个改。

有 2 种方式解决:

1)文件/另存为副本,更改编码为 ANSI。(如果使用的是 notepad ,就在上方的工具栏的编码,转成 ANSI 编码)

2)指定使用的编码格式。(编码格式在文本编辑器的右下方)-encoding UTF-8 是指定文件编码格式是 UTF-8。

正文如下:

可能编译时由于代码(包括注释里面)中有中文,编译时说什么含有 GBK 的不可映射字符,不让通过。我相信新手的第一道关就卡在这,有人就干脆不写中文了。

为何报错

计算机只认得二进制数,也就是 0 和 1,存储和读取数据时都要使用二进制数表示。

0 和 1 可以有很多的组合,如 011、1001010 等等。可以用它们表示不同的数据,字符编码就是人为定义的一套转换表,规定一系列文字与二进制的映射关系。

(这里未区分字符集与字符编码的概念)

有多种字符编码,比如 ASCII 码,一般是 8 位二进制表示一个字符,如字符 ‘a’ 对应 01100001,这个二进制码转为十进制是 96;

学过概率的知道,8 位数,每位是 0 或 1,最多可以表示 2 ^ 8 = 256 个字符,应对 26 个英文字母绰绰有余。这 8 位称为 1 个字节(byte),单个位称为 bit。

2 ^ 8 即 2 的 8 次方,只是为了方便表达。有的网站不支持上标、下标语法时,你会看到 2^8^、2~8~,分别对应 28、28。

ASCII 是美国人定义的,没有考虑其它国家。但我们国家用的不是英文,有很多字符是 ASCII 码没有的,1个字节也表示不了那么多的汉字,于是国人粗略规定了 GB2312,使用 2 个字节(16位)表示一个汉字。

如在 GB2312 编码中 “中国” 对应的二进制数 11010110 11010000 10111001 11111010,要是系统采用 ASCII 码读取这段二进制,由于它们定义的字符的映射关系都不一样,ASCII 编码也不可能有中文对应的二进制码,所以解码不可能正确,解析不出来就会乱码。

这里二进制数每 8 位隔开,只是方便你们观看,实际使用时还是合在一起。

来,我们使用记事本试试看。此处文件编码为 ANSI,使用 ANSI 编码读取文件,没有乱码,显示 “天下”。

ANSI 代表系统默认编码方式,在中国是 GBK,放心 GBK 兼容 GB2312,使用 GBK 可以解析 GB2312。 举个例子,如果 ASCII 中所有字符对应的二进制码,在 GBK 中,对应关系也同样如此,就说明 GBK 兼容 ASCII 码。说人话就是 01100001 在 ASCII 中表示 ‘a’,在 GBK 中也表示 ‘a’。那么使用 GBK 编码读取 ASCII 文件没有问题,反过来则不一定,因为 GBK 还多了 ASCII 中没有的汉字。

让我们把文件编码转成 ISO-8859-1,也使用此编码读取文件。

现在再看看,这不就乱码了吗?

所以解码和编码都要使用同一套字符编码规则,notapad 可以使用不同的编码方式解析,你测试哪些编码是兼容的,不会乱码。

编码:字符 -> 二进制码 解码:二进制码 -> 字符 底层存储的实际是二进制码。

使用 javac 命令编译时,如果不指定 -encoding 选项,一般默认采用操作系统的字符编码方式,我们是 GBK。

在编写代码时,文本编辑器的右下角会显示当前文件的编码格式。编译时,若与系统当前编码不一致,不是同一套字符编码规则,解析不出来,就会报错;以后讲 char 类型时还会深入,现在讲的很浅显,看不明白很正常,不是你的原因。(我移到扩充内容中了)

两种方式解决

  • 告知此文件的编码方式。 例:当前文件的编码格式是 UTF-8,文件是 Hello.java,编译时添加 -encoding 参数指定文件编码javac Hello.java -encoding UTF-8
  • 修改文件编码方式为 ANSI,文件另存时可以看到编码。(notepad 在工具栏/编码/转为…记得先全选复制,改编码后再粘贴,否则乱码没法撤回)
  • 所有文件使用统一的编码方式,如 UTF-8,新建环境变量 JAVA_TOOL_OPTIONS,值为 -Dfile.encoding=UTF-8,不建议,以后使用 IDE 工具统一使用 UTF-8 编码,不需要自己在外面配。
  • 我不写中文了,不建议,你是中国人,要不是英文通不过编译,我还真想全部使用中文符号。

2.3.6 查看与修改系统编码

通过 java 代码查看

执行以下代码查看系统默认编码

代码语言:javascript复制
public class Hello { 
   
    public static void main(String[] args) { 
   
        String encoding = System.getProperty("file.encoding");
		System.out.println(encoding);
    }
}

通过 DOS 窗口查看

打开 DOS 窗口(Windows R,输入 cmd 回车),点击左上角图标/属性

看到了没有,我没有画圈哦。当前代码页是 936,对应简体中文编码 GBK。

代码页是字符集编码的别名,也称内码表,下面是代码页与编码的对应关系:

代码语言:javascript复制
代码页       国家(地区)或语言 
437          美国 
708          阿拉伯文(ASMO 708)
720          阿拉伯文(DOS)
850          多语言(拉丁文 I) 
852          中欧(DOS) - 斯拉夫语(拉丁文 II) 
855          西里尔文(俄语) 
857          土耳其语 
860          葡萄牙语 
861          冰岛语 
862          希伯来文(DOS)
863          加拿大 - 法语 
865          日耳曼语 
866          俄语 - 西里尔文(DOS) 
869          现代希腊语
874          泰文(Windows)
932          日文(Shift-JIS)
936          中国 - 简体中文(GB2312)现在是 GBK 了,GBK 是在国家标准 GB2312 基础上扩容后兼容 GB2312 的标准。
949          韩文
950          繁体中文(Big5)
1200         Unicode        
1201         Unicode (Big-Endian)
1250         中欧(Windows)
1251         西里尔文(Windows)
1252         西欧(Windows)
1253         希腊文(Windows)
1254         土耳其文(Windows)
1255         希伯来文(Windows)
1256         阿拉伯文(Windows)
1257         波罗的海文(Windows)
1258         越南文(Windows)
20866        西里尔文(KOI8-R)
21866        西里尔文(KOI8-U)
28592        中欧(ISO)
28593        拉丁文 3 (ISO)
28594        波罗的海文(ISO)
28595        西里尔文(ISO)
28596        阿拉伯文(ISO)
28597        希腊文(ISO)
28598        希伯来文(ISO-Visual)
38598        希伯来文(ISO-Logical)
50000        用户定义的
50001        自动选择
50220        日文(JIS)
50221        日文(JIS-允许一个字节的片假名)
50222        日文(JIS-允许一个字节的片假名 - SO/SI)
50225        韩文(ISO)
50932        日文(自动选择)
50949        韩文(自动选择)
51932        日文(EUC)
51949        韩文(EUC)
52936        简体中文(HZ)
65000        Unicode (UTF-7)
65001        Unicode (UTF-8)

也可通过 DOS 命令查看当前编码:chcp

修改当前 DOS 窗口的编码:chcp 对应编码的代码页,如chcp 936,当控制台不支持中文时,可以试试。(重新打开 DOS 窗口时会失效,恢复原来默认编码)

修改系统编码

如果是 Windows10,打开设置(Windows i),时间和语言/语言/管理语言设置/更改系统区域设置,

老版本的使用控制面板/时钟和区域/区域/管理/更改系统区域设置。

下面还有 beta 版(即测试版),使用 UTF-8 编码提供全球语言支持;但有些地方莫名其妙的乱码,不建议尝试,还是 GBK 靠谱。

作者:「已注销」,内容:修改 cmd 控制台默认代码页编码的几种方法【GBK、UTF-8】,https://blog.csdn.net/gulang03/article/details/81771343

2.3.7 使用 API 文档

解决了中文乱码后,来看看 rt.jar 包中的类、方法、字段上的文档注释生成的 API 文档。

JDK8 API中文文档:https://www.matools.com/api/java8

就是记不住方法名怎么办,翻阅 API 文档查看方法的作用,你得首先记住哪个类好像有这个方法。

Java 语言提供了大量可供使用的基础类,为这些类提供了对应的 API 文档,告诉开发者如何使用此类,以及方法。

通过包名 -> 类名 -> 方法这样的方式寻找。

以 JDK8 为例,哦,对了,将最上面的广告关掉。

如果不知道类在哪个包下,点击最上方的索引(INDEX)

如我要用 Math 类的求绝对值的方法,如果事先知道它在 java.lang 下(第一横线处下翻),找到后点击 java.lang,继续下翻(第二个横线处);找到后点击 Math,再看右边的页面,下翻;点击 abs 方法,就可以看到此方法的详细说明。

打开 rt.jar(jre 的 lib 下) 也可以看到 Math.class。(使如果你没有软件可以打开 zip,win-rar 解压缩软件下载地址在资源地址中)

你说这是字节码文件,根本看不懂,要看源码上的文档注释。好吧,在 JDK 安装目录下,打开 src.zipjavalangMath.java

以这种方式,的确没有 API 文档访问方便不是吗?(养成在方法上写文档注释的好习惯,这样方便提取出来)

这是谷歌翻译:

代码语言:javascript复制
返回 {@code float} 值的绝对值。
* 如果参数不是负数,则返回参数。
* 如果参数是否定的,则返回参数的否定。
* 特别案例:
* <ul><li>如果参数是正零或负零,则
* 结果为正零。
* <li>如果参数为无穷大,则结果为正无穷大。
* <li>如果参数为 NaN,则结果为 NaN。</ul>
* 换句话说,结果与表达式的值相同:
* <p>{@code Float.intBitsToFloat(0x7fffffff & Float.floatToIntBits(a))}
*
* @param a 要确定其绝对值的参数
* @return 参数的绝对值。

2.x 总结回顾

编译与运行

先编译成 .class 文件,后运行此类的 main 方法。

运行期类加载器(Class Loader)将 class 文件加载到 JVM 中,JVM 启动解释器对 class 文件解释,生成的机器码在内存中,由操作系统执行。

class 文件是与平台无关的中间代码。下载对应平台的 JVM,由它自带的解释器,将 class 文件翻译成当前操作系统可以执行的机器码,做到一次编写,可以在不同的平台上运行。但 JVM 不跨平台。

程序员可以命名的单词是标识符,如类名、方法名、变量名、接口名、常量名。

命名规则

  • 只能由数字、字母、_、$组成。
  • 不能以数字开头。
  • 不能以关键字作为标识符。

命名规范

  • 类名、接口名首字母大写,之后每个单词首字母大写。
  • 方法名、变量名首字母小写,之后每个单词首字母大写。

注释

合理使用注释,解释代码含义,方便他人阅读。

  • 类和方法上的注释,使用文档注释。
  • 类中、代码块中使用多行或单行注释,对难以理解的地方进行说明。
  • 不同逻辑的代码之间空行隔开。

编码

使用 UTF-8 格式编写源文件更通用。

2.y 脑海练习

2.1 为什么 Java 代码可以做到一次编译,到处运行?

2.2 一个源文件可以生成多个 class 文件吗?

2.3 Java 源文件定义的类名必须与文件名一致吗?

参考答案

第一章答案

1.1 JDK 和 JRE 的区别?

JVM(Java Virtual Machine)Java 虚拟机,Java 程序需要运行在虚拟机上,根据不同平台的虚拟机,能够实现跨平台的功能。(编译一次,生成的字节码文件可以在不同平台运行)

JDK(Java Development Kit)Java开发工具包,包含了 JRE 和开发工具(javac.exe、javadoc.exe、javap.exe 等),不仅可以运行 Java 程序,也可以开发 Java 程序。

JRE(Java Runtime Environment)Java运行环境,包括 JVM、核心类库(常用类)等。

JDK 中包含 JRE,如果只想运行 class 文件,JRE 就足够。

JDK > JRE > JVM


1.2 什么是编程?

编程:解决某个问题而使用某种编程语言编写程序代码控制电脑得到结果的过程。

使用高级语言编写的源代码需要进行编译或解释,能够让操作系统识别,理解你的意图,接收一系列的指令去一步步操纵硬件工作,最终解决某个问题。


1.3 Swing 组件是什么?

Swing 包含了构建图形界面(GUI)的各种组件,如按钮、标签、窗口、面板、文本框等组件。你现在看到的 QQ、微信等软件就是一个图形界面,里面是各种类型的组件组成。


1.4 JAR 包是什么?

jar 包也称类库。源码编译后生成对应的 .class 字节码文件,为了完成某些功能通常需要多个 .class 文件的配合。jar 包主要对多个 .class 文件打包,类似 zip 压缩格式的文件,但不同的是 jar 多了 META-INF/MANIFEST.MF 文件,里面有 jar 包的创建人、版本等信息;若是可执行的 jar 包(有 main 方法),会包含 Main-Class 属性,表示 main 方法在哪个类中。


1.5 软件与程序指的是什么?

软件可以完成特定的功能,可以理解为应用程序的集合。而应用程序是软件的一个组成部分,它是软件的必要元素。简单来说,软件 = 程序 文档 = 数据结构 算法 文档。

程序指计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合。


1.6 什么是编译型语言和解释型语言?

使用计算机语言(一大串二进制数)或汇编语言,一个指令只能对应一个操作中的一个细微的动作,太繁琐,不利于记忆,容易出错,开发效率极低。计算机语言能够被计算机直接识别,执行效率最高。(面向机器)

后来生成了高级语言,方便让人类理解,开发效率高。但是编写的源代码不能被机器识别,需要翻译成机器可以识别的语言,请看下答的平台无关性


1.7 Java 语言特性?

1)面向对象

面向对象虽然执行效率没有面向过程高,但是以类的方式管理大量代码时(一个类中有变量、方法、代码块、内部类),更加方便程序员组织和管理代码,思路更清晰不易出错。

由此才有了对象、继承、封装、多态等概念。

① 对象:使用类为模板指定参数创建的实例,通过实例可以调用类中定义的方法、访问类中的字段,不会混乱。

② 继承:解决多个类中重复出现的代码,只要继承了一个类,自动拥有这个类的全部字段和方法。(私有、构造器、静态、final除外)

③ 封装:为了保护数据,不被错误的修改;在类、字段、方法上添加访问权限修饰符,如 private,只允许在本类中访问,再提供公开的 set 与 get 方法以供别人修改(在方法中可以添加判断逻辑来决定是否赋值)或访问本类的字段。此外还有包机制可以管理大量的类,可以区分两个同名类、将类似功能的类放在同一个包下…

④ 多态:子类继承了父类,但不满意父类的方法实现,可以重写此方法,表面是父类型,但可能底层为子类实例,调用的方法是子类重写后的方法,展现了不同的结果。

① 对象:把自己当作上帝,想要创建一只狗,想一想狗的特征、行为有哪些,在类中定义字段用以保存狗的颜色、大小、品种信息,定义方法体现狗的行为。

代码语言:javascript复制
public class Dog { 
   
    //private私有化,防止坏人直接修改狗的年龄
    private int age;//定义age变量用以保存年龄
    private String name;//name保存姓名
	
    //方便别人访问狗的年龄,但不允许修改就不提供set方法
    public int getAge() { 
   
        return this.age;
    }
    
    //狗吃饭时的表现
    public void eat() { 
   
        System.out.println(this.name   "开心地摇起了尾巴!");
    }
    //有参构造器略
}

然后使用 new 关键字创建狗,同时指定狗的初始属性值。

new Dog(3, "土狗");

② 继承:想一想子女能够继承父母的财产吧。

③ 封装:父母可不能什么都让你访问,总要有自己私人的东西吧。

④ 多态:你老爸有事不能去了,你可以代替老爸,以他的身份参加这次宴席,你要是不满意老爸继承给你的如何为人处事的方法,可以使用自己的方法应对这些客人。

代码语言:javascript复制
Father huYingJun = new Father();
huYingJun.call();// 您好啊,真高兴见到你。

Father huTuTu = new Son();
huTuTu.call();// 我会动耳神功,你要看吗?

当然你如果不想使用面向对象,嫌麻烦还要设计字段、方法,也可以把所有变量、方法都塞进一个类中,只是看着乱糟糟的,不好维护。(代码量很少时,没有必要使用面向对象)

2)平台无关性

编写出的代码不可直接被机器识别,需要工具进行转换。

先讲编译器与解释器的区别:

① 编译器将源代码一次性全部翻译,生成一个二进制码文件,这个文件可以直接被机器识别,执行效率高。如果源代码改动需要重新编译生成新的二进制码文件。

② 解释器将源代码逐行解释成特定平台的机器码,解释一行执行一行。每次执行都需要翻译,跨平台性好。

Java 的做法:

③ Java 源代码会被编译成字节码文件,这个字节码文件是与任何平台都无关的中间代码,由 JVM 启动解释器翻译成对应平台上的机器码,所以一份字节码可以在任何平台上运行。前提:不同平台上要安装对应的 JVM,JVM 不跨平台。

之所以这么做,是 Java 既想保持解释语言的跨平台性(可移植性),又想解决解释语言执行效率低的问题。

但效率还是不如编译性语言。为了避免解释型语言带来的执行效率低的问题,Java 设计者制作了 JIT(just in time compilation)实时编译程序,将运行频率很高的字节码直接编译为机器指令执行来提高性能。

① 给一个英语文件,你看不懂,有人直接将英语文件翻译成汉文,将翻译的结果保存在一本书中,给你发过去;这样你每次就直接看这本翻译后的书即可,缺点是原著改了,你又需要请他翻译一下。

② 有人跟在你身边,你看一句,他就说一句这是什么意思;即使你换了一本英语书,他照样解释给你听,只不过效率低。

③ 有的人没有直接翻译成汉文,而是记录了源文件的重要信息、文章主题、中心思想、具体脉络等,再以后看到这份批注,能够迅速理解原文含义,get 到这个点,能够不假思索说给你听。

后来发现也挺麻烦,他干脆挑出你最喜欢、频繁看的部分,将这部分先翻译好了,等你需要看别的地方时,再请教他。

所以不要纠结这个语言究竟是编译执行、还是解释执行,没有多大意义。

3)支持多线程

a)线程与进程

① 进程:每个运行的程序都会开启一个独立的进程,如 QQ、酷狗音乐;操作系统为进程分配内存空间。

② 线程:由线程创建,是线程的最小执行单位,一个进程至少有一个线程,用以完成任务。比如迅雷同时下载多个文件、QQ 打开多个窗口等,多个任务同时执行。

单线程:一个进程同一时刻只有一个线程。

多线程:同一时刻有多个线程用以完成任务。

b)CPU 处理线程的方式

① 并行:同一个时刻,多个任务同时执行(多个 CPU)

② 并发:同一个时刻,多个任务交替执行(单个 CPU),通过 CPU 调度,速度十分快,造成貌似同时执行的错觉。

③ 串行:按先后顺序依次执行任务,一次只做一件事。后面的任务想要执行,必须等前面的任务执行完毕。

① 并行:吃饭时来了电话,你叫老婆接,自己吃饭;接电话与吃饭同时执行。

② 并发:吃饭时来了电话,边吃饭边接电话,感觉像是同时,但是不可能真正在同一个时刻做到吃饭和说话,这样会呛到鼻子去。

③ 串行:吃饭时来了电话,先吃完饭,再打电话。

并发和并行可以同时存在,比如两个 CPU,一个 CPU 在处理 QQ 线程,另一个 CPU 来回切换处理浏览器和音乐播放器。

c)线程之间的关系

① 同步:一个线程需要等待另一个线程执行完毕,返回了消息,才能继续往下运行。

② 异步:一个线程 A 对另一个线程 B 发起请求,可以不用等待 B 返回消息,因为 B 线程执行完后会通知你,你直接去干别的事情了;等到接受通知后,再处理。

d)单个线程的状态

① 阻塞:一个线程在等待的过程啥也不干。

② 非阻塞:没必要一直等待,可以干别的事。

同步阻塞:快递员给你打电话,说楼下有你的快递;当你没拿之前,他就一直在原地等你,不能走开,啥也干不了。

同步非阻塞:快递员给你打电话,说楼下有你的快递;当你没拿之前,他觉得一直在原地等你很无聊,决定跑下步、玩手机、时不时观察你下来了没有、直接上楼…

异步非阻塞:快递员给你发短信,说快递放到菜鸟驿站了;随后没有等你来拿,直接把短信继续发给下一个人。直到你签收后,他那边才接收到消息,然后做相应处理。

异步阻塞:别人拿完快递后,自然会有信息通知你,你完全可以做其他事情,却还在那傻等。

4)安全性

双亲委派机制可以防止恶意加载同名字节码。

5)健壮性

异常处理机制:对可能出现异常的代码实现进行预先处理,防止遇见问题时,程序直接挂掉。

垃圾回收机制:自动清除长时间没使用的对象,防止内存泄漏(内存满了),这也算是简单性吧。

6)简单性

  • 封装、继承、多态很贴近生活。
  • 没有指针这复杂的概念。
  • 只支持类的单继承,多继承可以使用接口实现。
  • 垃圾回收机制,不需要手动释放内存。

1.8 能说下 JavaSE、JavaEE、JavaME 吗?

JavaSE 标准版,包含核心类库。主要用来开发桌面应用,允许在桌面、服务器开发和部署 Java 应用程序。

JavaEE 企业版,帮助企业开发和部署可移植、可伸缩且安全的服务端 Java 应用程序,包括 Web 网页后台开发等。

JavaME 微型版,专门为在移动设备和嵌入设备上运行的应用程序提供一个健壮且灵活的环境。

第二章答案

2.1 为什么 Java 代码可以做到一次编译,到处运行?

编译生成的 .class 文件与具体平台、系统无关。

JVM 虚拟机是关键。程序运行时,由 JVM 负责解释执行 .class 文件,将其翻译成不同平台下的机器码并运行。需要注意的是,.class 文件是与操作系统平台无关的中间代码,不能直接运行。

JVM 不跨平台,不同平台需要安装不同的 JVM。

这么做的目的,在可移植的同时兼顾执行效率。此外还加入了 JIT(just in time)编译器,把运行频繁的代码直接编译成与本地平台相关的机器码,需要时直接使用,不用再次翻译。


2.2 一个源文件可以生成多个 class 文件吗?

可以,源文件只要按规则定义了多个类,编译后会生成多个对应的 class 文件。


2.3 Java 源文件定义的类名必须与文件名一致吗?

不是,只有被 public 修饰的类名必须与源文件名一致。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/158485.html原文链接:https://javaforall.cn

0 人点赞