008_继承和多态

继承和多态

  • 继承
    • 权限修饰符
    • 继承的特点
    • 方法重写
      • 方法重写的其它注意事项
    • 子类构造器的特点
  • 多态
    • 多态的好处
    • 多态下的类型转换问题

继承

  • 提高代码的重用性,减少一些重复代码的书写。
  • Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类和另一个建立起父子关系。
public class B extends A{
}
  • A类称为父类(基类或超类)。
  • B类称为子类(派生类)。
  • 子类能继承父类的非私有成员(成员变量、成员方法)。
  • 子类的对象由子类、父类共同完成的。

权限修饰符

  • 用来限制类中的成员(成员变量、成员方法、构造器)能够被访问的范围。
    • private:只能本类
    • 缺省:本类、同一个包中的类
    • protected:本类,同一个中的类、子类中
    • public:任意位置
      • private < 缺省 < protected < public
修饰符 本类里 同一个包中的类 子孙类 任意类
private
缺省
protected
public

继承的特点

  • 单继承:Java是单继承模式,一个类只能继承一个直接父类。
  • 多层继承:Java不支持多继承,但支持多层继承。
  • 祖宗类:Java中所用的类都是Object类的子类。
  • 就近原则:优先访问自己类中,自己类中的没有才会访问父类。
    • 在子类方法中访问其他成员(成员变量、成员方法),是依照就近原则的。
      • 先子类局部范围找,然后子类成员范围找,然后父类成员范围找,如果父类范围还没有找到则报错。
    • 如果子父类中,出现了重名的成员,会优先使用子类的,想要访问使用父类方法用 super 关键字。
      • 通过super关键字,指定访问父类的成员:super.父类成员变量/父类成员方法

方法重写

  • 子类觉得父类中的某个方法不好用,或者无法满足自己的需求时,子类可以重写一个方法名称、参数列表一样的方法,去覆盖父类的这个方法,这就是方法重写。
  • 使用Override注解,他可以指定java编译器,检查我们方法重写的格式是否正确,代码可读性也会更好。

方法重写的其它注意事项

  • 子类重写父类方法时,访问权限必须大于或者等于父类该方法的权限( public > protected > 缺省 )。
  • 重写的方法返回值类型,必须与被重写方法的返回值类型一样,或者范围更小。
  • 私有方法、静态方法不能被重写,如果重写会报错的。

子类构造器的特点

  • 子类的全部构造器,都会先调用父类的构造器,在执行自己。
  • 默认情况下,子类全部构造器的第一行代码都是 super() (写不写都有) ,它会调用父类的无参数构造器。
  • 如果父类没有无参数构造器,则我们必须在子类构造器的第一行手写super(….),指定去调用父类的有参数构造器。
  • 子类构造器可以通过调用父类构造器,把对象中包含父类这部分的数据先初始化赋值,
  • 再回来把对象里包含子类这部分的数据也进行初始化赋值。
  • this(…)调用兄弟构造器
    • 任意类的构造器中,是可以通过this(…) 去调用该类的其他构造器的。
    • this(…) 、super(…) 都只能放在构造器的第一行,因此,有了this(…)就不能写super(…)了,反之亦然。

多态

  • 多态是在继承/实现情况下的一种现象,表现为:对象多态、行为多态。
  • 多态的前提:
    有继承/实现关系;存在父类引用子类对象;存在方法重写。
  • 多态是对象、行为的多态,Java中的属性(成员变量)不谈多态。

多态的好处

  • 在多态形式下,右边对象是解耦合的,更便于扩展和维护。
  • 定义方法时,使用父类类型的形参,可以接收一切子类对象,扩展性更强、更便利。
  • 多态下不能使用子类的独有功能。

多态下的类型转换问题

  • 自动类型转换:父类 变量名 = new 子类();
  • 强制类型转换:子类 变量名 = (子类) 父类变量
    • 存在继承/实现关系就可以在编译阶段进行强制类型转换,编译阶段不会报错。
    • 运行时,如果发现对象的真实类型与强转后的类型不同,就会报类型转换异常(ClassCastException)的错误出来。
  • 强转前,Java建议:
    • 使用instanceof关键字,判断当前对象的真实类型,再进行强转。
    • p instanceof s ;表示 s 的父类是否为 p ,是返回true,否则false.

你可能感兴趣的:(java,开发语言)