一:继承的优点和缺点
好处:
1、子类能自动继承父类的对象
2、创建子类的对象时,无须创建父类的对象
坏处:
1、破坏封装,子类与父类之间紧密耦合,子类依赖于父类的实现,子类缺乏独立性。
2、支持扩展,但是往往以增强系统结构的复杂度为代价
3、不支持动态继承。在运行时,子类无法选择不同的父类
4、子类不能改变父类的接口
二:子类重写父类的方法
子类扩展了父类,子类是一种特殊的父类。
子类可以获得父类所有的属性和方法,达到代码复用的目的。子类总以父类为基础增加新的属性和方法。但是有时候我们还需要重写父类的方法。
子类重写父类的方法遵循的是“两同两小一大”原则。
两同:指的是方法名和形参列表相同。
两小:指的是子类方法的返回值类型要小于或等于父类被覆盖方法的返回值,子类方法声明抛出的异常应比父类方法抛出的异常要小或相等。
一大:指的是子类方法的访问权限应该比父类方法要大或相等。
注意点:覆盖方法和被覆盖方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法,否则回报编译错误。代码如下:
class SuperClass{
public void test(){}
public void test1(){}
}
class SubClass extends SuperClass{
//注释掉了,编译时会报This static method cannot hide the instance method from SuperClass
//public static void test(){}
@Override
public void test1(){}
}
三:继承下构造方法的执行过程:
其实一句话说就是:
先执行属性的直接赋值,其次执行无参的构造方法,有参的会把无参的覆盖掉
四:抽象类和抽象方法的使用:
1.抽象类:
(1) 随着继承层次中一个个新子类的定义,类变得越来越具体,而父类则更一般,更通用。类的设计应该保证父类和子类能够共享特征,有时将父类设计得非常得抽象以至于它没有具体的实例,这样的类就叫做抽象类。也可以总结为:抽象类是用来模型化那些父类无法确定全部实现,而是由其子类提供具体实现的对象的类。
(2)抽象类使用需注意的点
①不可被实例化
②抽象类有构造器(凡是类都有构造器)
③抽象方法所在的类,一定是抽象类
④抽象类中可以没有抽象方法
2.抽象方法:
(1)抽象类中只表明方法,没有方法体的方法,主要用于声明方法功能,交由子类去重写(覆盖),实现去其功能。
(2)抽象方法使用需注意的点
①格式:没有方法体,包括{};如:public abstract void eat();
②抽象方法只保留方法的功能,而具体的执行,交给继承抽象类的子类,由子类重写此抽象方法
③若子类继承抽象类,并重写了所有的抽象方法,即这个子类是一个“实体类”,即可以实例化
④若子类继承抽象类,没有冲写所有的抽象方法,意味着子类仍有抽象方法,则声明必须为abstract的!
五:final修饰属性、方法、类
1. final 修饰类中的属性
表示该属性一旦被初始化便不可改变,这里不可改变的意思对基本类型来说是其值不可变,而对对象属性来说其引用不可再变。其初始化可以在两个地方:一是其定义处,也就是说在 final 属性定义时直接给其赋值;二是在构造函数中。这两个地方只能选其一,要么在定义时给值,要么在构造函数中给值,不能同时既在定义时赋值,又在构造函数中赋予另外的值。
2. final 修饰类中的方法
说明这种方法提供的功能已经满足当前要求,不需要进行扩展,并且也不允许任何从此类继承的类来重写这种方法,但是继承仍然可以继承这个方法,也就是说可以直接使用。在声明类中,一个 final 方法只被实现一次。
3. final 修饰类
表示该类是无法被任何其他类继承的,意味着此类在一个继承树中是一个叶子类,并且此类的设计已被认为很完美而不需要进行修改或扩展。
注意:
对于 final 类中的成员,可以定义其为 final,也可以不是 final。而对于方法,由于所属类为 final 的关系,自然也就成了 final 型。也可以明确地给 final 类中的方法加上一个 final,这显然没有意义。