Java中继承与多态浅谈

95 阅读6分钟

软件的反复使用可以缩短程序开发时间,从而减少系统运行后可能出现的问题。这些都是令人振奋的可能性。多态性允许我们用统一的风格编写程序,来处理多种已存在的类和特定的相关类。利用多态性我们可以向软件中添加新的功能。

如果一个程序性方案有许多密切相关的案例,那么就会常用到switch交换结构或嵌套的if/else结构从而区分众多的案例并提供独立处理各个案例的逻辑。使用继承性和多态性以更简单的逻辑来代替switch结构。我们区分“is a”关系和“has a”的关系。“is a”就是继承。在“是” 关系中,子类类型的对象也可以被看作是它的父类型的对象处理。“有”是一种构成。在“有”关系中,一个类对象有一个或多个其它类的对象作为成员

然而,一个子类可以访问它的父类的public 成员和protected成员。如果子类和父类在同一个包中,子类也可以使用它的程序包访问父类成员。如果父类不允许通过继承产生的子类访问它的某些成员,则需要用private声明成员。子类只可以通过公有继承、受保护继承和程序包借助父类提供的继承到子类中的方法声明对父类中私有成员的改变。继承会带来的问题是,子类会将一些没必要继承或不该继承方法也继承过来。

总有一天,大多数的软件可以通过可重用的标准化的组件来构建,就像现在制造硬件一样。这将有助于面对开发我们将来可能需要的更加强大的软件的挑战。我们常常会遇到这样一个问题,一个类的对象同时还“是”另一个类的对象。矩形肯定是一个四边形( 如同正方形,平行四边形和梯形)。因此,Rectangle 类可以说是从Quadrilateral类继承而来的。在这种情况下,Quadrilateral 类是父类,Rectangle 类是一个子类。矩形是特殊的四边形,但却不能说四边形就是矩形(四边形可能是平行四边形)。

继承通常能够产生比其父类具有更多功能的子类,所以父类和子类的概念很容易引起混淆。然而,我们还有另一种更好的方法来区分这两个概念。因为每个子类对象也“是”其父类的对象,而一个父类又可以有很多子类,那么由父类所代表的一组对象通常比由该对象的父类的任何子类所代表的要大得多。例如,Vehicle超类包含了所有的交通工具,如汽车,卡车,船,自行车等。而Car子类.仅表示交通工具Vehicle中的一个小子集。继承关系可以用树型层次结构来表示。一个父类与它的子类的构成层次关系。一个类肯定可以独自存在,但当一个类运用了继承的机理时,这个类要么成为一个提供属性和行为的父类,要么成为一个继承这些属性和行为的子类。

通常情况下,一个类既是父类也是子类。一个子类的对象可以被当作其父类的对象来处理。这就可能会有一些有趣的操作。例如,尽管有从一个特定的父类派生出的众多子类的对象彼此之间可能会有很大的不同的事实,但只要我们将他们当作父类的对象来看,我们仍可以创建一个引用的数组给他们。但反之则不然。一个父类对象不能被当成一个子类对象。例如,图形(Shape) 不一定是圆(Circle)。尽管子类的对象也“ 是”父类的对象,子类类型和父类类型却是不相同的。子类对象可以被视为父类的对象。因为子类含有和每个父类成员相对应的成员。但也应认识到,子类通常拥有比父类更多的成员。但Java不允许逆向赋值,因为如果把父类对象赋给子类的引用,就会使子类中额外的子类成员没有定义。子类对象的引用可以被隐式地转换为父类对象的引用,因为根据继承性,子类对象“是”父类对象。有四种可 能的方法来使父类的对象和子类的对象与父类的引用和子类的引用相匹配

1、父类对象与可以直接用父类的引用。

2、子类对象与可以直接用子类的引用。

3、子类的对象用父类的引用是安全的,因为子类对象同样也是其父类的对象。但这样的代码只能引用父类的成员。如果该代码通过父类的引用来访问子类所特有的成员,编译器就会报告一个语法错误。

4、如果用子类来引用父类的对象,将报告一个语法错误。尽管将子类的对象看成是父类的对象会带来很大的便利,而且可以通过这些父类的引用操纵这些对象来实现,但这会引发一个问题。

一般来说,面向对象的编程,像Java,就可以实现。实质和有用的类库使得通过及继承而实现的软件重用实现利益最大化。人们对Java类库的兴趣随着Java的发展而增加。正如独立软件厂商生产的压缩套装的软件伴随着个人电脑的问世而出现爆炸性的增长一样,Java 类库的制造和销售也将呈现这样一个趋势。应用程序设计人员将使用这些类库来构建他们的应用程序,而类库的设计者会因为将其开发的类库与应用程序打包在一起而得到收益。在不久的将来,随着在大量领域的应用,Java 的类库将会起到至关重要的作用并得到极大的发展。

Java入门推荐:www.bilibili.com/video/BV1qL…