写在前面的话:
由于工作原因已经半年多没好好理下Java了,现在因换工作需要重新复习一下Java。以前一直想把自己在Java方面的学习心得写出来,现在终于算是有些时间了,那么开始吧。
五个特性
我相信在网上看IT文章的人都应该或多或少有编程底子的,介绍什么是对象是Java里最基础,也是最有特色的。我们从对象的五个特性开始(引用自Thinking in java):
- Everything is an Object.//在Java中,一切都由对象组成,这个相当于说人是由细胞组成,当前细胞还有分子原子组成,其实对象也由一些其它的东西组成,比如原子类型,运算符。但我们在设计程序时并不关心这些,因为这些大小了。
- A programming is a bunch of objects telling each other what to do by sending message.//发送消息,其实就是调用某个类的某个方法。
- Each object has its own memory made up of other objects.//每个对象都有独立内存,换句话说,对象没有实例化之前是不能随便用的。
- Every objects has a type.
- All objects of a particular type can receive the same message.
个人感觉关于这五点不需要刻意去理解,总的来说这个意思:一个java程序由不同类型的、相互协作的对象组成。
对象的构成
- 提供给别人调用的接口方法。
- 内部状态
严格意义上来说,面象对象的一切与外界的交互都应通过接口完成(这个接口的意义跟之后我们说的语法定义interface不一样)。当然Java没有这样做。太严格的东西不是给人用的。
对象的复用
复用就是重复利用的意思,没什么特别的,我们这里讲讲复用的两个具体方法及其使用情况:
组合:也就是之前特性的第三点,一个对象可以由其它对象组成,这种组成与被组成的关系就叫组合。
继承:这是针对类型定义的一个概念,子类能继承父类的所有非私有的属性及方法。
从概念上来看,组合跟继承似乎没有什么关系,其实以后会发现,用组合还是用继承是我们在具体设计中最经常要考虑的问题;因为我们设计每一个对象(或类),必定会涉及复用,比如已经有一个电子相片,我们现在要实现一个带边框的电子相片,那么我们是应该先继承再在绘图时多加点相框呢?还是新建一个对象,由原相片对象加边框对象组成?一般情况下,用组合会比用继承更灵活,灵活的原因在于,继承是非常静态的复用,(这里这个静态的概念与等下讲static关键字的时候讲的静态的概念是很相似的)。而组合就相对动态一些,当然,这里需要用到一个面象对象的特性:子类能够替换父类(至少编译不会报错;如果是好的设计,那么程序运行也不应该有问题,后一点完全取决于设计人员的水平,另外这里我们把接口也称做其实现类的父类)。组合时我们给部件指定一个父类(超类),然后具体用什么框框,可以在程序运行时,动态指定。这样不但灵活,同时不需要为每一种实现定义一个具体的类。
多态
多态这个名字取得文邹邹地,让人看了有些害怕,其实多态很简单:指的是同一类对象它的接口方法可以有不同的实现。就象两个人,为什么都是人(同一类型),充饥(接口方法)的时候,一个喜欢用大米、一个喜欢用面条一样。多态也分为两种:
重载:表示一个相同的方法名带有不同的参数,这一点没什么要说的,N多语言都会这一套,不过以前还真见过连这都不支持的语言,只是不记得具体是哪门子脚本语言了,要不然今天必然拿出来贬一顿。
复写:继承后子类可以复写父类的具体方法。讲的是同一个接口不同的行为。具体作用仍可用相框的例子,前面不是讲子类能够替换父类么?不同子类同一个方法有不同实现,这就是非常具体的复写。
泛型
这个名字取得更文邹邹,单看名字真是会一点头绪都没有,而且泛型这个名字是真取得片面了些,其实泛型指的是:可参数化的类型,比如一个List<指定一个元素类型>,这就是一个泛型。它包含两层概念:在类型定义时可以加一个参数,表明该类型在使用时可以指定一个具体类型为它的参数。比如:List<Integer>。那会编译器就知道从这个List里取出来的东西就是Integer类型,而不是什么Object这样一个什么都是的类型。是吧,所以说泛型这个名字取得相当不好,不如说定型更好些,要不叫可参数化类型,就更好了,我想命名为可参数化类似,这个有关泛型的困扰我想会少太多吧。需要注意的是泛型仅是一种编译时特性,换句话说,这个语言在编译后是不会留任何痕迹的,运行时用泛型指定的对象其它仍是Object型,所以不要在泛型的定义中包含new T(); 等语法。
对象的创建及生命周期
仍然是特性中的第三点,一个对象是由其它对象组成的,那么;换句话说,如果一个对象不组成任何对象,那么这个对象其它是没有用到的;再一点,Java中对象的使用是用引用(reference的方式),类似C语言里的指针、间接引用、名柄、等概念。换句话说,如果一个对象没有被任何字段引用的话,就可以确定这个对象已经没有用了,这个时候,JVM GC(垃圾回收器)就会在认为合适的时候回收这些对象。另外,对象必须显示地用new关键字创建后才能使用。
异常控制
我非常非常喜欢Java的异常回收机制,真的非常好;它让我们在编程的时候不用老是考虑:数据库出问题了咋办?网络没连上咋办?调用者假如一定要传个null进来咋办?除此之外,异常能认你的返回值及api文件变得非常可阅读。关于异常,我这里说一点我的看法,尤其是新人,不要觉得异常控制好烦,怎么老是要try{}catch?如果你现在仍有这样的疑问,请参见我的异常专题文档:《写了后会贴上链接》。