本章为大家介绍类的特性。
首先,第一个特性----封装。
在这个类别中,属性id 与属性 color 是可以被外部直接访问和修改的,比如
可以看到,事实上这样的内容是错误的,我们需要在定义属性值时需要加入验证等等操作,这时,我们就需要对类做出封装
如此,直接对于类的属性访问变为不可访问。那么如果我们需要对类的属性操作时改怎么办呢,这时,我们需要的是为这些私有属性提供访问函数。
我们为Car类的id和color类提供了get/set函数,这时我们可以使用对应函数来操作私有的属性值,如下图.
同时,在set函数中做赋值判断,即可对设置的值做效验。
封装一定程度上保证了类数据的安全性,但在其他方面,也提高了类属性访问的难度。
接下来,我们来了解类的第二个特性---继承。
回到上一节,我们发过这样一张关系图
其中卡车和轿车均属于车这个类别,我们用代码来实现如下
我们可以看到,因为卡车本来属于车下的一个分类,所以很自然,他拥有了车这个类别的一些通用的属性(还有函数),既然是车类别下的一个子类,那么我们只需要让卡车类获得车类别的通用属性。
加入extends关键字,继承了Car的公用属性,这里需要说明的是,继承关系直接获得的是父级类的公用属性,即public关键字所修饰的属性及函数(这里不讨论protected),看如下代码
我们看到,当使用Truck对象调用Car类属性length时是成功的,而调用id属性却失败,这就是因为id属性的修饰符为private。那么如果我们需要访问父类的private属性时,需要怎么做呢,首先,我们需要父类提供public修饰的私有属性访问函数,即get/set,然后,在子类中使用super关键字进行调用。
此时,使用Truck对象的getSuperId函数即可访问父类私有属性。
ps:实际上按照我的代码的写法,是添加了复杂度,是没有必要的,一般来说,作为父类,也只会提供通用,public修饰的属性。这里只是为了演示如何使用所以故意做这样的设计。
继承特性一定程度上简化了代码,但是也降低了一定的代码可读性,同时需要注意,每一个类只可以有一个父类,可以有无限多个子类。
类特性的最后一个----多态
多态,指对象的多种形态,多态有一些必要条件,需要有继承或实现(实现是接口的一种逻辑,在后续章节会有介绍),必须重写或实现父类函数或接口,引用需要指向子类对象。
具体使用看如下码图(继承)
可以看到 Truck类重写了Car父类的go函数(使用override注解,表示当前函数为覆盖父类函数),此时我们看看如下几个调用示例
运行结果为
这就说明,当程序运行时对于函数,调用父类函数还是子类函数的依据是具体实现。