继承和抽象
一、继承
1. 概述
前面提过Java中面向对象有三大特征:封装性、继承性、多态性。其中继承是多态的前提,没有继承就没有多态
- 继承主要解决的问题是共性抽取
- 继承描述的是事物之间的所属关系 。通过继承,可以使多种事物之间形成一种关系体系 。
2. 定义
- 继承:就是子类继承父类的属性和行为,使得子类对象具有与父类相同的属性、相同的行为。子类可以直接访问父类中的非私有的属性和行为 。在继承的关系中,子类可以被当作父类看待
- 特点:
- 子类可以拥有父类的内容
- 子类还可以有自己专属的内容
- 优点:
- 提高代码的复用性
- 类与类之间产生了关系,是多态的前提
- 特点:
3. 格式
-
通过
extends关键字,可以声明一个子类继承另外一个父类-
class 父类{ ... } class 子类 extends 父类{ ... }
-
4. 继承后的特点——成员变量
父类中的成员变量是非私有的,子类中可以直接访问。若F父类中的成员变量私有了,子类是不能直接访问的。
通常编码时,我们遵循封装的原则,使用private修饰成员变量,若要访问父类的私有成员变量呢,可以在父类中提供公共的getXxx方法和setXxx方法
-
成员变量不重名
- 如果子类父类中出现不重名的成员变量,这时的访问是没有影响的
-
成员变量重名
-
如果子类父类中出现重名的成员变量,这时的访问是有影响的
-
子父类中出现了同名的成员变量时,在子类中需要访问父类中非私有成员变量时,需要使用
super关键字修饰父类成员变量,类似于之前学过的this -
局部变量: 直接写成员变量名 本类的成员变量: this成员变量名 父类的成员变量: super成员变量名
-
一般有两种方式通过子类对象访问成员变量:直接或间接
- 直接通过子类对象访问成员变量
- 创建时等号左边是谁,就优先用谁,没有则向上找
- 间接通过子类对象访问成员变量
- 该方法属于谁
在哪里定义的,就优先用谁,没有则向上找
- 该方法属于谁
5. 继承后的特点——成员方法
在父子类的继承关系中创建子类对象访问成员方法的规则是:创建的对象是谁,就优先用谁,没有则向上找。即子到父绝不会出现父到子。
-
成员方法不重名
- 如果子类父类中出现不重名的成员方法,这时的调用是没有影响的。对象调用方法时,会先在子类中查找有没有对应的方法,若子类中存在就会执行子类中的方法,若子类中不存在就会执行父类中相应的方法。
-
成员方法重名——**重写(Override) **
如果子类父类中出现重名的成员方法,这时的访问是一种特殊情况,叫做方法重写 (Override)
特点:创建的是子类对象,则优先用子类方法
注意事项:
①. 子类方法覆盖父类方法,必须要保证权限大于等于父类权限
②. 子类方法覆盖父类方法,函数名和参数列表都要一模一样。@Override写在方法前面可以检测是不是有效的正确覆盖重写
③. 子类方法覆盖父类方法,子类方法的返回值类型(如子String,父Object)必须小于等于父类方法的返回值范围
④. 子类方法覆盖父类方法,子类方法的权限必须小于等于父类方法的权限修饰【publlic>protected>(default)>private】。default不是关键字,而是什么都不写
-
方法重写 :子类中出现与父类一模一样的方法时(返回值类型,方法名和参数列表都相同),会出现覆盖效果。声明不变,重新实现。
-
重写的应用:子类可以根据需要,定义特定于自己的行为。既沿袭了父类的功能名称,又根据子类的需要重新实现父类方法,从而进行扩展增强
6. 继承后的特点——构造方法
- 子类必须调用父类构造方法,不写则赠送super()。写了则用指定的Super调用。super只能有一个且必须是第一个
- 构造方法的名字是与类名一致的。所以子类是无法继承父类构造方法的
- 构造方法的作用是初始化成员变量的。所以子类的初始化过程中,必须先执行父类的初始化动作。子类的构造方法中默认有一个 super() ,表示调用父类的构造方法,父类成员变量初始化后,才可以给子类使用。
- super的父类构造调用必须是子类构造方法的第一个语句。不能一个子类构造调用多次super构造。this调用也必须是构造方法的第一个语句
- this和super两种构造调用不能同时使用
7. super和this
super关键字用来访问父类内容,而this关键字用来访问本类内容
- super关键字的三种用法
- 在子类的成员方法中,访问父类的成员变量
- 在子类的成员方法中,访问父类的成员方法
- 在子类的构造方法中,访问父类的构造方法
- this关键字的三种用法
- 在本类的成员方法中,访问本类的成员变量
- 在本类的成员方法中,访问本类的另一个成员方法
- 在本类的构造方法中,访问本类的另一个构造方法
8. 继承的特点
- . Java只支持单继承,不支持多继承。 一个类只能有一个父类,不可以有多个父类
- Java支持多层继承(继承体系)
- 顶层父类是Object类。所有的类默认继承Object,作为父类
- 子类和父类是一种相对的概念
二、抽象类
1. 概述
父类中的方法被它的子类们重写,子类各自的实现都不尽相同。那么父类的方法声明和方法主体,只有声明还有意义,而方法主体则没有存在的意义了。我们把没有方法主体的方法称为抽象方法。包含抽象方法的类就是抽象类
- 定义
- 抽象方法 : 没有方法体的方法 。父类当中的方法不确定如何进行{}的方法体实现,就是抽象方法
- 抽象类:包含抽象方法的类
2. 抽象类的使用格式
①. 抽象方法
-
使用 abstract 关键字修饰方法,该方法就成了抽象方法,抽象方法只包含一个方法名,而没有方法体 ,就是没有大括号
-
修饰符 abstract 返回值类型 方法名 (参数列表);
②. 抽象类
-
如果一个类包含抽象方法,那么该类必须是抽象类
-
abstract class 类名字 { }
③. 举例
public abstract class Animal(){ //抽象类
//抽象方法,代表吃东西,但具体内容不确定
public abstract void eat();
//普通成员方法
public void normalMethod(){
}
}
④. 抽象的使用
如何使用抽象类和抽象方法
- 不能直接创建new抽象类对象
- 必须用一个子类继承抽象父类
- 子类必须覆盖重写抽象父类当中的所有抽象方法
- 覆盖重写(实现):子类去掉抽象方法中的abstract关键字,然后补上方法体大括号
- 创建子类对象进行使用
3. 抽象类的注意事项
- 抽象类不能创建对象,如果创建,编译无法通过而报错。只能创建其非抽象子类的对象
- 理解:假设创建了抽象类的对象,调用抽象的方法,而抽象方法没有具体的方法体,没有意义
- 抽象类中,可以有构造方法,是供子类创建对象时,初始化父类成员使用的
- 子类的构造方法中,有默认的super(),需要访问父类构造方法
- 抽象类中,不一定包含抽象方法,但是有抽象方法的类必定是抽象类
- 未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设
计
- 未包含抽象方法的抽象类,目的就是不想让调用者创建该类对象,通常用于某些特殊的类结构设
- 抽象类的子类,必须重写抽象父类中所有的抽象方法,否则,编译无法通过而报错。除非该子类也是抽象
类- 假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有
意义
- 假设不重写所有抽象方法,则类中可能包含抽象方法。那么创建对象后,调用抽象的方法,没有

浙公网安备 33010602011771号