第六章 面向对象(高级篇)
6.1、继承的基本概念
a、Java中只允许多层继承,不允许多重继承。使用extends可以实现继承的关系。
b、使用继承时应该注意:子类是不能直接访问父类的私有成员的,子类可以调用父类中的非私有方法,但是不能直接调用父类中的私有成员。
6.2、继承的进一步研究
a、子类可以直接使用super()调用父类(超类)中的无参构造。
b、在继承关系中也存在着方法 覆写的概念,所谓方法的覆写就是指子类定义了与父类中同名的方法,但是在方法覆写时必须考虑到权限,即被子类覆写的方法不能拥有比父类方法更加严格的访问权限。
c、如果将父类中的一个方法定义为private访问权限,在子类中将此方法声明为default访问权限,这样不是覆写,只是相当于重新定义了一个新方法。
序号 | 区别点 | 重载 | 覆写 |
1 | 单词 | Overloading | Overriding |
2 | 定义 | 方法名称相同,参数的类型或个数不同 | 方法的名称、参数的类型、返回值类型全部相同 |
3 | 对权限没有要求 | 被覆写的方法不能用于更严格的权限 | |
4 | 范围 | 发生在一个类中 | 发生在继承类中 |
d、与this调用构造方法的要求一样,super语句必须放在子类构造方法的首行。
序号 | 区别点 | this | super |
1 | 属性访问 | 访问本类中的属性,如果本类中没有此属性,则从父类中继续查找 | 访问父类中的属性 |
2 | 方法 | 访问本类中的方法,如果本类中没有此方法,则从父类中继续查找 | 直接访问父类中的方法 |
3 | 调用构造 | 调用本类构造,必须放在构造方法首行 | 调用父类构造,必须放在子类构造方法的首行 |
4 | 特殊 | 表示当前对象 | 无此概念 |
e、this和super都可以调用构造方法,两者不可以同时出现,因为两者调用构造时都必须放在构造方法的首行,另外,无论子类如何操作,最终必须要首先调用父类的构造方法。
6.4、final关键字
a、使用final声明的类不能有子类
b、使用final声明的方法不能被子类覆写
c、使用final声明的变量即成为常量,常量不可以修改。
d、在使用final声明变量时,要求全部的字母大写,如INFO,这点在开发中是十分重要的。
e、如果一个程序中的变量使用public static final声明,则此变量将称为全局变量。
6.5、抽象类的基本概念
a、抽象类的定义和使用规则
(1)包含一个抽象方法的类必须是抽象类
(2)抽象类和抽象方法都要使用abstract关键字声明
(3)抽象方法只需声明而不需要实现
(4)抽象类必须被子继承,子类(如果不是抽象类)必须覆写抽象类中的全部抽象方法。
b、一个抽象类中是允许存在构造方法的,因为抽象类依然使用的是类的继承关系,而且抽象类中也存在各个属性,所以子类在实例化之前必须先要对父类进行实例化。
6.6、接口的基本概念
接口是Java中最重要的概念之一,它可以被理解为一种特殊的类,是由全局变量和公共的抽象方法构成。
1 //接口的定义格式 2 interface 接口名称{ 3 全局变量: 4 抽象方法: 5 }
注意:接口的方法永远是public
接口若要使用也必须通过子类,子类通过implements关键字实现接口。
1 //实现接口 2 class 子类 implements 接口A, 接口B, ...{ 3 4 }
一个子类可以同时实现多个接口,实际上这就摆脱了Java的单继承权限。
如果一个子类既要实现接口又要继承抽象类,如下所示:
1 //继承抽象类实现接口 2 class 子类 extends 抽象类 implements 接口A, 接口B,...{ 3 4 }
在Java中一个接口是不允许继承抽象类的,但是允许一个接口继承多个接口。
1 //接口的继承 2 interface 子接口 extends 父接口A, 父接口B,...{ 3 4 }
6.7、对象的多态性
Java中多态性的两种体现形式:
(1)方法的重载和覆写
(2)对象的多态性
对象的多态性主要分为以下两种类型:
(1)向上转型:子类对象 -> 父类对象
(2)向下转型:父类对象 -> 子类对象
对于向上转型,程序会自动完成,对于向下转型时,必须明确的指明要转型的子类的类型
1 对象向上转型:父类 父类对象 = 子类实例 2 对象向下转型:子类 子类对象 = (子类)父类实例
注意:在进行对象的向下转型前,必须首先发生对象向上转型,否则将出现对象转换异常
6.8、instanceof关键字
在Java中可以使用instanceof 关键字判断一个对象到底是那个类的实例,格式如下:
对象 instanceof 类 -> 返回 boolean类型
由于通过子类实例化的对象同时也是子类和父类的实例,所以可以直接进行向上或向下转型,但是如果直接使用了父类实例化本类对象,则一定不再是子类实例了,所以是不能转型的。
在进行对象的向下转型关系前最好先进行判断后再进行相应的转型操作,这样可以避免类型转换异常的出现。