Java:控制反转(IoC)与依赖注入(DI)

很长一段时间里,我对控制反转和依赖注入这两个概念很模糊,闭上眼睛想一想,总有一种眩晕的感觉。但为了成为一名优秀的Java工程师,我花了一周的时间,彻底把它们搞清楚了。01、紧耦合在我们编码的过程中,通常都需要两个或者更多的类通过彼此的合作来实现业务逻辑,也就是说,某个对象需要获取与其合作对象的引用,如果这个获取的过程需要自己实现,代码的耦合度就会高,维护起来的成本就比较高。我们来通过实战模拟一下。假如老王是少林寺的主持,他想让小二和尚去扫达摩院的地,代码可以这样实现。小二类的代码如下所示:public class Xiaoer {    public void saodi() {        System.out.println("小二我在扫达摩院的地");    }}老王类的代码如下所示:public class Laowang {&n...

温故而知新,重温 Java 7 的那些“新”特性

2009年4月20日,Java的亲生父亲Sun被养父Oracle以74亿美元收购,这在当时可是一件天大的事。有不少同学都担心Java的前途,我当时傻不啦叽地也很担心:自己刚学会如何通过记事本编写Java代码,然后通过cmd打印HelloWorld呢,这一下难道白学了?但其实这种担心是多余的,因为Java并不会陪葬,毕竟行业内有太多基于Java的软件系统在运行,Java牵扯了太多人的饭碗。10年过去了,Java果然没有陪葬,我仍然坚守在Java的阵线上。2011年7月7日,代号「海豚(Dolphin)」的Java7首次推出,这也是Java历史上一次非常重要的版本更新。同时推出了非常多实用的新特性,比如说创建泛型实例时自动类型推断、switch-case语句支持字符串类型、新增try-with-resources语句等等。这么多年过去了,Java7的“新”特性显然都变成老古董了——它们似乎也不需要我再赘述了,但好像不是这样的。前几天我发了一篇文章,用到了其中一个新特性,竟然有同学表示从来没见过这个新特性,特意在交流群里@我,要我说清楚怎么回事...

Java:前程似锦的 NIO 2.0

Java之所以能够霸占编程语言的榜首,其强大、丰富的类库功不可没,几乎所有的编程问题都能在其中找到解决方案。但在早期的版本当中,输入输出(I/O)流并不那么令开发者感到愉快:1)JDK1.4之前的I/O没有缓冲区的概念、不支持正则表达式、支持的字符集编码有限等等;2)JDK1.4的时候引入了非阻塞I/O,也就是NIO1.0,但遍历目录很困难,不支持文件系统的非阻塞操作等等。为了突破这些限制,JDK1.7的时候引入了新的NIO,也就是本篇文章的主角——NIO2.0。01、基石:PathPath既可以表示一个目录,也可以表示一个文件,就像File那样——当然了,Path就是用来取代File的。1)可以通过Paths.get()创建一个Path对象,此时Path并没有真正在物理磁盘上创建;参数既可以是一个文件名,也可以是一个目录名;绝对路径或者相对路径均可。2)可以通过Files.notExists()确认Path(目录或者文件)是否已经存在。3)可以通过Files.createDirectory()创建目录,此时目录已经在物理磁盘上创建成功,...

Java 代码界 3% 的王者?看我是如何解错这 5 道题的

前些日子,阿里妹(妹子出题也这么难)发表了一篇文章《悬赏征集!5道题征集代码界前3%的超级王者》——看到这个标题,我内心非常非常激动,因为终于可以证明自己技术很牛逼了。但遗憾的是,凭借8年的Java开发经验,我发现这五道题自己全解错了!惨痛的教训再次证明,我是那被秒杀的97%的工程师之一。不过,好歹我这人脸皮特别厚,虽然全都做错了,但还是敢于坦然地面对自己。01、原始类型的float第一题是这样的,代码如下:public class FloatPrimitiveTest {    public static void main(String[] args) {        float a = 1.0f - 0.9f;        fl...

我竟然不再抗拒 Java 的类加载机制了

很长一段时间里,我对Java的类加载机制都非常的抗拒,因为我觉得太难理解了。但为了成为一名优秀的Java工程师,我决定硬着头皮研究一下。01、字节码在聊Java类加载机制之前,需要先了解一下Java字节码,因为它和类加载机制息息相关。计算机只认识0和1,所以任何语言编写的程序都需要编译成机器码才能被计算机理解,然后执行,Java也不例外。Java在诞生的时候喊出了一个非常牛逼的口号:“WriteOnce,RunAnywhere”,为了达成这个目的,Sun公司发布了许多可以在不同平台(Windows、Linux)上运行的Java虚拟机(JVM)——负责载入和执行Java编译后的字节码。到底Java字节码是什么样子,我们借助一段简单的代码来看一看。源码如下:package com.cmower.java_demo;public class Test {    public static void main(String[] ...

Java Serializable:明明就一个空的接口嘛

对于Java的序列化,我一直停留在最浅显的认知上——把那个要序列化的类实现 Serializbale 接口就可以了。我不愿意做更深入的研究,因为会用就行了嘛。但随着时间的推移,见到 Serializbale 的次数越来越多,我便对它产生了浓厚的兴趣。是时候花点时间研究研究了。01、先来点理论Java序列化是JDK1.1时引入的一组开创性的特性,用于将Java对象转换为字节数组,便于存储或传输。此后,仍然可以将字节数组转换回Java对象原有的状态。序列化的思想是“冻结”对象状态,然后写到磁盘或者在网络中传输;反序列化的思想是“解冻”对象状态,重新获得可用的Java对象。再来看看序列化Serializbale接口的定义:public interface Serializable {}明明就一个空的接口嘛,竟然能够保证实现了它的“类的对象”被序列化和反序列化?02、再来点实战在回答上述问题之前,我们先来创建一个类(只有两个字段,...

教妹学 Java:动态伴侣 Groovy

​ 00、故事的起源“二哥,听说上一篇《多线程》被CSDN创始人蒋涛点赞了?”三妹对她提议的《教妹学Java》专栏一直很关心。“嗯,有点激动。刚开始还以为是个马甲,没想到是真人!”“其实蒋涛点赞的文章很多很多了,二哥的只是其中一篇而已。”三妹出乎意料地泼起了冷水。“你说得没错。但这的确给我注入了新的能量,蒋涛毕竟是业界的大佬啊。”“那就让我们开始新的篇章吧!我继续来提问,二哥你继续回答。”三妹已经迫不及待了。01、二哥,什么是Groovy啊?三妹啊,听哥来给你慢慢讲啊。Groovy是一种面向对象的动态类型语言,跟Java一样,可以运行在JVM上。之所以称Groovy为“动态”类型语言,是因为Groovy的语法源于Smalltalk和Ruby,提供了比Java更简单、更灵活的语法,可以在运行时动态地进行类型检查。Java语言是一种固定类型语言,比如说整形变量inta=0;,字符串变量Strings="Wanger"。但在Groovy中,...

教妹Java:难以驾驭的多线程

00、故事的起源“二哥,上一篇《集合》的反响效果怎么样啊?”三妹对她提议的《教妹Java》专栏很关心。“这篇文章的浏览量要比第一篇《泛型》好得多。”“这是个好消息啊,说明更多人接受了二哥的创作。”三妹心花怒放了起来。“也许没什么对比性。”“没有对比性?我翻看了一下二哥7个月前写的文章,是真的水啊,嘻嘻。”三妹卖了一个萌,继续说道,“说实话,竟然还有读者愿意看,真的是不可思议。”“你是想挨揍吗?”“别啊。我是说,二哥现在的读者真的很幸运,因为他们看到了更高质量的文章。”三妹继续肆无忌惮地说着她的真心话。“是啊,比以前好多了,但我还要更加地努力,这次的主题是《多线程》,三妹你准备好了吗?”“早准备好了。让我继续来提问吧,二哥你继续回答。”三妹已经跃跃欲试了。01、二哥,什么是线程啊?三妹,听哥给你慢慢讲啊。要想了解线程,得先了解进程,因为线程是进程的一...

蓦然回首,Java 已经 24 岁了!

01、蓦然真没想到,Java竟然24岁了(算是90后)!提起Java,印象最深刻的当然就是:class Cmower {  public static void main(String [] args) {    System.out.println("Hello Word");  }}我闭着眼睛敲了一遍,感觉指尖与键盘又呼应到了:还是那种熟悉的感觉!02、回首我是2008年上的大学,专业是计算机网络,被调剂的——这间接地证明了:第一,我当年压根就不知道报考的学校还有计算机网络专业,在这之前根本不懂互联网,唯一挂得上勾的就是用过QQ。第二,计算机网络专业是最不被学校重视的专业,所以才能调剂到。那时候,建筑专业、电力专业是最被看好的专业。第三,我的高考成绩不很理想。既然高考成绩不理想,自然对未来也就很迷茫。那时候,完全不知道自己未来能做什么,更预料不到自己会成为一名Java程序员,一干就干到现在。...

教妹学 Java:大有可为的集合

00、故事的起源“二哥,上一篇《泛型》的反响效果怎么样啊?”三妹对她提议的《教妹学Java》专栏很是关心。“有人评论说,‘二哥你敲代码都敲出幻想了啊。’”“呵呵,这句话充斥着满满的讽刺意味啊。”三妹有点难过了起来。“不过,也有人评论说,‘建议这个系列的文章多写啊,因为我花了半个月都没看懂《Java编程思想》中关于泛型的讲解,但再看完这篇文章后终于融会贯通了,比心。’”“二哥,你能不能先说好消息啊?真是的。我也要给这位暖心的读者比心了。”三妹说完这句话就在我面前比了一个心,我瞅了她一眼,发现她之前的愁容也无影无踪了。“那接下来,二哥还要继续写吗?”我看到了三妹深情的目光。“嗯,我想该写集合了。”“那就让我继续来提问吧,二哥你继续来回答。”三妹已经跃跃欲试了。01、二哥,什么是集合啊?三妹,听哥慢慢给你讲啊。JDK1.2的时候引入了集合的概念,用来包含一...

教妹Java:晦涩难懂的泛型

00、故事的起源“二哥,要不我上大学的时候也学习编程吧?”有一天,三妹突发奇想地问我。“你确定要做一名程序媛吗?”“我觉得女生做程序员,有着天大的优势,尤其是我这种长相甜美的。”三妹开始认真了起来。“好像是啊,遇到女生提问,我好像一直蛮热情的。”“二哥,你不是爱好写作嘛,还是一个Java程序员,不妨写个专栏,名字就叫《教妹Java》。我高考完就开始跟着你学习编程,还能省下一笔培训费。”三妹看起来已经替我筹划好了呀。“真的很服气你们零零后,蛮有想法的。刚好我最近在写Java系列的专栏,不妨试一试!”PS:亲爱的读者朋友们,我们今天就从晦涩难懂的“泛型”开始吧!(子标题是三妹提出来的,内容由二哥我来回答)01、二哥,为什么要设计泛型啊?三妹啊,听哥慢慢给你讲啊。Java在5.0时增加了泛型机制,据说专家们为此花费了5年左右的时间(听起来很不容易)。有了泛型之后,尤其是对集合类的使用,就变得更规范了。看下面这段简单的代码。A...

开源)嗨,Java,你可以生成金山词霸的二维码分享海报吗?

Aslongasyoucanstillgrababreath,youfight.只要一息尚存,就不得不战。有那么一段时间,我特别迷恋金山词霸的每日一句分享海报。因为不仅海报上的图片美,文字也特别美,美得让我感觉生活都有了诗意。就像文章开头的那句中英文对照,中文和英文都妙极了。最近,又有很多人迷恋上了流利说的小程序分享海报(朋友圈比比皆是)。但不管是金山词霸还是流利说,分享的海报都不是自己的二维码,这对于个人品牌的缔造者来说,实在是一件出力不讨好的事。当然了,这种事难不倒作为程序员的我。这一篇文章我们就用Java来生成一下仿金山词霸的海报。01、大致思路采集网络图片加载海报背景和个人品牌二维码利用Graphics2D将网络图片绘制成海报封面利用Graphics2D在海报上打印中英文对照语利用Graphics2D在海报上绘制个人专属二维码使用Swing构建图形化界面将项目打成jar包发行运行jar包,填写必要信息后生成海报02、采集网络图片第一步,获取网络图片的路径。金山词霸每日一句的图片路径地址形式如下所示。可以根据当前日期获取最新的图片路径。// 金山词霸的图片路径Strin...

Java:接口和抽象类,傻傻分不清楚?

 01、来看网络上对接口的一番解释:接口(英文:Interface),在Java编程语言中是一个抽象类型,是抽象方法的集合。一个类通过继承接口的方式,从而来继承接口的抽象方法。兄弟们,你们怎么看,这段解释把我绕得晕乎乎的,好像喝过一斤二锅头。到底是解释抽象类呢还是接口呢?傻傻分不清楚。搞不清楚要用抽象类还是接口,就先来看看两者之间的区别。来,抽象类和接口,你俩过来比比身高。抽象类中的方法可以有方法体,能实现方法具体要实现的功能,但是接口中的方法不行,没有方法体。抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是publicstaticfinal类型的,并且是隐式的,缺省的。接口中不能含有静态代码块以及静态方法(用static修饰的方法),而抽象类是可以有静态代码块和静态方法的。一个类只能继承一个抽象类,而一个类却可以实现多个接口。02、好像知道了两者之间的区别,但印象还是有些模糊。没关系,我们进一步深入。抽象类抽象类体现了数据抽象的思想(不然呢),是实现多态的一种机制。抽象类定义了一组抽象的方法,至于这组抽象方法的具体表现形式由子类来继承实现。抽象类就是用来继承的,...

Java:并发不易,先学会用

我从事Java编程已经11年了,绝对是个老兵;但对于Java并发编程,我只能算是个新兵蛋子。我说这话估计要遭到某些高手的冷嘲热讽,但我并不感到害怕。因为我知道,每年都会有很多很多的新人要加入Java编程的大军,他们对“并发”编程中遇到的问题也会有感到无助的时候。而我,非常乐意与他们一道,对使用Java线程进行并发程序开发的基础知识进行新一轮的学习。01、我们为什么要学习并发?我的脑袋没有被如来佛祖开过光,所以喜欢一件事接着一件事的想,做不到“一脑两用”。但有些大佬就不一样,比如说诸葛亮,就能够一边想着琴谱一边谈着弹着琴,还能夹带着盘算出司马懿退兵后的打算。诸葛大佬就有着超强的“并发”能力啊。换做是我,面对司马懿的千万大军,不仅弹不了琴,弄不好还被吓得屁滚尿流。每个人都只有一个脑子,就像电脑只有一个CPU一样。但一个脑子并不意味着不能“一脑两用”,关键就在于脑子有没有“并发”的能力。脑子要是有了并发能力,那真的是厉害到飞起啊,想想司马懿被气定神闲的诸葛大佬吓跑的样子就知...

Java注解(Annotation):请不要小看我!

Java中,并不是所有的类型信息都能在编译阶段明确,有一些类型信息需要在运行时才能确定,这种机制被称为RTTI,英文全称为Run-TimeTypeIdentification,即运行时类型识别,有没有一点“知行合一”的味道?运行时类型识别主要由Class类实现。Java注解是一系列元数据,它提供数据用来解释程序代码,但是注解并非是所解释的代码本身的一部分。注解对于代码的运行效果没有直接影响。网络上对注解的解释过于严肃、刻板,这并不是我喜欢的风格。尽管这样的解释听起来非常的专业。为了缓解大家对“注解”的陌生感,我来说点有意思的。其实我对“注解”这个词的第一印象并不是Java的注解,而是朱熹的名作《四书章句集注》。为什么我会有这么大的脑洞呢?因为当我试着去翻译Annotation这个单词的时候,得到的结果是“注释”而不是“注解”。《四书章句集注》正是朱熹对《大学》、《中庸》、《论语》、《孟子》四书做出的重要的注释。要知道,该书可是明清以后科举考试的题库和标准答案!注解(...
首页上一页...566567568569570...下一页尾页