LOADING

加载过慢请开启缓存 浏览器默认开启

面向对象的程序设计(Java)

面向对象的三大特性

  • 封装、继承、多态
    • 封装:对抽象的事物抽象成一个对象,并对其对象的属性私有化,同时能提供一些能被外部访问属性的方法。
      • 对象:属性+方法;
        • 成员变量:生存期是对象的生存期,作用域在类的内部;
          • 访问属性:private vs. public vs. friendly
            • private:针对类而不是针对对象的,即同一个类的不同对象的私有属性之间可以相互访问;
            • friendly:既没有public也没有private修饰,可以在同一个package内进行访问;
            • public:一个编译单元(.java文件)只能有一个public类,并且名称要求相同;
            • protected:自己、同一个package内、子类可访问;
        • 本地变量:生存期和作用域都是函数内部;
        • 对象初始化:
          • 构造函数(无返回类型,接收无参和有参两种构造方式,即多个同名但参数表不同的函数构成了函数重载);
          • 初始化顺序:定义初始化\(\rightarrow\)构造器;如果继承了父类,先进行父类初始化,并需要确保父类的属性得到了正确的初始化;
    • 继承:子类扩展新的数据域或功能,并复用父类的属性与功能,单继承,多实现;
      • Cpp和Java的一个重要区别是,Cpp支持多继承,并且有指针的概念;Java是单继承,但可以用接口来实现多继承;
    • 多态:
      • 多态变量:对象变量能对应多种类型,具体可分为静态类型和动态类型;
      • 造型Cast:
        • 造型并不是类型转换;
        • 向上造型Upcasting:子类对象可以当作父类对象来使用,即子类对象可以用父类对象来赋值;
      • 函数调用的绑定:通过对象类型去调用函数时,调用哪个函数称为绑定;
        • 静态绑定:根据变量的声明类型决定;在编译期间确定,被称为静态分派,比如函数的重载;
        • 动态绑定:根据变量的动态类型决定;在程序运行时确定,被称为动态分派,比如方法的重写(同名同参数表的子类方法会覆盖(override)父类方法);
      • 多态的底层实现是动态绑定,实际就是方法调用动态分派的过程。如果子类方法覆盖了父类方法,在多态调用时,会先确定实际类型为子类,然后先搜索子类中的该方法。

static vs. final

  • Static:
    • static修饰属性:类变量,所有对象共享一份,随着类的加载而加载(只加载一次),先于对象的创建;可以使用类名直接调用;
    • static修饰方法:类函数,随着类的加载而加载;可以使用类名直接调用;静态方法中,只能调用静态的成员,不可用 this;
  • final:
    • final修饰变量:
      • 如果修饰基本数据类型,那相当于常量,不能改变值;
      • 如果修饰引用数据类型的变量(即对象的引用),那么不能改变对象的引用(即存储地址),即初始化后不能再让其指向一个新的对象;
    • final修饰方法:相当于禁用了重写,继承类不能修改该方法的含义;
    • final修饰类:
      • 该类不能被继承;
      • final类中的所有成员⽅法都会被隐式地指定为final⽅法;
      • 该类的成员变量不受影响;
      • 该类可以有内部类;
      • 当然,也可以通过私有化构造方法来禁止该类被继承(单例模式);

抽象类 vs. 接口Interface

  • 抽象类:包含抽象方法的类,即使用abstract修饰的类;有抽象函数的类一定是抽象类;
    • 抽象类不能用于实例化对象;
    • 抽象类只能被继承;
  • 接口:接口是一个抽象类型,是抽象方法的集合;
    • 接口支持多继承;
    • 接口中定义的方法,默认是 public abstract 修饰的抽象方法;
  • 相同点:
    • 两者均不能被实例化;
    • 子类/实现类必须重写抽象类/接口中定义的抽象方法;
  • 不同点:
    • 抽象类有构造方法,接口没有构造方法;
    • 抽象类可以包含普通方法,接口中只能是public abstract修饰抽象方法(Java8 之后可以);
    • 抽象类只能单继承,接口可以多继承;
    • 抽象类可以定义各种类型的成员变量,接口中只能是public static final修饰的静态常量;