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修饰的静态常量;