对Java中对象、类、抽象类、接口的理解

类和对象

一个对象对应一个实体,用代码来描述实体的状态和行为。而如果一切皆对象,那么由什么来决定某一类的对象的外观和行为呢,也就是对象的类型(Type)。也就是说,类是对一类具有相同外观和行为的对象的抽象。

先有对象还是先有类

看似是先有鸡还是先有蛋的哲学问题,其实从现实生活中发现。是先有实体的存在,然后人们将这些实体的外观和行为统一抽象概括。比如说:你我他、小明的存在。我们都被归于人这个类型,因为我们具有相似的外观和行为。

抽象是有层次的

对某一类的对象的抽象程度不同,形成的类在抽象层次树中的位置不同。继上个例子。小明被概括成男人,小红被概括成女人。而小明、小红都可以被概括成人。那么男人、女人、人这三种都是对对象的抽象。可以很明显的看到其中的差异。人这个类型包含的对象的数量是男人、女人所包含的对象的数量的总和(外延)。而对对象说明的力度却小于男人、女人这两个类型(内涵)。那么显然,人这类型是处于更高层次的,是对男人、女人这两个类型进一步抽象,概括相同的外观和行为,形成人这一类型。

抽象类的形成

我们对类进行抽象之后,发现内涵变低了,无法具体的描述对象的行为,比如动物,都有个行为:吃。但是吃什么呢,不清楚。猫吃鱼,狗吃骨头,人啥都吃。所以能在动物这个类中具体的描述行为吗。是不能的。但是我们能在猫、狗、人的类型中具体的描述吃这个行为。

抽象类,是对不同类型的统一特征和行为的进一步抽象。但是无法明确具体地描述这一行为。所以在java中抽象类不是能够直接new 对象的。因为具体的行为都没有,这个对象是不存在的。现实中任何实体,都有明确的特征和行为。

抽象类的构成

从上面分析,我们发现抽象类与普通类相差不多,都是对对象的抽象,只是抽象的层次不一样。所以普通类所能包含的东西,抽象类都能够包含。但是,在java中,抽象类中有些方法不能明确的描述对象的行为,用abstract进行修饰,表示这个是抽象方法,没有方法体,也就是没有具体的描述这个行为。

抽象类和普通类

我们知道,一个类如果能够new一个对象,那么必须能够明确的定义对象的特征和行为。显然抽象类并不具备这个能力,他对部分的行为是不能够明确描述的。所以在java中抽象类是不能够直接new对象的。

因为抽象类是对些类中的共同特征和行为的进一步抽象,所以抽象类的存在并不是和对象关联的,而是给它的子类提供部分特征和行为。同样如果子类是普通类(能够直接创建对象的类),那么必须要实现它的抽象方法(给出明确的行为定义)。所以在java中抽象类是不能使用private修饰类,因为它的存在是要给子类提供一些属性和方法。

接口的意义

上面我都没有提到接口,接口虽然也是对对象或者类的抽象,但是它是独立于抽象层次树的一个概念。

从现实世界的角度来说,各行各业都有他的标准,比如插板,在国内都有个国标。国标一旦定下来,所有生产厂家必须按照这个标准来生产,否则你就是不合格。这就是设计和生产分离之后必须要进行的趋势。

java中的接口也是如此,它就是一个规范,一个标准。设计人员负责制定标准,而开发人员必须在这标准下实现功能(设计人员不管开发人员如何实现)。接口的出现,使得软件开发分工更加明确,开发难度降低。

接口和抽象类

抽象类是固有存在的。是对对象的高度抽象,先有对象,才有抽象类。而接口(标准)是人为设计,是先设计出接口,才能产生对象(实体)。对象在被创造出来之前并不存在。先后顺序不一样。

接口的所有设计都只为软件开发服务,使其开发更快,更合理。抽象类是固有存在的,是用来描述存在的对象的公共特征和行为。两者的概念差异很大。
在java中可能出现,使用抽象类和接口能够实现相同的效果,虽然效果
一样,但是本质是不一样的。

对象->类->抽象类是从下往上抽象,接口->类(抽象类)->对象 是从上往下设计。有些人再设计的时候先设计的抽象类然后在创建对象,其实这是接口的设计思想。

接口的构成

java中的接口:只能定义常量,比如制定一个某型号的螺丝的标准,其半径,螺纹数都是固定的。生产必须按照这个标准生产,否则就是不合格。

jdk1.7之前,只能定义public abstract 方法

jdk1.8,可以定义默认方法和静态方法,可以写方法体。因为考虑到之前的实现接口的类已经使用,如果想扩展接口的功能,会导致所有实现该接口的类都要修改,很麻烦。而增加默认方法和静态方法就不会有这样的情况,功能可以增加,也不用修改其实现的类(ps:针对已经使用的接口,对于未使用的接口,使用抽象方法来扩展功能,因为这符合接口出现的初衷)
jdk1.9接口中出现了私有方法。私有方法有个特点,只能在本类中使用,那么为什么接口要定义私有方法呢。这是对jdk1.8出现的静态方法和默认方法的扩充。我们可以把接口中的静态方法和默认方法中重复出现的代码抽取到私有方法中去。这样即不用暴露该方法接口,也可以更好的维护。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值