0.引子
我们的这个世界上,存在这么一种东西:
- 第一:它不占据任何3D之体积,即它没有Volume
- 第二:它也不占据任何2D之面积,即它没有Area
- 第三:它也不占据任何1D之长度,即它没有Length
总之,从空间的角度看,它不具有任何尺寸。
而且,从通用哲学的角度来讲,这种东西,不是一种精神实体;从专业哲学的角度讲,它也不是一种物理学意义上的物质实体。它不是物理意义上的物质,也不具有空间尺寸,但它确实存在,而且不是存在我们头脑的想像当中,因为它不是精神实体,但它确实存在,客观存在,而且某种意义上讲它们都是独立存在的。
你可能就要问我了,这是啥东西,那我们可以告诉你,它就是时空意义上的点(point)。 - 时间意义上的点,是如此的;
- 空间意义上的点,也是如此的;
不容否认,它们是客观存在的,某种意义上讲,也是独立存在的。因此,从哲学角度上讲,时空上的点(point)可以归类为客观实体的一种。
这种点,我说的这种——点(point),给人一种佛教所说的“空”的感觉,空,不是绝对的无,空,也是一种存在。
- 你说它空吧,佛家说,色即是空,万法皆空,只要是色,即是空,它真的很空;
- 你要说它空吧,佛家说空即时色,空就是色呀,你说它空也不空。
于是乎,很多人对于佛家说的空,一头雾水。比我说的,不占据任何体积、面积甚至几何尺寸的东西——点,还要玄乎,令人难以理解。但那人却在那里使劲说,它存在,它真的存在,而且独立地存在。
1.Java之空
1.1 寻找空的感觉,寻找对立的范畴
Java在设计上,或编程要求上,也有一种空,叫面向抽象编程,或面向接口编程。
这是一种设计之道,编程之道,其道就是“空”。
如果你理解“空”,对“空”特别敏感,特别有感觉,你就会发现,Java明明大行其道,反复强调的一种东西,叫OOP,是面向对象编程,而对象是具体的,不是抽象的,再次强调,是具象的。因此,应当叫面向具象编程,而不是面向抽象编程呀?当我说面向抽象编程时,你一定马上就要反驳我了呀,但我说,如果你对“空”天生有感觉,你就会会心一笑。因为你知道,Java之道,其道为“空”。
你会发现,OOP,精髓叫做“面向对象编程”的Java,一旦你要编程时,你更多地,是在设计,所谓编程,叫编程设计,设计点体现在哪?体现在一个东西上面,叫做“类(Class)“。
从哲学意义上讲,一般来说,类(Class)和对象(Object),是天然的一对范畴。
- 类(Class)——代表的是抽象,是空泛的存在,是共性的抽取,是公共的表达
- 对象(Object)——代表的是具象,是具体的存在,是个性的存在,是独立的表达
通常在学Java面向对象内容之初。我们通常喜欢举这样一些例子:
【1】比如说,狗,是一种类;那一条黄狗,则是一个对象,是具体的一条狗;
【2】又比如,在这个世界上,你找不到任何“树”这种东西,因为“树”是一种类;在这个世界上,你只能找到一棵棵的树,而看不到“树”本身。
【3】还有呀,老师还会说,类(Class)就像造车的图纸,对象(Object)就是具体的一辆辆车子,一个个铁皮盒子
所以呀,一个车子的类(Car),可以对应一辆车子( car),也可以对应两辆车子(two cars),还可以对应几十辆车子(dozens of cars)、成百上千或成千上万辆车子(thousands of cars)、许许多多车子(many cars or numerous cars),甚至无数辆车子(Countless cars),…嗯?好奇怪呀。
是的,如果对于哲学无感的人,当老师在那讲,“树”在这个世界上是不存在的时候,就会觉着好奇怪呀,这类人,如果你和他讲“白马非马”这种哲学命题,就会变得非常困难,因为他的脑子在抽象与具象和共性与个性之间转不过弯来,而且他们往往在语言的精微表达控制方面水平不是很高。但如果你对哲学略有那么一点感觉,即使你最初觉着奇怪,你也会马上反应过来,你会觉着,其实,一点都不其怪。原因很简单:
- 类:是一种归纳和抽象,所谓抽象,就是把象去掉了,抽象掉了,个性化的东西去掉,保留的是共性,论的是性,而不是摆弄具体的一件件、一样一样的东西
- 对象:才是那个独立存在的、分散的开来的,千千万万的实在的东西,那个一个个的充满个性的象,差异化的象,那一个个的体
归结起来,我们会发现——类和对象,有这样一些相对的或相反的特征
- 0------------------类--------------------------------------------------------对象
- 1------------------共性-----------------------------------------------------个性
- 2------------------抽象-----------------------------------------------------具象
- 3------------------1或少----------------------------------------------------多
- 4------------------类似模具、图像,处于上层、源头---------------类似产品,下层、产物
- 5------------------时间上的先有,空间逻辑上的前者---------------时间上的后有,空间或逻辑上的后者
- 6------------------聚合性---------------------------------------------------散落性
- 7------------------非真实存在,或另一种存在-----------------------真实存在,具体存在,一个个地存在
- 8------------------空泛-----------------------------------------------------实有
你可能会找到更多的感觉,或相对的范畴或特征,来分别对应类(Class)和对象(Object)
1.2 我们再来看两样东西
1.2.1 消失的点:最后,连影子都没有了
第一个:是来看一个美术上的知识,叫透视。
在西洋画的焦点透视画法,那个聚焦的焦点,叫消失点,也叫没影点。往往一副画,就是一个视角下的一方世界,但无论画什么,只要是焦点透视画法,无论是一个焦点,还是两个焦点,还是多个焦点,你会发现,在一定的视角下,事物好像具有某种趋势,向着某个方向对齐,并不断由近及远归于虚、归于空,甚至有点归于无的样子。那些个聚焦的焦点,可是叫消失点,没影点哦,开始你看到的是美丽的画面,看到是象,看着看着,就看到了背景,看到了远方,看到了不断聚拢的趋势,不断缩小的范围,最后越来越虚,变成了影子,变成了点,最后,再认真一想,点也没了,于是,你才会对没影点或消失点会心一笑。
这会让人想起一个古老的故事:一个老师拿来一个容器(比如一个罐子),容器里装满了大石头,老师就问学生容器有没有装满,起初无感的大部分学生就说,装满了,大石头的顶部都已经超出来容器口了,可是老师又往容器里放了很多小石头进去,又问学生满了没有,还有许多无感的学生又在说,满了满了,老师又往里边放沙子,又问。。。老师又放了些烟尘灰土进去。。。又问。。。又往里倒水。。。
是的,最后水也溢出来了,到底满了没有满,还装不装得下?
大石头–>小石头–>沙子–>灰尘–>水
满了没有满,还装不装得下?还震撼不震撼,震惊不震惊?
就像压缩文件一样,已经压缩了好多次了,那个搞压缩技术的人还在不断地思考着:可不可以再压缩10%,再压缩…
把地球、月亮、太阳、整个银河系,不,把整个宇宙,压缩到一个点上,放进一个小小的罐子那么小的容器里边,可不可以,而且要把99%的容器空间腾出来,可不可以?
如果你接触过宇宙大爆炸理论,即便你先前没有思考过类似的问题,你也许也会追问起来:
时间的原点,宇宙的奇点,有没有找到,自己的想像力枯竭了没有,还有没有胆子再往下想像一下,这可能吗?依据究竟为何?
没有翅膀的人,可不可以想像自己也能飞翔,并最终像白天鹅一样御风飞起来呢,翱翔于长空,又或者翱翔于太空,行不行
木质化的、缺乏灵性的脑袋,是很难理解和想像那些天才的科学家、发明家是如何思考问题的,就像很难理解一个优秀的诗人写下的诗句一样;但那些稍有灵性的人,只要有人稍加点拨,便也能理解什么是天使来过,那个天赋异禀的人就开了挂了。天才和伟大的人物,与普通的人往往只差几步的距离——关键的几步——每一步都是质变、或突变,是灵光乍现,是革命性的转折。上帝说要有光,于是就有了光。有些人对此很难理解。有的人对此则会拈花一笑,不是吗?…
水里的鱼,天上的鸟,云影下河岸上的人,究竟谁真正站在岸上,谁真正在理想的王国里飞翔,又或者说谁在更高的维度里拥有可能性,比如想像与创造的能力,又比如说,抽象的能力,不,不只是简单地抽象,而是反复地抽象
也许有人又要问了:抽象了为什么还要反复地抽象,不是抽象过了吗?我就会对那人说:你不要扑腾到水里边去,弄得自己浑身湿漉漉的,你要站到岸上来,看鱼在水中游,看云影天光,就像人类要创造的牛B克拉斯的元宇宙一样,你要一手创造的一切的一切都在元宇宙——这个宇宙——之中,但你要在元宇宙之外,然后再像上帝一样,道成肉身(这是基督教的语言,另一个译法是:言成肉身),入世作为。
是呀,道成肉身(或言成肉身)呀,就像你在写程序时,你有没有一种创世的感觉,那时你就是上帝,自己给了自己一个任务,7天创建宇宙,创建整个世界和人类,最后一天还得有时间休息一下。然后,你就在那里噼里啪啦地敲代码,确切地说,是敲一行一行的语句(statement),包括流控制语句之类的各种语句,总之,设一行语句,就像说一句话,而这些语句堆砌之下,最终就产生了各种功能,就像一个巫师在言语,他召唤的一切会在他念咒的时候,纷纷来到他的身边。不过,当你敲出一个类似CS或CF那样射击游戏的时候,你会发现,游戏里的人,只能射死游戏里的人,永远射不到你,因为,你站在更高的维度,站在岸上,而大海奔流、热辣滚烫,无论游戏如何喧嚣与沸腾,那都是游戏自身在喧嚣与沸腾,而你,应当像发明Java的高司令(高斯林)一样,抽身于想像的风暴之外,悠哉游哉地端起一杯coffee,品味着时光的味道…
你知道吗?当你站在更高的维度、站在高岸上的时候。你就相当于变成了前面提到的画面中地平线上的一个点,或者变成背景,又或者变成了背景背后的存在,或者说,此刻,你变成了上帝,或上帝一般的存在。只有你能够理解什么是绝对的无中生有,什么是宇宙大爆炸的奇点或绝对原点,理解一个点包含的所有内容
下面,我举个例子,希望你在看了后边的内容之后,能理解我在说什么:
- 场景1:一个IT的小领导走到他的小迷弟跟前,说:那里有个接口(Interface),你把接口实现(implements)一下
- 场景2:另一个IT领导,对它的小弟是这样说的:小李啊,你去写个接口,然后,把它实现一下
- 场景3:一个较大的IT领导,拍着桌子对它的手下说:小欧呀,这件事情,你自己就不要去做了,你好歹也是一个领导了,你可以把这件事交给小李去做呀,也可以交给小王去做呀,你部门人手够不够,不够你打个申请,我给你加人呀,只要合理我一定会给你批的,你应当做安排分配任务、居间协调、检查进度和质量情况、跟进优化这些工作,然后定时汇报反馈就好,像这么初级的代码,这种具体的工作,你以后就不要写、不要去做了,你是领导呀,这种事情以后就不要我来教你怎么做了呀
- 场景4:有人在了解过和熟知前面3种场景之后,他在想这样几个问题:1)放手而不甩手 2)拍桌子、发脾气和提要求的本质,通常是一样的,即“强制”,也可以叫做“绝对任务” ,他甚至会思考这样的问题 3)要不要把时间卖给自己:如果把时间卖给自己,虽然失去了现在的工作和饭碗,但得到了自由呀…以后,我可不可以也拍拍桌子,然后一切就OK了…如果这也能成,那这一切的本质是什么,还需要在现有的条件或水平上,增加些什么,做出哪些改变、优化或创新,能不能列出一份实现这一切的清单,清单中包括整个可以达成的充要条件
1.2.2 足够抽象之后:时间在进步,历史在发展
第二个:是来追寻一个时间线与道路问题
这是副楼梯的图
但也有人会这样想,这是道路的一种,因为它是人用来走路的。
然后,就会有人在想,这楼梯有什么特点呀,有什么共性没有?
结论就是,如果从上楼梯之前的角度看的话,楼梯都是向上
那,又有人会想,楼梯是道路,道路是不是都是向上的呀?
好像真是的,你看这登山的路,不就是向上的吗?
可是?会有太多的人马上反驳
你看,这楼梯不是向下的吗?不是向下的?你瞎吗?
这道路不是曲折的吗?上山是向上,下山是向下呀,有高也有低呀
而且不同的人走在不同的道路上,人的道路是不一样的呀
但是黑格尔不这样想,黑格尔不这么想。就像中国人学过一点哲学后,都知道一句话:
道路是曲折的,但前途是光明的。是的,据说最早发现这一点的,就是黑格尔。
黑格尔发现所有的人,都行走在一条相同的道路上,这就是时间线,时间的道路。
而且,黑格尔还发现了时间的变化之道,人类的时间这条道路不是完全直线的,
而是曲折的,是的道路是曲折,但这个曲折是一种象,一种表象,一种现象,
这不是人类所拥有的时间的本质,人类拥有的时间的本质,是一条道路,
一种波浪式前进、螺旋式上升的道路,所以,它的前途是光明的,
因为这条道路的趋势是前进和向上的,是充满希望的,所以,人们的时间,
这条道路,拥有了另一个名字,叫:历史。
时间在改变,但风云变幻的历史,在黑格尔的眼中,却有一条主线,叫发展。
黑格尔或马克思称它为:历史在进步!
就像达尔文心中的进化论
就像是旅途中的某个你,发现了真理!
就像 奥古斯丁 说的那样:大地上有无数的溪流,有的向南,有的向北,有的向西,有的向东,甚至流向各个方向,但最终,它们都会不断汇聚,无论向哪个方向流动,它们最终都是在流向前。就像中国人说的:大河奔腾,百川归海!是的,这是趋势,当社会不断发展,当人们不断地觉醒,当越来越多的人地拥有了生活的希望,每个人的心中,都有一片大海。
注:奥古斯丁,古代的一位天主教神学家、思想家,天主教圣师,教父哲学代表人物。其地位,有点类似于儒家(孔教)的孔子、亚圣孟子、王阳明之类的人物,就是在宗教方面,其思想的光辉照耀大地,后脑勺闪闪发光的那种人,大宗师级别的人物。
1.3 Java设计之道:空的趋势
相对于对象来说,类是抽象的;相对于普通的类来说,抽象类更加地抽象;相对于类而言,接口是一种特殊的类,它特别特别地抽象。
所以,我们可以画一个图,对Java的整个体系的设计,会看得更加地清楚:
所以:
- Java的面向抽象编程,并不是简单地说可以说成是面向抽象类编程。佛家有一种说法,叫着象,如果你把面向抽象编程,说成是面向抽象类编程,就有一点着象了,不太准确了
- 但Java的面向抽象编程,说成面向接口编程是可以的。因为三点:
- 一是Java语言整个设计体系结构中,接口是最抽象的,在抽象方面,是最具代表性的;
- 二是Java语言的整个体系结构中(接口-抽象类-类-对象),某种意义上讲,接口可以说是处于最上层的;
- 三是接口的本质,是一堆待实现或待完成的功能或任务清单,是一堆抽象方法的集合,更多地体现出强制性来;
你听懂了我的意思没有?
就是说,接口,就像单位里的领导,越大的领导,越不干活(不干具体的活、不干脏活累活),大领导都是个啥样子?两点:
- 越大的领导,越是神龙见首不见尾
- 越大的领导,越是不干活,反过,只是给下面的人派任务清单
真应了《道德经》说的话,叫:大象无形,大什么如何如何,总之大体都一个意思
扯的有点远,我们还是回归到哲学的话题,或Java技术的话题吧
总之,就是Java的设计,或对Java程序员的要求就是,要面向接口,面向抽象编程
当你抬头的时候,你会发现,你头顶的,是比大海还要大的天空
尤其是深晚,而且夜越晚,天空越深,同样的那片天空,变成了深不见底的深空,黑窟窿冬
总之,呀,领导务虚,你务实。如果你也要成为领导,你也就要学会务虚
这就叫:历史在进步,社会在发展,那么,亲你在干什么?
2.色即是空,空即是色
学了OOP,学了面向接口编程,学了一堆Java知识之后:
作为Java程序员的你,在那里干什么?一会色即是空,一会空即是色吗?
- 色即是空:面向接口编程,设计或编写一堆类和接口
- 空即是色:new出千千万万的对象,各种API调用,忙得天昏地暗,还是忙的不亦乐乎?
好像还形成了闭环?那是不是死循环?还走不走得出去?跳不跳得出来
3.接口的另一个别名,叫:规范
接口,有三性:
- 一曰空性:—— 自己不实现(一堆方法,空在那里)
- 二曰强制:—— 约束性
- 三曰规范:—— 一致性
3.1 所谓空性
这个是前面讲的:
- 接口一般就是提供一堆抽象方法;
- 抽象方法都是没有主体或实体的方法,是功能上没有实现的方法
- 即除了自身的声明之外,是不包含任何其它语句的方法;
3.2 所谓强制性
就是如果哪个普通类声明自己要实现某个接口,它就要想办法去实现接口声明的那堆抽象方法,否则该类仍然具有抽象性,是一个抽象类,它的后代最终也得将未实现的抽象方法都给实现了,否则不能实例化对象,不能入世,因为你new不出对象,也就不能实际调用方法,实现客观功能和作用,只能在天上飘着。
接口的强制性,根上讲,就是如果一个类implements了某个接口,只要不家一个抽象方法它没有实现,如果你想用它来new对象,那么编译器就会报错,怎么滴你让用不了,类就像图纸,你不能new对象,就相当于这份图纸(你写的类)被束之高阁了,被搁置不能用了。
强制性,就是叫你好好做人的意思,一定要满足人家的要求。
3.3 所谓一致性
所谓一致性,就是指接口是一种标准(standard),或者叫做是一种规范(specification),而且是强制性的。
这个标准或规范,目的就是实现社会协作,自动趋一,提高效率。
接口的这三点,总而言之,其实就是说它是规范。啥是规范,其实规范,就是一种契约
规范是高级形式的契约;标准是高级形式的规范。
规范化、标准化,是人类走向工业社会,是社会近现代化的一个产物及标志。
是近现代社会,实现大范围的社会化协作和规模化生产的一种先进生产方式及基于其上的管理方式。
而现代编程中的接口或对外暴露的API,更多地是一种技术性或技术型的规范化和标准化,尤其像Java这样的顶级现代化的高级编程语言,在这方面尤其突出和典型。接口规范,极大地降低了市场相关产品设计和出产上的混乱性、无目的性和不良竞争与相关消耗,极大地提高了生产效率,促进了生产力的发展。
4.接口的发展:空之又空
4.1 函数式接口与函数式编程
我们都知道:
- 接口是一种特殊的类;
- 相对于对象而言,类本身就是抽象的,因为它是蓝图;
- 接口是一种特殊的类,接近于所有的方法都是抽象方法的抽象类(当然又不等同于抽象类,比如接口之间可多继承,类与接口之间可多实现,但类与类之间的继承或扩展是单一的,这点要注意);
- 通常来讲,接口就是一堆抽象类的集合
- 抽象方法,是没有主体或实体的一种方法(即不带花括号{})
所以,看起来,接口是很抽象很抽象的,也是很空很空的。
但随着技术的发展,Java的接口的发展衍化并没有停止它进步的脚步,比如后期又出现了函数式接口,而Java对函数式接口的支持,是Lambda表达式的基础,也是Stream流式编程的基础,还是方式引用的基石,总之,函数式接口,是Java实现支持函数式编程的关键技术或基石,原因是函数式编程的本质,是基于一个原则,这个原则就叫:可推导可省略,而可推导的前提是提供足够或充分的确定性,在很多时候,要提供这种确定性,说白了就是需要保证唯一性。所以,函数式接口,就相当于只有唯一抽象方法的接口的别名。
终于,就像前面提到的西洋绘画的焦点透视绘画法一样,Java语言在设计上也类似:
对象--->类--->抽象类--->接口--->函数式接口
4.2 标记性接口
从对象到函数式接口,终于从多到少,从具象到抽象,抽象走向尽头自然是空之又空,从多到少,少到最后当然是只有一个方法,这个方法什么也不做,是一具抽象方法,最后产生了Lambda表达式,空之又空,简之又简,仿佛已经极空极简了。
其实并不完然,其实还有一种更加空与简的接口。
你没想起来吗?那就是标记性接口呀,它连任务清单都没有,它只是一个标记而已,你实现它,并不用重写和实现任何抽象方法。
Java中最知名的标记性接口,就是序列化Serializable接口了,它常用于对象的序列化存储需求场景。
除了Serializable,还有像Runnable、Cloneable、RandomAccess等几个接口,也是标记性接口。
还记得我们在文章最前面提到的“点(pointer)”的概念吗?标记性接口,从设计理念上讲,就接近我们说的那一个点了,像不像,快像了吧。学无止境,技术如展亦如是,当技术变得越是细腻、精确,技术往往也就变得越是高级,是的技术发展到最后,都在走向模块化、单元化、细化、细粒化、元子化,然后,人们再基于这样的特性的技术,重构他们的世界,不是吗?
5.小结
啰嗦了这么多,说什么色即是空,空即是色,谈了一堆抽象和接口的问题,其实我就是想和你说这么几层意思:
对于Java和Java编程
- (0)不要只是站在技术的角度上看问题,尤其是单一技术角度看问题
- (1)可以站在Java设计者的角度看问题,比如高斯林的角度,换位思考一下
- (2)你可以站在厂商或甲方、乙方、第三方的角度,换位思考一下
- (3)你可以站在公司领导或项目经理与架构师的角度,换位思考一下
- (4)你可以站在哲学的角度,整体地看一下
- (5)你也可以站在社会需求的角度,思考一下
- (6)你还可以站在历史的角度,思考一下
- (7)你甚至可以站在美学的角度,审视一下
- 就像审视战斗机一样,也许你会发现或思考,越是先进的战机,为什么流线性的设计越是如此丝滑
然后,你就会对设计模式、最佳实战、数据结构、算法这类的课程或主题甚至它背后相关的其他内容,更加地感兴趣,对Java的本质越能深刻地去理解和把握,并动态地、与时俱进地和Java共同成长。因为,就像写诗一样,有一些东西,功夫在诗外,在其它或更高的维度之上