五 继承
5.1继承的概述
继承是类与类之间的一种关系,顾名思义,就是一个类继承了另一个类。比如有一个学生类Student,那么初中生、高中生、大学生等类就可以通过继承Student来得到身为学生的共同属性和方法,那样就不需要在类中再定义相同的属性方法,提高了代码的复用性。Studnet类也成了其他学生类的父类,其他学生类也就是Student的子类。从这个例子就可以看出,父类是对子类所具有的共性向上抽取得到的。继承也是面向对象语言的特征之一。
5.2 java中的继承
单继承:一个子类只有一个直接父类。
多继承:一个子类可以有多个直接父类。多继承带来不确定性:如果多个父类具有相同的属性或方法,子类的实例调用这些方法或属性时,不能确定调用的是哪一个父类中的方法或属性。因此Java支持单继承,不直接支持多继承,对c++中的多继承机制进行了改良,即多重继承。
多重继承:A继承B,B继承C,C继承D.......,由此产生继承体系。
多继承的使用:1 查看继承体系中最顶层的父类,了解体系的基本功能。 2 创建体系中最子类对象,去使用功能。
定义继承关系: 格式很简单 A extends B ,就是A继承B。
注:定义类与类的继承一定要明确它们之间的从属关系,即xxx是yyy的一种,而不是仅仅为了调用某个类中的成员,就使用继承,这是万万book的。
注:java中,所有的类都直接或者间接的继承了Object类。Object:我是你祖宗!
5.3 关键字super
当子类中的成员变量与父类的相同时用super区分。参考this区分成员变量和局部变量的用法。Super代表父类。不同的是this代表对象的引用,super代表父类的空间。子类不能直接访问父类的私有属性,如果父类有向外提供公共的访问方法,子类可以通过super.getXXX()访问。
当子父类中出现成员函数名一模一样的情况,会运行子类函数,这称为覆盖操作。函数特性:1重载 2 重写即覆盖override
覆盖注:当子类方法覆盖父类方法时,子类权限必须大于等于父类权限。
静态只能覆盖静态,或被静态覆盖。
使用覆盖场景:当对一个类进行子类扩展时,子类需要保留父类方法声明,但要定义子类中该方法的特有内容时,就使用覆盖完成操作。
子父类的构造函数:
1、每个子类构造方法的第一条语句,都是隐含地调用super()(如果不写,则编译器会自动添加)如果父类没有无参的构造函数,那么在编译的时候就会报错,那么子类的构造函数必须用super明确要调用父类中哪个构造函数。
2、如果显示的写出super();语句,则必须保证该语句是第一条语句,否则会出错,因为优先完成初始化操作。
3、同时子类构造函数中如果使用this调用了本类构造函数时,那么super就没有了,因为super和this都只能定义第一行。所以只能有一个。但是可以保证的是,子类中肯定会有其他的构造函数访问父类的构造函数。
5.4 关键字final
继承的弊端:子类对父类的访问调用了底层资源,打破了封装性。Final就是为了防止这种弊端。
final也是一个修饰符,可以修饰类、方法、变量。
final修饰的类不能被继承。
final修饰的方法不能被覆盖。
final修饰的变量是一个常量,只能赋值一次. 用法:在整个系统中的固定的值,虽然可以直接使用固定值但阅读性差,所以需要用一个不可变的变量代表该值。如:final int PI = 3.14; 注:这种固定值变量的名称的规范:大写,多个单词加_连接。
5.5 Object
介绍一下祖宗Object。Object是所有java类的超类。所有对象都实现这个类的方法。这些方法主要是clone()、equals(Object obj)、finalize()、getClass()、hashCode() 、notify()、notifyAll()、toString() 、wait() 。可查看API。
六 抽象类和接口
6.1 抽象类
抽象类:顾名思义,即不具体的、笼统的类。
格式:abstract class Xxx{
abstract void xxx();
}
特点:
1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰。
抽象方法必须定义在抽象类中。该类必须也被abstract修饰。
2,抽象类不可以被实例化,即不能new出对象来。为什么?因为调用抽象方法没意义。但可以作为形参引用。
3,抽象类必须有其子类覆盖了所有的抽象方法后,该子类才可以实例化。
否则,这个子类还是抽象。
抽象类的一些细节:
抽象类中有构造函数,用于给子类对象进行初始化。抽象类可以不定义抽象方法,但是很少见,目的就是不让该类创建对象。AWT的适配器对象就是这种类。通常这个类中的方法有方法体,但是却没有内容。抽象关键字不可以和private 、static 、final关键字共存。抽象类一定是个父类因为需要子类覆盖其方法后才可以对子类实例化。
4,抽象类和一般类的异同点。
相同点:
抽象类和一般类都是用来描述事物的,都在内部定了成员。
不同:
1,一般类有足够的信息描述事物。
抽象类描述事物的信息有可能不足。
2,一般类中不能定义抽象方法,只能定非抽象方法。
抽象类中可定义抽象方法,同时也可以定义非抽象方法。
3,一般类可以被实例化。
抽象类不可以被实例化。
6.2 接口
当抽象类中的方法都是抽象的,这时可以用另一种方式表示这种类,即接口interface。所以接口是一个特殊的抽象类,在上述抽象类的一般特性中,接口也有,如不能实例化。但是,接口和抽象类有本质的区别。
格式:interface {} 不使用class。但编译器编译时仍然生成.class文件。
特点:接口是对外暴露的,能降低耦合性、扩展功能。
对于接口可以利用电脑、鼠标加以理解。电脑是必须要具有鼠标的功能的,鼠标是通过电脑提供的USB接口,与电脑合为一体。而不是将鼠标直接内接在电脑中。这样不同的电脑也可以使用相同的鼠标。接口,对外界而言,即可插入、也可拔出.
接口中的成员的修饰符都是固定的:
成员变量:public static final
成员方法:public abstract
小结:都是public,,所以其方法属性对外公开。static、final、abstract是默认存在的,没有写明也可以。
类与接口:
类与类是继承关系,接口和类是实现关系。
格式:Class A implements B{} B是接口。
类A实现了接口B,如果A中覆盖了接口B的所有方法,这时就可以通过对A实例化来调用这些方法。注:A必须完全覆盖接口的方法才能实例化,否则还是个抽象类。
类与接口的实现关系也可以理解为一种“继承”。因为实现类都“继承”了接口的所有。并且还将接口声明的方法具体的实现了。在继承中曾讲述到java不直接支持多继承(会出现调用不明确),而在接口中却能“多实现”,即一个类可以实现多个接口。“多实现”之所以不会出现调用不确定性,是因为接口中的方法只是个声明,而没有方法体,所以接口中的同名方法完全一样没有差异。即使实现类实现了两个接口中的同名方法,而调用时不会冲突。接口避免了单继承的局限性。
细节:一个类可以继承其他类的同时实现多个接口。
接口与接口是继承的关系,并且可以实现多继承。