最近开始写Java笔记。
这并不是我第一次学习Java。其实在许多年前我就开始接触Java,但是一直没能在实际项目中得以应用。
学习Java的热情很快熄灭
最早学习Java的时候,用的教程给出的是toy代码,也就是玩具代码。
而我本人在更早更早的以前,接触的是面向过程的语言,最初是Pascal,后来是C。
Java则是面向对象,Java离了类简直没法写下去,于是不少Java教程一上来就讲类,对象,继承,多态,等等。
好了,他们是怎么介绍类的呢。他会说我们定义一个animal的类,然后变量就是name,weight,等等。那么方法呢,比如动物会吃,来一个eat()方法,动物会拉粑粑,来一个拉粑粑()方法,等等……
然后方法里面是什么内容呢,比如eat()方法吧,我们写上一句System.out.println("I am "+name," I am eating!")
然后new一个animal类型的变量,name是多少,调用eat()方法,屏幕上打出一行字”我是xxx,我在吃……“
讲完了类讲继承,说我们定义一个bird的类,然后bird也有name,weight等属性,也会吃eat()。不仅如此,bird还有更特殊的属性比如有翅膀wing,可以飞fly()。
那么我们就从animal类继承一个吧,然后再开始写bird的代码,等等。
学了一堆我一头雾水。因为并不是完全的新手小白,还是想知道用Java能具体做啥的。但是看到这些教程,给我的感觉就是不知道如何下手。总觉得离实际应用还很遥远。
当然,那时候网上的资料也没有现在这么丰富,我也没有下功夫去找更好的资料,后来也没多研究下去。并且,也有人说这些代码很好很通俗的解释了面向对象里面的复杂概念。
困惑:玩具代码到实际运用
但是这些玩具代码带给我的是一种困惑,让我完全不知道除了写这些没用的代码,在实际应用中,面向对象思想是怎样发挥作用的。所以很快放弃深入学习。
当时我以为所有人学习Java都得先通过这些toy代码理解,然后再经过漫长的道路才能运用到实际工作中,所以不久后,在我需要写代码来解决一些问题时,我就直接投奔了python的怀抱……
直到最近,因为一些契机,打算重新好好捡起来Java,看到有人推荐《Java核心技术》这本书,拜读一下,发现这本书运用了相当实际的例子来解释类的含义。
《Java核心技术》给出的超棒解释
它不跟你扯什么动物啊鸟啊,而是从分析解决问题角度这样说的:
传统的过程化程序设计,必须从顶部的main函数开始编写程序。在面向对象程序设计时没有所谓的“顶部”。对于学习OOP的初学者来说常常会感觉无从下手。答案是:首先从设计类开始,然后再往每个类中添加方法。
识别类的简单规则是在分析问题的过程中寻找名词,而方法对应着动词。
例如,在订单处理系统中,有这样一些名词:
- 商品
- 订单
- 送货地址
- 付款
- 账户
这些名词很可能成为类Item、Order等。
接下来,查看动词:商品被添加到订单中,订单被发送或取消,订单货款被支付。对于每一个动词如:”添加“、”发送“、”取消“以及”支付“,都要标识出主要负责完成相应动作的对象。例如,当一个新的商品添加到订单中时,那个订单对象就是被指定的对象,因为它知道如何存储商品以及如何对商品进行排序。也就是说,add应该是Order类的一个方法,而Item对象是一个参数。
180度大转弯的思路
看完这段解释,我起码明白,原来在实际应用中,是要这样思考分析问题,然后去识别类、定义类。类和方法并不是现成的,需要根据你解决问题的思路,自己抽象出来。
而其他教程给出的toy代码,却让我认为自然界、生活中已经有了一些现成概念,我需要拿Java代码,通过类、方法等等去实现它。所以我就很困惑,怎样才能用Java来做些实际事情呢?
这两种不同的解释,对于学习的人来说,整个思路是来了一个180度的大转弯的。
当然,对于写这类toy代码进行教学的人来说,他们可能只是觉得用生活中常见的事物做例子会比较生动,却未能站在入门者的角度去思考如何帮助他们尽快看到Java语言的实际用处,导致不少人(比如我)刚入门就拐弯出来了吧!
学习要注意方式方法
最近这些年,教程和各类书籍也是越来越多,所以我也会在学习的时候多挑选一下,寻找适合自己的,而不像以前那样拿起一个教程就跟着从头开始学。因此,从这个角度来说,其实当时我的学习方式也是有不对的地方,学习的时候还是不能尽信书、尽信教程的。