封装
就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节
将对象中的成员变量进行私有化,外部程序是无法访问的。但是我们对外提供了访问的方式,就是set和get方法
封装的特点
- 封装可以隐藏内部程序实现的细节。
- 减少代码之间的耦合度。
- 方便数据检查,有利于保护对象信息的完整性,同时也提高程序的安全性。
- 便于修改,体高代码的可维护性。
继承
打印顺序:父类对象属性初始化---->父类对象构造方法---->子类对象属性初始化—>子类对象构造方法
使用 extends 继承父类
一个子类只能继承一个父类
子类会继承父类的所有public的字段和方法,对于父类的private 是字段和方法,子类是无法访问的
子类的实例中,也包含着父类的实例,可以使用super关键字得到父类实例的引用
继承的好处就是提高代码复用性。
在继承中如果把字段设为 private, 子类不能访问. 但是设成 public, 又违背了我们 “封装” 的初衷.两全其美的办法就是 protected 关键字。
protected 关键字
对于类的调用者来说,protected 修饰的字段和方法是不能访问的
对于类的子类和同一个包的其他类来说,protected 修饰的字段和方法可以访问
小结:
private : 类内部能访问,类外部不能访问
default (也叫包访问权限):类内部可以访问,同一个包中的类可以访问,其他类不行
protected : 类内部能访问,子类和同一个包中的类可以访问,其他类不行
public : 类内部和调用类都可以访问
this关键字
this关键字代表当前对象
this.属性 操作当前对象的属性
this.方法 调用当前对象的方法。
final关键字
使用final关键字做标识有“最终的”含义。
1. final 修饰类,则该类不允许被继承。
2. final 修饰方法,则该方法不允许被覆盖(重写)。
3. final 修饰属性,则该类的该属性不会进行隐式的初始化,所以 该final 属性的初始化属性必须有值,或在构造方法中赋值(但只能选其一,且必须选其一,因为没有默认值!),且初始化之后就不能改了,只能赋值一次。
4.final 修饰变量,则该变量的值只能赋一次值,在声明变量的时候才能赋值,即变为常量。
super关键字
在对象的内部使用,可以代表父类对象。
1、访问父类的属性:super.age
2、访问父类的方法:super.eat()
super的应用:
子类的构造过程中必须调用父类的构造方法。这个过程我们使用super关键字隐式调用。
如果自己用super关键字在子类里调用父类的构造方法,则必须在子类的构造方法中的第一行。
要注意的是:如果子类构造方法中既没有显式调用父类的构造方法,而父类没有无参的构造方法,则编译出错。
(补充说明:子类构造方法没有通过super显式调用父类的有参构造方法,也没有通过this显式调用自身其他的构造方法,系统默认调用父类法人无参构造方法。【例如:Super()】。子类构造方法通过super显式调用父类的有参构造方法,执行父类相应构造方法,而不执行父类无参构造方法。)
多态
什么叫多态:多态是同一个行为具有多个不同表现形式或形态的能力。
多态的好处 :
1.类调用者对类的使用成本进一步降低 :多态能让类的调用者连这个类的类型是什么都不必知道, 只需要知道这个对象具有某个方法即可
2.能够降低代码的复杂度,避免大量使用if - else
3.可扩展能力强
向上转型
Animal bird2 = new Bird("yy");
此时 bird2 是一个父类 (Animal) 的引用, 指向一个子类 (Bird) 的实例. 这种写法称为 向上转型
向上转型发生的一个时机:
直接赋值,方法传参,方法返回
动态绑定
调用某个类的方法, 究竟执行了哪段代码 (是父类方法的代码还是子类方法的代码) , 要看究竟这个引用指向的是父类对象还是子类对象. 这个过程是程序运行时决定的(而不是编译期)
方法重写
子类和父类的同名方法,且参数个数和类型完全相同
普通方法可以重写,static修饰的或final修饰的不能重写
重写后子类方法权限不能低于父类的方法访问权限
重写和重载的区别
重写就是子类重写与父类,其方法名,参数个数和类型完全相同
重载:方法名称相同,参数类型,个数和顺序不同(注意:返回类型不同不算)
向下转型
向下转型:如果我们在子类中编写一个独有的方法(没有继承父类的方法),此时就不能通过父类的引用创建的子类对象来调用该方法!!!
向上转型是子类对象转成父类对象, 向下转型就是父类对象转成子类对象 ,相比于向上转型来说, 向下转型没那么常见
为了让向下转型更安全, 我们可以先判定一下看看 animal 本质上是不是一个 Bird 实例, 再来转换
Animal animal = new Cat("小猫");
if (animal instanceof Bird) {
Bird bird = (Bird)animal;
bird.fly();
}
instanceof 可以判定一个引用是否是某个类的实例. 如果是, 则返回 true. 这时再进行向下转型就比较安全了
多态中使用this和super区别
this 先查找本类,如果本类没有就调用父类
super 不查找本类,直接调用父类。