Object-Oriented Programming(OOP)
面向对象的三大特性:封装性,继承性,多态性。
封装:
模块化:将属性和行为都封装在类中,程序定义很多类。
信息屏蔽:将类的细节部分隐藏起来,用户只通过受保护的接口访问某个类。
如:
private:只有当前类可见
protected:对子类和同一个包内也可见
public:任何地方都可见
继承:
父类和子类之间共享数据和方法,优点是更好地进行抽象与分类,增强代码的重用率,提高可维护性。
如:
Overriding(重写/覆盖):子类重新实现父类中的方法。根据调用时的对象类型决定被调用方法的版本。
一般默认父类中的方法都是可以被重写的,若由关键字final声明,则不可被重写。
子类可以通过关键字super调用父类中被重写的方法。
调用父类的构造方法时,必须在子类构造方法的第一行。
final关键字:
final变量:初始化之后不能再次赋值。
final方法:不可以被重写。
final类:不可以被继承。
多态:
为不同类型的实体提供一个接口,或者使用同一个独好来表示多个不同的类型。因此不同的对象收到同一个消息(调用方法)可产生完全不同的效果,实现的细节由接受对象自行决定。
三种多态:
Ad hoc polymorphism:一个函数可以有多个同名的实现(方法重载);如:
Overloading(重载):在一个类中存在多个同名函数,必须具有不同的参数列表,返回值类型可同可不同。
重载是静态的多态,通过参数列表决定依赖哪个实现。对某个方法的重载可以在一个类中进行,也可以在子类中进行。
子类重载了父类的方法后,子类仍然继承了被重载的方法。
Parametric polymorphism:一个类型名字可以代表多个类型(泛型编程);
参数多态性是指方法针对多种类型时具有同样的行为,此时可使用统一的类型表达多种类型。在运行时根据具体类型确定。
泛型编程是一种编程风格,其中数据类型和函数是根据待指定的类型编写的,随后再需要时根据参数提供的特定类型进行实例化。
类/接口中如果声明了一个或多个泛型变量,则称为泛型类/接口。如:
普通类中的泛型方法:
泛型类中的泛型方法:
静态方法不能使用所在泛型类定义的泛型变量,如果要使用的话,必须将静态方法也定义成泛型方法。
泛型类/接口,再实例化类的时候指明泛型的具体类型(类型擦除),泛型方法,在调用方法的时候指明泛型的具体类型。
subtype/inclusion polymorphism:一个变量名字可以代表多个类的实例(子类型)。Class A implements I
一个类型代表了一组值,子类型是超类型的子集。子类型的规格至少和超类型一样强,接口中的所有方法都要在实现类中实现。
对象:
现实世界中,对象是客观世界中的一个实体;计算机世界中,对象是一个可标识的存储区域。
类(Class)
类是具有共同属性(字段 field)和行为(方法 method)的对象集合;类是对象的抽象,对象是类的实例。
类变量和类方法与一个类关联,每个类发生一次(static)。使用它们不需要创建对象。实例方法和实例变量在类的每个实例中出现一次。
接口(Interface)
一个接口可以扩展其他接口,一个类可以实现多个接口。
接口不能有构造方法,所以创建对象时需要调用某个具体实现的构造方法。
(从Java 8后,接口被允许包后静态方法)
抽象类(Abstract Class)
抽象类中的方法只有定义没有实现,抽象类不能实例化,继承某个抽象类的子类在实例化时,所有父类中的抽象方法必须已经实现。
安全性:采用防御性复制,返回或传入一个新的对象(复制内容),避免在输入参数和返回值中出现泄漏问题
不可变类,不提供matutors,让所有的方法不可被重写,在变量定义时使用private 和final 关键字。如:
可变类,通常存在一个具备复制功能的构造方法。