# 第 07 章:随堂复习与企业真题(面向对象 - 进阶)


# 一、随堂复习

# 1. this 关键字的使用

  • this 调用的结构:属性、方法;构造器

  • this 调用属性或方法时,理解为:当前对象或当前正在创建的对象。

    public void setName(String name){ // 当属性名和形参名同名时,必须使用 this 来区分
    	this.name = name;
    }
    public Person(String name){
        this.name = name;
    }
  • this (形参列表) 的方式,表示调用当前类中其他的重载的构造器。

# 2. 面向对象的特征二:继承性

  • 继承性的好处

    • 减少了代码的冗余,提高了复用性;
    • 提高了扩展性
    • 为多态的使用,提供了前提。
  • Java 中继承性的特点

    • 局限性:类的单继承性。后续我们通过类实现接口的方式,解决单继承的局限性。

      一个子类只能有一个直接父类

    • 支持多层继承,一个父类可以声明多个子类。

  • 基础:class A extends B {}

  • 理解:子类就获取了父类中声明的全部的属性、方法。可能受封装性的影响,不能直接调用。

# 3. 方法的重写(override)

  • 面试题:方法的重载与重写的区别?
    • 方法的重载:“两同一不同”

      同一个类中,相同的类名,不同的形参列表

    • 方法的重写:

      • 前提:类的继承关系
      • 子类对父类中同名同参数方法的覆盖、覆写

# 4. super 关键字的使用

  • super 可以调用的结构:属性、方法;构造器
  • super:父类的
  • super 调用父类的属性、方法:
    • 如果子父类中出现了同名的属性,此时使用 super. 的方式,表明调用的是父类中声明的属性。
    • 子类重写了父类的方法。如果子类的任何一个方法中需要调用父类被重写的方法时,需要使用 super.
  • super 调用构造器:
    • 在子类的构造器中,首行要么使用了 "this (形参列表)",要么使用了 "super (形参列表)"

# 5. (熟悉)子类对象实例化的全过程

  • 结果上来说:体现为继承性
  • 过程上来说:子类调用构造器创建对象时,一定会直接或间接的调用其父类的构造器,以及父类的父类的构造器,...,直到调用到 Object () 的构造器

# 6. 面向对象的特征三:多态性

  • 广义上的理解:子类对象的多态性、方法的重写;方法的重载

    狭义上的理解:子类对象的多态性。

  • 格式:Object obj = new String ("hello"); 父类的引用指向子类的对象

  • 多态的好处:减少了大量的重载的方法的定义;开闭原则

    • 举例:public boolean equals (Object obj)
    • 多态,无处不在!讲了抽象类、接口以后,会有更好的理解。
  • 多态的使用:

    • 虚拟方法调用。“编译看左边,运行看右边”。
    • 属性,不存在多态性,都看左边
  • 多态的逆过程:向下转型,使用强转符 ()

    • 为了避免出现强转时的 ClassCastException ,建议 () 之前使用 instanceOf 进行判断

# 7. Object 类的使用

  • 根父类
  • equals () 的使用
    • 重写和不重写的区别
      • 不重写:与 == 相等,比较引用数据类型的内存地址
      • 重写:比较类的属性值
    • 面试题: == 和 equals ()
  • toString () 的使用
    • Object 中 toString ()调用后,返回当前对象所属的类和地址值
    • 开发中常常重写toString (),用于返回当前对象的属性信息

# 8. 项目二:拼电商客户管理系统

  • 编写两个类:Customer 、 CustomerList 类(封装了对数组的增删改查操作)

# 二、企业真题

# 2.1 继承性

# 1. 父类哪些成员可以被继承,属性可以被继承吗?可以或者不可以,请举下例子。(北京明 ** 信)

父类的属性、方法可以被继承构造器可以被子类调用

# 2.2 重写

# 1. 什么是 Override,与 Overload 的区别(顺 *、软 ** 力、明 * 数据、阳 * 科技、中 * 软)

Overload(重载):两同一不同

同一个类中,相同的方法名称,不同的形参列表的方法。

Override(重写):子类对父类中同名同参数的方法的覆盖

# 2. Overload 的方法是否可以改变返回值的类型?(新 * 陆)

当然可以!重载仅要求 “在同一个类中,有同样的方法名称,且形参列表不同”,对返回值类型没有要求。

# 3. 构造器 Constructor 是否可以被 override?

当然不能!override 要求 “子类对父类中同名同参数的方法进行覆写”,而构造器的名称只能是其所在类的类名,而子类与父类的类名不可能相同。

但是可以被重载。

不能!构造器可以重载

# 4. 为什么要有重载,我随便命名一个别的函数名不行吗?谈谈你是怎么理解的。(腾 *)

见名知意。

# 2.3 super 关键字

# 1. super 和 this 的区别 (蚂 ** 服)

this 调用属性或方法时,理解为:当前对象或当前正在创建的对象。

super 调用父类的属性、方法。

# 2. this、super 关键字分别代表什么?以及他们各自的使用场景和作用。(北京楚 * 龙)

# 2.4 多态

# 1. 谈谈你对多态的理解 (三 * 重工、江 * 智能、银 * 数据、君 * 科技)

  • Java 中实现多态的机制是什么?(国 * 电网)

    父类或接口定义的引用变量可以指向子类或实现类的实例对象,而程序调用的方法运行期才动态绑定,就是引用变量所指向的具体实现对象的方法,也就是内存里正在运行的那个对象的方法,而不是引用变量的编译期类型中定义的方法

  • 什么是多态?(上 * 银行)

    多态是同一个行为具有多个不同表现形式或形态的能力。

    指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。

  • Java 中的多态是什么意思?(贝 *)

    体现为 **父类引用变量可以指向子类对象**。

    注意:在使用多态后的父类引用变量调用方法时,会调用子类重写后的方法

    • 多态成员变量:编译、运行看左边;

    • 多态成员方法:编译看左边,运行看右边;

# 2.== 多态 new 出来的对象跟不多态 new 出来的对象区别在哪?==(万 * 智能)

多态中成员方法在编译时看左边,运行时看右边。因此,多态 new 出来的对象会屏蔽子类类特有的属性和方法

# 3. 说说你认为多态在代码中的体现(楚 * 龙)

无处不在!

# 2.5 Object 类

# ==1. 与 equals 的区别(拓 * 思)

类似问法:
> 两个对象A和B,A==B,A.equals(B)有什么区别(华油**普)
  • ==对于基本数据类型就是比较值,对于引用数据类型就是比较内存地址

  • equals

    • 它是属于 java.lang.Object 类里面的方法,如果该方法没有被重写过默认也是 == ,只能对引用数据类型比较内存地址

      因此,通常情况下,重写 equals 方法,会比较类中的相应属性是否都相等。不然就没有重写的必要了。

    • 我们可以看到String 等类的 equals 方法是被重写过的,因此是比较值的,而且 String 类在日常开发中用的比较多,久而久之,形成了 equals 是比较值的错误观点。

# 2. 重写 equals 方法要注意什么?(安 ** 网络科技)

  • 明确判定两个对象实体 equals () 的比较标准,是否需要所有的属性参与
  • 对象的属性如果也是自定义的类型,此属性所在类也需要重写 equals ()

# 3. Java 中所有类的父类是什么?他都有什么方法?(阿 * 校招)

java.lang.Object 类:

  • equals()
  • toString()
  • hashCode()
  • getClass()
  • clone()