面对对象-继承与多态

继承

使用细节

1.子类继承了所有的属性和方法(属性包括在父类中已经被赋的值),非私有的属性和方法可以在子类直接访问,但是私有属性和方法不能直接在子类访问,通过父类提供的公共方法去访问。

2.子类必须调用父类的构造器,完成对父类的初始化。

3.当创建子类对象时,不管使用子类哪个构造器,默认情况下总是会调用父类的无参构造器,如果父类没有提供无参构造器(在父类中如果没有无参构造器代码段,并且声明了其他有参构造器,则默认的无参构造器被隐藏),则必须在子类的构造器中用super去指定使用父类的哪个构造器完成对父类的初始化工作,否则,编译将不通过。(初始化子类前,总是先初始化父类

4.如果希望调用父类的哪个构造器,显式的调用一下。

5.super(...)(注意super(...)是构造器,和下面的super.不同)语句必须放在构造器的第一行。

6.JAVA中是单继承。

继承的本质

 当执行 Son son = new Son();语句时。会从Objectlei类逐层向下加载,直到加载至Son类。

当要访问son中的属性时,却是从son开始向父类查找。

如果Object 中也没有,就会报错。如果father类中有age属性,但是却用private修饰(子类不能访问父类私有成员),此时会报错。(一层层查找,不会跳跃)。

(儿子先找,儿子没有找父亲,父亲没有找爷爷,直到找到Object)。

SUPER.

当一些属性和方法在子类中被重写,而我们又希望访问父类的这些属性方法。可以使用super.关键字。

super的访问不局限于上一级父类,如果在当前类的上一级父类中没有找到,则会一直向上查找。

 方法重写

1.子类的方法的参数,方法名称,要和父类方法的参数,返回方法相同。

2.子类方法的返回类型可以与父类方法返回类型相同,或者是父类返回方法的子类。

3.子类不能缩小父类方法的访问权限

多态

方法或对象具有多种状态,例如方法的重写与重载。但最主要的还是对象的多态。

重要的几句话

1.一个对象具有两种类型,编译类型和运行类型。

2.编译类型是由声明该变量时的类型所决定,运行类型由实际赋给该对象的类型所决定。

3.编译类型在定义对象时就确定了,不能改变。运行类型可以变化。

4.编译类型看=左边,运行类型看=右边

//假设Animal是Dog的父类
Anima animal = new Dog();//此时父类的引用animal指向了一个子类Dog对象,animal的编译类型就是Animal运行类型就是Dog

那么这个 具有两种类型的animal 究竟有什么特性呢?

看老韩的图

会发现animal在调用子类和父类共有的函数cry()时 是按照子类的类型,也就是运行类型调用的。

向上转型

本质:父类的引用指向了子类的对象。

 animal不能调用子类中特有的成员。(子类重写的成员依然可以调用)

向上转型的调用规则

1.可以调用父类的所有成员(需要遵守访问权限)

2.不能调用子类的特有成员。

PS:个人的一点见解。

在编译器眼里,animal引用依然是Animal类,在Animal中没有的成员自然不能调用。

但是运行时,在虚拟机眼里,这个animal指向堆中的一个Cat类,调用成员时就遵守上文中的查询机制(儿子先找,儿子没有找父亲,父亲没有找爷爷,直到找到Object)。

向下转型

对象的向下的转型是基于向上转型的。

类似于基本数据类型的强转

 注意上图中的animal本来是指向 Cat类型的。也就是向上转型过。

属性重写问题

属性没有重写之说,属性的值看编译类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值