目录
2. 重写(Override)与重载(Overload)的区别
一、 继承
1. 为什么需要继承
假如我们要开发一个复杂的文字处理软件,类似Word,其中含有很多对话框。
我们发现,各个对话框中,似乎有一些类似的特征,比如,上面的例子中,每个对话框都有宽度和高度,都有背景颜色,都有标题,都可以显示,都可以关闭……如果将这些对话框中的共同功能写在一个类中,让每个对话框都来这“继承”类中的功能。
2. 概念理解
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
在java中,被继承的类称为父类、基类或超类,与之对应的类称为子类或派生类。
3. 实现
3.1 语法结构
class 父类名{
父类主体;
}
类修饰符 class 子类名 extends 父类名{
类的主体;
}
注意:
- 如果一个成员要被子类继承之后使用,这个成员不能是 private 类型,因为私有的成员不能在类的外部使用,当然也不能被子类使用。一般情况下,成员变量定义为 protected 类型,成员函数定义为 public 类型。
- java不支持多重继承,一个子类只能有一个父类,不允许出现一下情况。
class 子类 extends 父类1,父类2 { }
- 在java中可以有多层继承,如A继承B,B又继承了C。此时相当于A间接地继承了C。
3.2 继承关键字
继承可以使用 extends 和 implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。
extends:在 Java 中,类的继承是单一继承,也就是说,一个子类只能拥有一个父类,所以 extends 只能继承一个类。
implements:使用 implements 关键字可以变相的使java具有多继承的特性,使用范围为类继承接口的情况,可以同时继承多个接口(接口跟接口之间采用逗号分隔)。
super:我们可以通过super关键字来实现对父类成员的访问,用来引用当前对象的父类。
this:指向自己的引用。
二、 覆盖
1. 概念
如果子类中得到函数定义和父类相同,最后调用时是调用子类中的方法,称为覆盖或 重写(Override)。重写内容在《面向对象编程》第一篇中有写。
2. 重写(Override)与重载(Overload)的区别
重载发生在本类,方法名相同,参数列表不同,与返回值无关,只和方法名,参数列表,参数的类型有关.
重载(Overload):首先是位于一个类之中或者其子类中,具有相同的方法名,但是方法的参数不同,返回值类型可以相同也可以不同。
(1):方法名必须相同
(2):方法的参数列表一定不一样。
(3):访问修饰符和返回值类型可以相同也可以不同。
重写发生在父类子类之间,比如所有类都是继承与Object类的,Object类中本身就有equals,hashcode,toString方法等.在任意子类中定义了重名和同样的参数列表就构成方法重写.
重写(override):一般都是表示子类和父类之间的关系,其主要的特征是:方法名相同,参数相同,但是具体的实现不同。
重写的特征:
(1):方法名必须相同,返回值类型必须相同
(2):参数列表必须相同
(3):访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为public,那么在子类中重写该方法就不能声明为protected。
(4):子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为private和final的方法。
(5):构造方法不能被重写,
三、 多态
1. 概念
多态是同一个行为具有多个不同表现形式或形态的能力。
2. 使用多态
2.1 函数传入的形参可以是父亲类型,而实际传入的可以是子类对象
2.2 函数的返回类型是父亲类型,而实际返回的可以是子类对象。
3. 父类与子类之间的转换
3.1 子类类型对象转换成父类类型
根据多态原理,子类对象无需转换就可赋值给父类使用,示例如下:
Dialog dialog=new FontDialog;
3.2 父类类型对象转换成子类类型
实例如下:
Dialog dialog=new FontDialog();
FontDialog fd=(FontDialog)dialog;
四、 抽象类和接口
1. 抽象类
含有抽象函数的类称为抽象类,抽象类必须用abstract修饰。
注意:
- 抽象类不能被实例化。
抽象函数必须被重写,除非子类也是抽象类。
在抽象类中可以含有普通成员函数。
2. 接口(Interface)
2.1 概念
接口在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。
一个类通过继承接口的方式,从而来继承接口的抽象方法。
2.2 接口的声明
格式如下:
interface 接口名称 [extends 其他的接口名] {
// 声明变量
// 抽象方法
}
2.3 接口的特性
①接口是隐式抽象的,当声明一个接口的时候,不必使用abstract关键字。
②接口中每一个方法也是隐式抽象的,声明时同样不需要abstract关键字。
③ 接口中的方法都是公有的。
2.4 接口的实现
类使用implements关键字实现接口。在类声明中,Implements关键字放在class声明后面。
语法如下:
class 类名 implements 接口名称{ }
说明:
- 接口中的方法不需要专门指明 abstract ,系统默认其为抽象函数,在接口中只能包含常量和函数。
- 接口中的成员函数默认都是 public 访问类型,成员变量默认是用public static final 标识的,所以接口中定义的变量是全局静态常量。
- 接口可以通过 extends 继承另一个接口,类通过关键字 implements 来实现一个接口。
五、 其他
1. 关键字final
用法:
①用final修饰一个类,例:final class FontDialog;
②用final修饰一个函数;
③用final修饰一个成员变量,该成员变量的值不允许被改变,即不允许重新赋值,因此一般用关键字final来定义一个常量。
2. Object类
在java中定义一个类时,,如果没有用extends明确标明直接父类,那么该类默认继承Object类,因此Object类是所有类的父亲。
在Object类中,常用toString和equals两个方法。