继承
一、基础
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类中方法则仍为==判断。