继承与多态

一、为什么要继承?

继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展和增加新功能,这样产生新的类,称派生类。

继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。继承主要解决的问题是:共性的抽取,实现代码复用。

二、继承的语法

修饰符 class 子类 extends 父类 {
// ... 
}

三、super关键字

1.继承成员时遵循就近原则,自己有优先自己的,如果没有则向父类中找。若父类和子类都没有定义,则编译报错。

   继承方法时:

    通过子类对象访问父类与子类中不同名方法时,优先在子类中找,找到则访问,否则在父类中找,找到 则访问,否则编译报错。

    通过派生类对象访问父类与子类同名方法时,如果父类和子类同名方法的参数列表不同(重载),根据调用方法适传递的参数选择合适的方法访问,如果没有则报错;

2.问:如果子类中存在与父类中相同的成员时,那如何在子类中访问父类相同名称的成员呢?

答:java提供了super关键字:表示的是从父类继承过来的数据的引用,增强了可读性

           指定告诉编译器,访问的的是父类中的(父子类中有相同变量时)

// 访问父类的成员变量时,需要借助super关键字
// super是获取到子类对象中从基类继承下来的部分
super.a = 200;
super.b = 201;
// 父类和子类中构成重载的方法,直接可以通过参数列表区分清访问父类还是子类方法



methodA(); // 没有传参,访问父类中的methodA()
methodA(20); // 传递int参数,访问子类中的methodA(int)



// 如果在子类中要访问重写的基类方法,则需要借助super关键字
methodB(); // 直接访问,则永远访问到的都是子类中的methodA(),基类的无法访问到
super.methodB(); // 访问基类的methodB(

四、子类构造方法

1.子类对象构造时,需要先调用基类构造方法,然后执行子类的构造方法。

2.子类继承父类之后,要先对父类进行成员的初始化(使用构造方法)

实例代码块和静态代码块执行顺序: 

无继承关系时:静态代码块执行-实例代码块执行-构造方法执行

1) 静态代码块先执行,并且只执行一次,在类加载阶段执行

2)当有对象创建时,才会执行实例代码块,实例代码块执行完成后,最后构造方法执行

有继承关系时: 

1)父类静态代码块优先于子类静态代码块执行,且是最早执行

2)父类实例代码块和父类构造方法紧接着执行

3)子类的实例代码块和子类构造方法紧接着再执行

4)第二次实例化子类对象时,父类和子类的静态代码块都将不会再执行

ps:

1)若父类显式定义无参或者默认的构造方法,在子类构造方法第一行默认有隐含的super()调用,即调用基类构造方法

2)如果父类构造方法是带有参数的,此时需要用户为子类显式定义构造方法,并在子类构造方法中选择合适的父类构造方法调用,否则编译失败。

3)在子类构造方法中,super(...)调用父类构造时,必须是子类构造函数中第一条语句。

4) super(...)只能在子类构造方法中出现一次,并且不能和this同时出现

3.super和this的区别?

同:

1)都是Java中的关键字

2)只能在类的非静态方法中使用,用来访问非静态成员方法和字段

3)在构造方法中调用时,必须是构造方法中的第一条语句,并且不能同时存在

异:

  1)super.父类成员                         1)this.当前类的成员变量

  2)super.父类成员方法                  2)this.当前类的成员变量方法

  3)super.父类的构造方法              3)this.当前类的构造方法

4.java不支持多继承,c++支持,为解决这个问题,java引入了接口

五、protected关键字

为了实现封装特性,Java中引入了访问限定符,

主要限定:类或者类中成员能否在类外或者其他包中被访问。

protected可访问的:同一包的同一类

                                 同一包的不同类

                                 不同包中的子类

五、final关键字

我们并不希望类之间的继承层次太复杂. 一般我们不希望出现超过三层的继承关系. 如果继承层 次太多, 就需要考虑对代码进行重构了,因此有了final关键字。

1. 修饰变量或字段,表示常量(即不能修改)

final int a = 10;
a = 20; // 编译出错

2. 修饰类:表示此类不能被继承,称为密封类

final public class Animal {
...
}
public class Bird extends Animal {
...
}
// 编译出错
Error:(3, 27) java: 无法从最终com.bit.Animal进行继

3.修饰方法:当前方法不能被重写

六、组合

继承表示对象之间是is-a的关系,比如:狗是动物,猫是动物

组合表示对象之间是has-a的关系,比如:汽车

七、多态

通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状 态。

同一个引用调用了同一个方法,但因为引用的对象的不同而导致所表现的行为不同,我们把这种思想称为多态。

1.向上转型-发生多态的条件之一

当父类对象无法调用子类方法时:

Animal animal = new Dog (旺财,1,黄色)
               //父类引用 引用了子类对象
                 //向上转型

1)直接赋值

2)通过传参

3)通过返回值

2.父类引用子类对象,通过父类引用去调用和子类同名的方法,此时调用的是子类的方法,这个过程叫做动态绑定。这是理解多态的基础!

  静态绑定:如重载,是编译时期绑定的,根据给的参数不一样,来确定调用哪个方法。

3.重写:1)方法名相同

              2)参数列表相同(顺序,个数,类型)

              3)返回值相同

ps被final修饰,被static修饰,被private修饰的的方法不能被重写

3.1重写规则

  1)

  2)

  3)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值