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(实参) 【调用父类的构造方法】 

posted on 2022-03-21 16:13  小熊冰淇淋  阅读(28)  评论(0编辑  收藏  举报