、使用继承
继承
在java中,被继承的类称为父类、基类或超类,与之对应的类称为子类或派生类。继承是通过关键字 extends 实现的,格式如下:
class 子类 extends{}
实现继承
注意:如果一个成员要被子类继承之后使用,这个成员不能是 private 类型,因为私有的成员不能在类的外部使用,当然也不能被子类使用。一般情况下,成员变量定义为 protected 类型,成员函数定义为 public 类型。
注意:
1、java不支持多重继承,一个子类只能有一个父类,不允许出现一下情况。
class 子类 extends 父类1, 父类2{}
2、在java中可以有多层继承,如A继承B,B又继承了C。此时相当于A间接地继承了C。
二、成员的覆盖
子类中成员函数的定义和父类相同是指名称相同、参数列表相同、返回类型相同。
注意:
1、将 Override 和 Overload 相区别。
2、如果在子类中定义一个名称和参数列表与父类相同的函数,但是返回类型不同,此时系统会报错。
3、在重写时,子类函数的访问权限不能比父类更加严格。例如,父类的成员函数的访问权限是public ,子类重写是就不能定义为 protected 。
4、在覆盖的情况下,如果一定要在子类中调用父类的成员函数,可以使用关键字super ,调用方法是 "super . 函数名",示例代码如下。
...
class FontDialog extends Dialog{
private String fontName;
public FontDialog(String title,String fontName){
this.title=title;
this.fontName=fontName;
}
public void show(){
super.show();
Ststem.out.println("fontDialog.show()");
}
}
...
三、使用多态
多态:是面向对象的基本特征之一,也是软件工程的重要思想。
注意:前文讲解的函数重载也是一种多态,称为静态多态,本章讲解的多态特指动态多态。
使用多态
1、函数传入的形参可以是父类类型,而实际传入的可以是子类对象。
2、函数的返回类型是父类类型,而实际返回的可以是子类对象。
父类和子类对象的类型转换
1、子类类型对象转换成父类类型
根据多态原理,子类对象无须转换就可以赋值给父类引用,示例代码如下:
Dialog dialog = new FontDialog();
2、父类类型对象转换成子类类型
严格来讲,父类类型对象无法转换成子类类型。例如下面的代码是错的:
Dialog dialog = new Dialog();
FontDialog fd = dialog;
但是有一种特殊情况,如果父类类型对象原来就是某一种子类类型的对象,则可以转换成相应的子类类型对象,此时使用强制转换即可,示例代码如下。
Dislog dialog = new fontDialog();
FontDialog fd = (FontDialog)dialog;
四、抽象类和接口
抽象类
含有抽象函数的类称为抽象类,抽象类必须用 abstract 修饰。
注意:
1、抽象类不能被实例化。
2、抽象函数必须被重写,除非子类也是抽象类。
3、在抽象类中可以含有普通成员函数。
接口
在抽象类中可以含有普通成员函数,如果一个抽象类中的所有函数都是抽象的,也可以定义为接口。
说明:
1、接口中的方法不需要专门指明 abstract ,系统默认其为抽象函数,在接口中只能包含常量和函数。
2、接口中的成员函数默认都是 public 访问类型,成员变量默认是用public static final 标识的,所以接口中定义的变量是全局静态常量。
3、接口可以通过 extends 继承另一个接口,类通过关键字 implements 来实现一个接口。
4、一个类可以在继承一个父类的同时实现一个或多个接口,多个接口用逗号隔开。格式如下:
class 子类 extends 父类 implements 接口1,接口2,....{}
关键字 extends 必须位于关键字 implements 之前。
——