java的继承、多态

继承

一、基础

1.子类自动拥有父类定义的的方法和属性

2.父类也叫超类、基类

3.子类又叫派生类

二、便利

1.代码复用性

2.代码扩展性、维护性

三、细节

1.子类继承的所有属性、方法,但无法访问私有属性和方法,要通过父类提供公共的方法访问。(非私有的直接访问 )

2.子类必须调用父类构造器完成父类初始化(默认调用父类无参构造器,构造器中默认有super()

3.在父类没有无参构造器的情况下,子类构造器会利用super去指定使用那个构造器

4.如果希望调用父类的某个构造器,则显式调用一下(super(参数列表))从儿子的构造器被调用去父亲的构造器。(执行时实际上:先父后子)

5.super()this)在使用时放在构造器第一行(只能在构造器使用)。

6.object类时所有类的父类(ctrl+h看继承关系)

7.父类构造器调用不限于直接父类,会一直追溯到object类

8.java是单继承机制,子类最多继承一个父类(直接继承)但是可以怎么让A继承B、C类?A->B->C

9.不能滥用继承,子父类间需要满足is_a逻辑关系

四、本质

(一)内存布局

子类对象创建的内存布局

new son ?

->在方法区查找父类、加载类(object->grandpa->father->son)

->在中开辟空间(开爷爷的属性(字符串会存放地址指向常量池的空间)->开放爸爸的属性->开放儿子的属性)

->在中main栈对象指向对堆中空间

(二)查找关系

查找关系返回信息

son.name ?

->子类是否有该属性

->有且可访问则返回信息

->没有则想上找父类

->如果父类有且可访问则返回信息

->父类没有则继续找

->父亲已有私有信息,不会再访问爷爷了,而会报错

(三)基本思想

父类构造器完成父类属性的初始化,子类构造器初始化子类的属性。

代码实现:exercise包里。

五、super关键字

(一)基本介绍

代表父类的引用 ,用于访问父类的方法、属性、构造器。

(二)使用

1.访问父类属性但是不访问私有属性、方法。语法:super.属性名 ;super.方法名(参数列表);

2.访问父类构造器只能在子类构造器的第一行用。

3.访问不限父类,A->B->C,都有某同名属性,查找遵循就近原则。

(三)好处

1.分工初始化明确

2.子类与父类成员重名时,只能通过super来访问父类成员,不重名时与this使用相同

(四)查找方法

cal();

->子有可调用则调用

->子无父有且可调用,调用

->父无找父亲的父亲直到找到(方法私有则会停止找且报错)或者到object类(会有提示)

this.cal();

->查找同上

super.cal();

->查找略过找子类中的某方法

->其他同上

多态

一、便利、前提

1.提高代码复用性

2.提高代码可维护性

前提:两对象存在继承关系

二、基本介绍、具体体现

方法或者对象有多种形态。

1.方法的多态–重写、重载;

2.对象的多态–核心

(1)一个对象的编译类型和运行类型可以不一样

(2)编译类型在定义对象时,就确定不变

(3)运行类型是可以

(4)对象的编译类型看定义时 =号的左边,运行类型 = 号的右边

三、多态的向上转型

1.本质:父类的引用指向子类的对象.

2.语法:父类类型 对象名 = new 子类类型();eg.Animal animal = new dog();

编译类型Animal;运行类型dog

3.特点:

编译类型 = 运行类型。

可以调用父类所有成员(遵循访问权限)

不能调用子类特有成员

编译时调用成员由编译类型决定

最后运行效果看子类呈现,从子类查找调用

四、多态的向下转型

1.语法:子类类型 引用名 = (子类类型)父类引用eg.Cat cat = (cat)animal;编译类型:cat; 运行类型:cat

2.只能强转父类引用,不能强转父类的对象

3.父类的引用必须指向的是当前目标类型的对象

4.强转后可以调用子类的所有成员

**要求:**强转的父类引用必须指向需要是转向类型的对象->前提eg.Animal animal = new cat();

五、instanceof

判断对象的运行类型是否为

->of后所填类型

->of后所填类型的子类型(of后面填写父类)

返回true/flase.

六、动态绑定机制

1.调用对象方法时,该方法会与该对象的内存地址/运行类型绑定

2.对象属性没有动态绑定机制,哪里声明哪里使用。

七、多态数组

定义:

数组定义类型为父类类型,实际保存的元素类型为子类类型。

八、多态参数

其他补充

this(“abc”)

代表调用自己的参数为字符串的构造器!

方法重写(覆盖)

(一)基本介绍

1.子类的的方法定义形式与父类的一样(名称、参数

2.子类的方法重写了父类的方法(ctrl+b代表定位)

3.使用方法时会查到子类的并调用

(二)细节

1.重写的返回类型要么一样,要么是父类返回类型的子类,or编译错误。

2.子类方法不能缩小父类方法的访问权限(public!-/->private)

代码:Exercise01包

(三)其他

属性没有重写之说,直接看编译类型

方法的调用查找从运行类型开始查找,属性的是看编译类型

同一个包里不能用相同的类名.

Object类详解

1.equals方法

”==运算符“

->用于判断基本类型与引用类型

->基本类型的值相等->引用类型的地址是否相等(是不是一个对象)

”equals方法“

->用于判断引用类型

->判断内容是否相同

->“sdf”.equals(“sdf”);

->判断自己写的类的对象时需要在所在类重写equals()方法,否则使用Object类中方法则仍为==判断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值