
继承
概述: 在程序中,继承描述的是事物之间的所属关系,通过继承可以使多种事物之间形成一种关系体系。在Java中,类的继承是指在一个现有类的基础上去构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类会自动拥有父类所有可继承的属性和方法。 继承概念: 当要定义一个类时,发现已有类和要定义的类相似,并且要定义的类属于已有类的一种时,可以将要定义类定义为已有类的子类。同时也可以反过来思考,当多个类有共性内容,可以将共性内容向上抽取,抽取到一个新的类中,那么多个类和新的类形成的关系叫做继承。(比如已有狮子类,老虎类,豹子类,可以将三个类(子类)的共性内容向上抽取,形成一个动物类(父类)。) 继承的格式: 子类通过extends关键字声明继承一个父类。下面是一个简单继承的例子,后文会提到成员变量、成员方法和构造方法的访问特点。
继承的优点 1.提高代码的复用性。 2.类与类之间产生了关系,是多态的前提。 继承的缺点 1.降低代码的灵活性。子类必须拥有父类的属性和方法,让子类自由的世界中多了些约束;2.增强了耦合性。当父类的常量、变量和方法被修改时,需要考虑子类的修改,而且在 缺乏规范的环境下,这种修改可能带来非常糟糕的结果——大段的代码需要重构。 继承后访问成员变量的特点 注意: 子类无法直接访问父类中私有属性(可通过set/get方法之前文章中写过)。 子类和父类中成员变量不重名的情况 ,访问没有影响(即访问哪个就是哪个)。
子类和父类中成员变量重名的情况 。会优先在子类中查找是否有该成员变量,有的话就使用子类中的,若子类中没有就使用父类中的(下文会提到super关键字)。
继承后访问成员方法的特点 同上成员变量 成员方法不重名 如果子类父类中出现不重名的成员方法,这时的调用是没有影响的。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。
成员方法重名 如果子类父类中出现重名的成员方法,这时的访问是一种特殊情况,叫做方法重写(Override)。 方法重写 : 子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果,也称为重写或者复写。声明不变,重新实现。
注意: 1. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限。 2. 子类方法覆盖父类方法,返回值类型、函数名和参数列表都要一模一样。 3. 私有方法不能被重写(父类私有成员子类是不能继承的) 继承后访问构造方法的特点 1. 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的。 2. 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个super(),表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。super和this
super: 代表父类的存储空间标识(可以理解为父亲的引用)。 this: 代表**当前对象的引用(谁调用就代表谁,前面关于类的文章中写过)。 成员变量:
成员方法:
构造方法:
抽象类
概述: 当编写一个类时,我们往往会为该类定义一些方法,这些方法是用来描述该类的功能具体实现方式,那么这些方法都有具体的方法体。分析事物时,发现了共性内容,就出现向上抽取。会有这样一种特殊情况,就是方法功能声明相同,但方法功能主体不同。那么这时也可以抽取,但只抽取方法声明,不抽取方法主体。那么此方法就是一个抽象方法。如: 猫的shout行为:喵喵喵 狗的shout行为:汪汪汪 老鼠的shout行为:吱吱吱 因为它们都是动物,所以可以向上提取,定义一个Animal抽象类。它们有共同的方法shout,但是shout方法实现不同,在抽象类Animal中可以定义一个抽象shout类。 抽象方法:使用abstract关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体。 抽象方法定义格式 : 修饰符 abstract 返回值类型 方法名 (参数列表); 抽象类: 包含抽象方法的类,必须是抽象类。 抽象类定义格式: public abstract class 类名字 { }
抽象类的使用: 继承抽象类的子类必须重写父类所有的抽象方法。否则,该子类也必须声明为抽象类。最终,必须有子类实现该父类的抽象方法,否则,从最初的父类到最终的子类都不能创建对象,失去意义。
此时的方法重写,是子类对父类抽象方法的完成实现,我们将这种方法重写的操作,也叫做实现方法。 注意: 1. 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象。 理解: 假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义。 2. 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的。 理解: 子类的构造方法中,有默认的super(),需要访问父类构造方法。 3. 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类。 理解: 未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设计。 4. 抽象类的子类,必须重写抽象父类中**所有的**抽象方法,否则,编译无法通过而报错。除非该子类也是抽象类。 理解: 假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有意义。
说明:为了避免耗费大家宝贵的时间。文章尽可能简短易懂。编程学习需要多动手,大家可以结合后台的demo(后台回复【示例】获取)理解文章,举一反三就更棒了。欢迎大家一起探讨问题。 END
留言板java从基础到进阶,前端从基础到进阶,是一个漫长且艰辛的旅途。只有互相帮助才能走得更远。欢迎大家一起探讨问题,我们一起成长。
Java学习之旅
等你加入
一同成长

版权声明:本文为weixin_32327615原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。