1.this
this是一个关键字,全部小
this的内存图
一个对象一个this,this是一个变量,是一个引用, this保存当前对象的内存地址。指向自身,所以,严格意义上来说,this代表的就是当前对象。
this只能使用在实例方法中,谁调用这个实例方法,this就是谁,所以this代表的就是当前对象。
Q:什么时候方法定义为实例方法,什么时候方法定义为静态方法?
A:如果方法中直接访问了实例变量,该方法必须是实例方法。
this关键字在大部分情况下可以省略,什么时候不能省略呢?在实例方法中,或者构造方法中,为了区分局部变量和实例变量,这种情况下:this.是不能省略的。
通过当前的构造方法去调用另一个本类的构造方法,可以使用如下的语法格式:this(实际参数列表);
2.继承
Q:继承有什么用?
A:继承的作用:基本作用:子类继承父类,代码可以得到复用。
主要作用:有了继承关系,才有后期的覆盖和多态。
继承的相关特性:
B类继承A类,则称A类为超类(superclass)、父类、基类
B类则称为子类(subclass)、派生类、 扩展类。
class A{}
class B extends A{}
我们平时聊天说的比较多的是:父类和子类
superclass 父类
subclass 子类
java中只支持单继承,不支持多继承,而C++继承多继承。
java中不允许这样写代码:
class B extends A,C{}这是错误的。
虽然java中不支持多继承,但有时候会产生间接继承的效果。
例如class C extends B , class B extends A,也就是说C直接继承B,其实C还间接继承A。
在java中规定,子类继承父类,除构造方法不能继承之外,剩下的都可以继承。但是私有方法的属性无法在子类中直接访问。
在java中的类没有显示的继承任何类,则默认继承Object类,Objcet类是java语言提供的根类(老祖宗类),也就是说,一个对象与生俱来继承Object类型中的所有特征。
继承也有一些缺点,例如CreditAccount类继承Account类会导致它们之间的耦合度非常高,Account类发生改变之后会马上影响到CreditAccount类
3.方法覆盖
方法重载的定义:如果有两个方法的方法名相同,但参数不一致,哪么可以说一个方法是另一个方法的重载
方法覆盖的定义:如果在子类中定义一个方法,其名称、返回类型及参数签名正好与父类中某个方法的名称、返回类型及参数签名相匹配,那么可以说,子类的方法覆盖了父类的方法。
方法覆盖又叫做方法重写:英语单词叫override或者overwrite都可以
怎么才能方法覆盖呢?
条件一:两个类必须要有继承关系
条件二:重写之后的方法和之前的方法具有:
相同的返回值类型
相同的方法名 、相同的形式参数列表
条件三:访问权限可以更低,不能更高
条件四:重写之后的方法不能比之前的方法抛出更多的异常,可以更少
注意事项:
一:方法覆盖只是针对于方法,和属性无关
二:私有方法无法覆盖
三:构造方法不能被继承,所以构造方法也不能被覆盖
四:方法覆盖只针对于实例方法,静态方法覆盖没有意义。
4.向上转型和向下转型
java中允许向上转型,也允许向下转型。无论是向上转型还是向下转型,两种类型之间都必须有继承关系
向上转型
子→父
向下转型
父→子
Q:什么时候应该使用向下转型?
A:当你需要访问的是子类对象中特有的方法,则必须进行向下转型
向上转型无风险,因为如果错误编译时会报错
而向下转型有风险,可以使用instanceof来避免ClassCastExcepciton(类型转换异常)
instanceof:
第一:instanceof可以在运行阶段动态判断引用指向的对象类型
第二:instanceof的语法:
(引用 instanceof 类型)
第三:instanceof运算符的运算结果只能是:true/false
第四:c是一个引用,c变量保存了内存地址指向了堆中的对象。
假设(c instanceof Cat)为true 表示:
c引用指向的堆内存中的java对象是一个cat
假设(c instanceof Cat)为false表示:
c引用指向的堆内存中的java对象不是一个cat
5.多态
什么是多态?
多种形态,多种状态
多态的优点
- 1. 消除类型之间的耦合关系
- 2. 可替换性
- 3. 可扩充性
- 4. 接口性
- 5. 灵活性
- 6. 简化性
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
https://www.runoob.com/java/java-polymorphism.html
6.super
super是一个关键字,全部小写。
super和this对比:
this:
this能出现在实例方法和静态方法中
this的语法是:"this." “this()"
this不能使用在静态方法中
this.大部分情况下是可以省略的
this.什么时候不能省略呢?在区分局部变量和实例变量的时候不能省略
this() 只能出现在构造方法的第一行,通过当前的构造方法来调用”本类“中的其他构造方法,目的是”代码复用“
super:
super能出现在实例方法和静态方法中
super的语法是:"super." “super()"
super不能使用在静态方法中
super.大部分情况下是可以省略的
this.什么时候不能省略呢?
super() 只能出现在构造方法的第一行,通过当前的构造方法来调用”本类“中的其他构造方法,目的是”代码复用“
super()通过子类的构造方法调用父类的构造方法
模拟现实世界的这种场景:要想有儿子,需要先有父亲
重要结论:
当一个构造方法第一行既没有this()或super()的话,会默认有一个super();
表示通过当前子类的构造方法调用父类的无参数构造方法。所以必须保证父类的无参数构造方法是存在的。
this()和super()不能共存,它们都只是出现在构造方法的第一行。
在父和子中有同名的属性,或者说有相同的方法。
如果此时想在子类中访问父中的数据,必须使用"supe.r"加以区分
super.属性名 【访问父类的属性】
super.方法名(实参) 【访问父类的方法】
super(实参) 【调用父类的构造方法】