封装
高内聚,低耦合
封装:使一些属性变量被保护,但留有可操作的接口(方法)
this.
就近原则:当局部变量的名字和成员变量的名字相同时,就近调用
this的作用:调用成员变量
继承
- 子类(派生类)父类(基类),之间有is a的关系
- 子类会继承父类的方法,但私有的不可继承
- java中有单继承,没有多继承
- 通过final修饰的类不能被继承
- 构造方法不能继承
super
- 默认调用super调用父类无参,故先打印出person
- 因为默认存在super,所以在父类存在有参构造时必须将无参构造显示,否则会出现编译错误
- super必须在子类无参方法的第一行(this相同)
故super与this不能同时调用方法
方法重写
需要有继承关系,子类重写父类的方法
注意观察不同
- 需要有继承关系,子类可以重写父类的方法(不可重写属性)
- 方法名必须相同,参数类别必须相同,方法体不同
- 子类的重写可以将父类的范围扩大(protect to public 等等)但不可以将父类的范围缩小
- 抛出的异常可以被缩小,但不能扩大
- 使用方法重写的原因:需要的操作父类不满足要求
- static方法属于类,不属于实例(实例是类的一个对象,它具有该类所定义的属性和方法),不能被重写
- static方法只能用类名来调用。所以无法被Animal a = new Cat();这一多态的语句影响。
- 下图中a.doSome();输出Animal的dosome方法
- final无法被重写
- private是私有的不能被重写
###Object类中的toString方法重写
当toString方法输出的内容不能满足业务需求时,使用toString方法重写
多态
什么是多态?
为cat赋予一个独有的方法,然后调用a5去完成调用
转型
向下转型:父>子(强制类型转换)
向上转型:子>父(自动类型转换)
强转有可能在运行时报错
增强可拓展性,即同一个方法,可根据发送对象的不同而采取不同的行为方式
(person类中为输出run,但s1s2都输出son)父类的run被子类方法改写了(如上图)
对象可执行的方法,主要看左边的类中是否包含这个方法(继承,原本就有,或被子类方法重写)
- 多态是方法的多态
- 多态的存在条件:继承关系,方法重写(方法如果不重写,则调用各自的方法,与普通的无区别),***father f1 = new son();***父类的引用指向子类对象
关于new的理解
实例方法的访问可以通过一条口诀来记忆:编译看左边,运行看右边。在 Parent p = new Child();中,使用引用p去调用实例方法,需要Parent类中有这个实例方法,才能编译通过,这称为静态绑定。但是在运行的时候,需要去在Child中寻找对应的方法,称为动态绑定。因此,实例方法才是多态的表现,静态方法和变量在多态中都是无效的。
instanceof
用于在运行阶段动态判断引用指向的对象类型(animal a = new cat();父类的引用指向子类的对象,实际上指向的对象就是等式右边的实际类型)
多态在实际开发中的作用
减少耦合度,提高拓展性(向拓展开放,向修改关闭)
- 给cat和dog类一个父类pet,给pet一个抽象的方法eat,再利用方法重写,使得不同宠物有不同的eat方法
- 主人类只需调用pet类中的eat方法,而无需修改。只需添加新增宠物类以及修改测试类