引言

我们学面向对象,都是学什么叫对象,再到类的封装,继承,抽象,多态等去分析我们的面向对象这四个字。但是呢,我这里为什么说“你不懂面向对象其实是因为你不懂哲学”?难道我们懂了哲学就理解了面向对象爱吗?当然不是这么去理解得的。

其实,在面向对象里面,的确包含了哲学的思想在里面,大家可以去搜面向对象与哲学,我相信一定会有很多,因为我搜索过。我们需要先来明确几点内容:

  • 系统中一切事物皆为对象;
  • 对象是属性(成员变量)和方法的封装体;
  • 类是一类具有相同性质的对象的集合,对象是这个类的实例;
  • 消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式;
  • 方法是消息传递的一个基本序列。

面向对象的世界观

说起哲学,笔者首先想到的是人生观,价值观,爱情观,世界观等观念,这里我们讲世界观。世界观是指处在什么样的位置、用什么样的时间段的眼光去看待与分析事物,它是人对事物的判断的反应。它是人们对世界的基本看法和观点。面向对象的哲学中,世界是由具有不同运动规律和不同状态的对像组成,儿不同对象之间的相互作用和联系构成了世界。可以看下,这难道不是哲学中对我们现实世界的一个基本描述吗?

聊到世界观,就会聊到方法论。方法论是如何去证明世界观的学说,也就是 “why” 的问题。这个问题其实我们在之前已经讨论过了,对象的四大特性(本人遵循阿里标准,认为抽象是对象的特性之一。)就是他的方法论的最好的体现。

从Object看哲学

说道对象,我们不得不说Java中隐藏祖先,Object。在Java中,所有的类都会继承Object,而在Object中,我们又可以很好的去解释一些哲学性问题。我们先来看Object:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
public class Object {

private static native void registerNatives();
static {
registerNatives();
}

public final native Class<?> getClass();

public native int hashCode();

public boolean equals(Object obj) {
return (this == obj);
}

protected native Object clone() throws CloneNotSupportedException;

public String toString() {
return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

public final native void notify();

public final native void notifyAll();

public final native void wait(long timeout) throws InterruptedException;

public final void wait(long timeout, int nanos) throws InterruptedException {
if (timeout < 0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (nanos < 0 || nanos > 999999) {
throw new IllegalArgumentException(
"nanosecond timeout value out of range");
}
if (nanos > 0) {
timeout++;
}
wait(timeout);
}

public final void wait() throws InterruptedException {
wait(0);
}

protected void finalize() throws Throwable { }
}

我是谁

万物三问第一问,我是谁。我们知道,Java的程序运行会有一个可执行文件 .class ,这是一个Java程序能够执行的必要条件,随后我们的 JVM 的 ClassLoad 会去加载这个 .class 文件得到里面的一切。

在Object 中,getClass()就是在告诉我们,“我”是谁。而里面的 toString() 则是 “我” 在世界中的名片,展示自己。

我从哪里来

有人问你,你从何处来?要到何处去?你回答,贫僧从东土大唐而来,要往西天而去。佛家也会去究其本源。更何况于我们的Object呢?

我们使用 new ClassName() 去创建一个对象,之所以能这么做,是因为在我们的 类中有一个构造器: ClassName() 的方法,这是我们创建对象的必要条件,但是我们的 ClassName 类中又看不到,默认自带空的构造器。在Object中也是如此。

同样,我们可以看到在Object中,还存在一个方法,clone() , 这是它的一种繁殖的方式,得到的 克隆体 与本体无二,但不是同一个个体。这是对象的唯一性。

我要去哪里

有人问你,你从何处来?要到何处去?你回答,贫僧从来处来,要到去处去。在我们的Java中,一个对象最后的归宿是在哪?Object回答了你。finalize(),是的,销毁了。

你要是问,能不销毁吗?答案,不能。一定要销毁。我们知道,对象在使用完之后,也就是去了它存在的意义,换句话说,它已经到达了它的生命周期,在它有限的生命中,它将它自己点燃,投入到无限的为系统服务中去,现在它的生命走到了尽头,自然要归于世界之中。就像我们人一样,死后,化做一抔黄土,归于天地之间。

世界因我的不同而精彩

世界的多姿多彩,是因为世界中的每个对象都是独一无二的,在这个世界上,你找不到两片相同的树叶。同样,在面向对象中,你找不到两个一样的对象。

每个人都会有自己的标签,对像也一样,hashCode() ,为你的对象打上一个标签,告诉你,她是你的唯一,而你,就是她的全世界。

也许,你们现在还不知道对方在何处,但当你们相遇之时,确认过眼神,你发现她就是那个对的人,这时候, equals() 告诉你,别再擦肩而过了,你找的人就在眼前。世界就是这么奇妙,只因为一个回眸,我就找到自己的那个你。

世界因联系而变得紧密

人生中,我们总会遇到那个人,从相遇到相知,再到相爱。在面向对象中也是如此。当你们相遇了,你需要告诉她,跟她说:“我在等你,你跟我走吧”。这时候,notify()在你和她之间充当一条通信的介质,可是她还在想要不要和你走呢?wait()让你静静的等待着她的点头。她笑着跟你说,除非你让全世界都知道。所以,为了她,notifyAll()在你和世界间搭建了一条通道,终于,你和你的对象双双归去,过上了幸福快乐的生活,直到finalize()

到这里,你还会觉得,面向对象不是一个哲学问题吗?