对面象对象概念的理解、解释(转)

写在前面的话:

  由于工作原因已经半年多没好好理下Java了,现在因换工作需要重新复习一下Java。以前一直想把自己在Java方面的学习心得写出来,现在终于算是有些时间了,那么开始吧。

五个特性

我相信在网上看IT文章的人都应该或多或少有编程底子的,介绍什么是对象是Java里最基础,也是最有特色的。我们从对象的五个特性开始(引用自Thinking in java):

  1. Everything is an Object.//在Java中,一切都由对象组成,这个相当于说人是由细胞组成,当前细胞还有分子原子组成,其实对象也由一些其它的东西组成,比如原子类型,运算符。但我们在设计程序时并不关心这些,因为这些大了。
  2. A programming is a bunch of objects telling each other what to do by sending message.//发送消息,其实就是调用某个类的某个方法。
  3. Each object has its own memory made up of other objects.//每个对象都有独立内存,换句话说,对象没有实例化之前是不能随便用的。
  4. Every objects has a type.
  5. 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?如果你现在仍有这样的疑问,请参见我的异常专题文档:《写了后会贴上链接》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值