面向对象(中)学习笔记二

一、面向对象特征之二:继承性

1、继承性的好处

  • 减少了代码的冗余,提高了代码的复用性
  • 便于功能的扩展
  • 为之后多态性的使用,提供了前提。

2、继承性的格式:class A extentds B{}

  • A:子类、派生类、subclass
    B:父类、超类、基类、superclass

  • 体现:一旦子类A继承父类B以后,子类A中就获取了父类B中声明的所有属性和方法。特别地,父类声明为private的属性或方法,子类继承父类以后,仍然认为获取了父类中私有的结构。只是因为封装性的影响,使得子类不能直接调用父类的结构而已。

  • 子类继承父类以后,还可以声明自己特有的属性或方法:实现功能的扩展。

3、Java关于继承性的规定

  • 一个类可以被多个子类继承
  • Java中类的单继承性:一个类只能有一个父类
  • 子父类是相对的概念。
  • 子类直接继承的父类称为直接父类。间接继承的父类称为间接父类
  • 子类继承父类以后,就获取了直接父类以及所有间接父类中声明的属性和方法

4、Object类

  • 如果我们没有显示的声明一个类的父类的话,则此类继承于java.lang.Object类

  • 所有的java类(除java.lang.Object类之外)都直接或间接继承于java.lang.Object类

  • 意味着,所有的java类具有java.lang.Object类声明的功能。

5、Eclipse debug的使用

  • 如何调试程序

    • System.out.println()
    • Eclipse - Debug调试

6、重写(override / overwrite)

  • 定义:子类继承父类以后,可以对父类中同名同参数的方法,进行覆盖操作。

  • 应用:重写以后,当创建子类对象以后,通过子类对象调用子父类中的同名同参数的方法时,实际执行的是子类重写父类的方法。

  • 面试题:区分方法的重载与重写

    先说一下重载和重写的概念:重载是在同一个类中可以声明多个方法名相同,形参列表不同的方法,它们彼此之间构成重载。同时构造器也可以重载。重写是子类继承父类以后,可以对父类中同名同参数的方法进行覆盖操作。

然后可以谈一下重载和重写的规则。重载:两同一不同。重写:看上面。

然后重载不表现为多态性。重写表现为多态性。重载在编译期就确定了调用哪一个了,运行时也是这一个。重写不是,编译认为是调用父类的,运行时调用的是子类的。

  • 重写的规定

    方法的声明:权限修饰符 返回值类型 方法名(形参列表) throws 异常类型{ //方法体 } 约定俗成:子类中的叫重写的方法,父类中的叫做被重写的方法。

  • 子类重写的方法的方法名和形参列表与父类被重写的方法的方法名和形参列表相同。

  • 子类重写的方法的权限修饰符不小于父类被重写的方法的权限修饰符。

  • 特殊情况子类中不能重写父类中声明为private权限的方法。虽然子类可以定义与父类中同名同参数列表的private方法,但是不认为这是重写。

  • 返回值类型:

    • 父类被重写的方法的返回值类型是void,则子类重写的方法的返回值类型只能是void。

    • 父类被重写的方法的返回值类型是A类型,则子类重写的方法的返回值类型可以使A类或A类的子类。

    • 父类被重写的方法的返回值类型是基本数据类型(比如double),则子类重写的方法的返回值类型必须是相同的基本数据类型(必须是double)。

  • 子类重写的方法抛出的异常类型不大于父类被重写的方法抛出的异常类型(放到异常处理再讲)。

  • 子类和父类中同名同参数的方法要么都声明为非static的(考虑重写),要么都声明为static的(不是重写)。虽然子类可以定义与父类中同名同参数列表的static方法,但是不认为这是重写。

day12_java面向对象(中)学习笔记2 - 图1

7、四种权限访问修饰符

二、super关键字

super关键字的使用

  • super理解为:父类的
  • super可以用来调用:属性、方法、构造器
  • super的使用:调用属性和方法

    • 我们可以在子类的方法或构造器中。通过使用”super.属性”或”super.方法”的方式,显示的调用父类中声明的属性或方法。但是,通常情况下,我们习惯省略”super.”。
    • 特殊情况:当子类和父类中定义了同名的属性时,我们要想在子类中调用父类声明的属性,则必须显示的使用”super.属性”的方式,表明调用的是父类中声明的属性。
    • 特殊情况:当子类重写了父类中的方法以后,我们想在子类的方法中调用父类中被重写的方法时,则必须显示的使用”super.方法”的方式,表明调用的是父类中被重写的方法。
  • super的使用:调用构造器

    • 我们可以在子类的构造器中显示的使用”super(形参列表)”的方式,调用父类中声明的指定的构造器
    • “super(形参列表)”的使用,必须声明在子类构造器的首行!
    • 我们在类的构造器中,针对于”this(形参列表)”或”super(形参列表)”只能二选一,不能同时出现
    • 当我们在构造器的首行,没有显示的声明”this(形参列表)”或”super(形参列表)”,则默认调用的是父类中空参的构造器:super()
    • 在类的构造器中,至少有一个类的构造器中使用了”super(形参列表)”,调用父类中的构造器
    • 当父类中没有空参数的构造器时,子类的构造器必须通过this(参 数列表)或者super(参数列表)语句指定调用本类或者父类中相应的 构造器。同时,只能”二选一” ,且必须放在构造器的首行
    • 如果子类构造器中既未显式调用父类或本类的构造器,且父类中又 没有无参的构造器,则编译出错
  • super和this的区别
    day12_java面向对象(中)学习笔记2 - 图2

三、子类对象实例化的全过程

  • 从结果上来看:(继承性)

    • 子类继承父类以后,就获取了父类中声明的属性或方法。创建子类的对象,在堆空间中,就会加载所有父类中声明的属性。
  • 从过程上来看:

    • 当我们通过子类的构造器创建子类对象时,我们一定会直接或间接的调用其父类的构造器,进而调用父类的父类的构造器直到调用java.lang.Object类中空参的构造器为止。正因为加载过所有的父类的结构,所以在可以看到内存中有父类的结构,子类对象才可以考虑进行调用。
  • 明确:虽然创建子类对象时调用了父类的构造器,但是自始至终就创建过一个对象,即为new的子类对象。

四、面向对象特征之三:多态性

1、理解多态性

  • 可以理解为一个事物的多种形态

2、何为多态性

  1. java中的体现:对象的多态性:父类的引用指向子类的对象(或者子类的对象赋给父类的引用)。

3、Java引用变量有两个类型:编译时类型和运行时类型。编译时类型由声明 该变量时使用的类型决定,运行时类型由实际赋给该变量的对象决定。简 称:编译时,看左边;运行时,看右边。

若编译时类型和运行时类型不一致,就出现了对象的多态性(Polymorphism)

多态情况下, “看左边” :看的是父类的引用(父类中不具备子类特有的方法) “看右边” :看的是子类的对象(实际运行的是子类重写父类的方法

4、多态的使用:虚拟方法调用

  1. 虚拟方法调用:当我们通过变量去调用子父类中同名同参数的方法时,编译的时候认为调用的是父类的方法,但是当解释运行的时候实际调用的是子类重写的方法。

有了对象的多态性以后,我们在编译期,只能调用父类声明的方法,但在运行期,我们实际执行的是子类重写父类的方法。

  1. 总结:编译看左边,运行看右边

5、多态性的使用前提

  • 类的继承关系
  • 方法的重写

6、多态性的举例

7、对象的多态性只适用于方法,不适用于属性(编译和运行都看左边)

8、面试题:多态是编译时行为还是运行时行为?运行时行为