继承 多态

java大特性:封装,继承和多态。

  1. 封装就是将类的信息隐藏在类内部,不允许外部程序直接访问,而是通过该类的方法实现对隐藏信息的操作和访问。主要通过访问控制符实现,详见修饰符
  2. 继承是类与类的一种关系,比较像集合中的从属于关系。比如说,狗属于动物。就可以看成狗类继承了动物类,那么狗类就是动物类的子类(派生类),动物类就是狗类的父类(基类)。在Java中是单继承的,也就是说一个子类只有一个父类。
  3. 多态指的是对象的多种形态。多态有两种:引用多态和方法多态。继承是多态的实现基础。

1.引用多态 

父类的引用可以指向本类的对象(即向上转型,向上转型的引用只能调用父类中存在的方法,而不能调用子类中新加的方法)

2. 方法多态

创建父类对象时,调用的方法为父类方法;

创建子类对象时,调用的方法是子类重写的方法或继承自父类的方法;

  • 继承
  1. 定义:继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。子类又被称为派生类,父类被称为超类
  2. 继承的目的:继承是为了降低代码重复率,提高代码复用性,提高可维护性
  3. 特性:
    1. 子类拥有父类非private(应该也有非default吧)的属性、方法。为了访问父类的私有属性,可以在父类中写publicsettinggetting方法,子类通过调用这两种方法访问该私有属性。
    2. 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
    3. 子类可以用自己的方式实现父类的方法。
    4. Java的继承是单继承,但是可以多层继承(其实就是和C++中的继承多个类一样,只是换了种方式),单继承就是一个子类只能继承一个父类,多重继承就是,例如A类继承B类,B类继承C类,所以按照关系就是C类是B类的父类,B类是A类的父类,这是java继承区别于C++继承的一个特性。
    5. 提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系)。
  4. 继承关键字:

继承可以使用 extends implements 这两个关键字来实现继承,而且所有的类都是继承于 java.lang.Object,当一个类没有继承的两个关键字,则默认继承object(这个类在 java.lang 包中,所以不需要 import)祖先类。

  1. final 关键字:

final 关键字声明类可以把类定义为不能继承的,即最终类;或者用于修饰方法,该方法不能被子类重写:

:实例变量也可以被定义为 final,被定义为 final 的变量不能被修改。被声明为 final 类的方法自动地声明为 final(没有子类当然就不能被重写),但是实例变量并不是 final

  1. 构造器

子类不能继承父类的构造器(构造方法或者构造函数),如果父类的构造器带有参数,则必须在子类的构造器中显式地通过 super 关键字调用父类的构造器并配以适当的参数列表。super调用父类构造时,一定要放在构造方法的首行上。

如果父类构造器没有参数,则在子类的构造器中不需要使用 super 关键字调用父类构造器,系统会自动调用父类的无参构造器。

在继承关系之中,如果要实例化子类对象,会默认先调用父类构造,为父类之中的属性初始化,之后再调用子类构造,为子类之中的属性初始化,即:默认情况下,子类会找到父类之中的无参构造方法。

  • 多态(子类重写父类的方法)
  1. 定义:

多态是同一个行为具有多个不同表现形式或形态的能力。多态就是同一个接口,使用不同的实例而执行不同操作。当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

  1. 分类:

多态一般分为两种:重写式多态和重载式多态。

      1. 重载式多态,也叫编译时多态。也就是说这种多态再编译时已经确定好了。重载大家都知道,方法名相同而参数列表不同的一组方法就是重载。在调用这种重载的方法时,通过传入不同的参数最后得到不同的结果。
      2. 但是这里是有歧义的,有的人觉得不应该把重载也算作多态。因为很多人对多态的理解是:程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,这种情况叫做多态。 这个定义中描述的就是我们的第二种多态重写式多态。并且,重载式多态并不是面向对象编程特有的,而多态却是面向对象三大特性之一(如果我说的不对,记得告诉我。。)。
      3. 我觉得大家也没有必要在定义上去深究这些,我的理解是:同一个行为具有多个不同表现形式或形态的能力就是多态,所以我认为重载也是一种多态,如果你不同意这种观点,我也接受。
      4. 重写式多态,也叫运行时多态。这种多态通过动态绑定(dynamic binding)技术来实现,是指在执行期间判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。也就是说,只有程序运行起来,你才知道调用的是哪个子类的方法。 这种多态通过函数的重写以及向上转型来实现,因为它才是面向对象编程中真正的多态。
  1. 优点

1. 消除类型之间的耦合关系

2. 可替换性

3. 可扩充性

4. 接口性

5. 灵活性

6. 简化性

  1. 多态存在的三个必要条件
  • 继承
  • 重写
  • 父类引用指向子类对象

比如:

Parent p = new Child();

  1. 父类子类对象转换实例:

Animal a = new Cat(); // 向上转型, 父类引用指向子类对象

a.eat(); // 调用的是 Cat eat

Cat c = (Cat)a; // 向下转型

c.work(); // 调用的是 Cat work

可以看出既可以把子类赋给父类(Animal a = new Cat();),也可以把父类强制转换成子类(Cat c = (Cat)a;

  1. 虚方法

我们已经讨论了方法的重写,也就是子类能够重写父类的方法。当子类对象调用重写的方法时,调用的是子类的方法,而不是父类中被重写的方法。要想调用父类中被重写的方法,则必须使用关键字super

两种方式 Son son = new Son()

Parent parent = new Son()

当调用 son.mailCheck() 时,编译器在编译时会在 Son 类中找到 mailCheck(),执行过程 JVM 就调用 Son 类的 mailCheck()

当调用parent.mailCheck() 方法时,编译器会去 Parent类查找 mailCheck() 方法 ,在编译的时候,编译器使用 Parent类中的 mailCheck() 方法验证该语句, 但是在运行的时候,Java虚拟机(JVM)调用的是 Son 类中的 mailCheck() 方法。

  1. 多态的实现方法
      1. 重写
      2. 接口
      3. 抽象类和抽象方法

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值