面向对象

本文围绕以下五个部分展开:

一、面向对象(Object–Oriented)
二、封装(Encapsulation)
三、继承(Inheritance)
四、多态(Polymorphism)
五、方法重载(overload)与方法重写(override)






一、面向对象(Object–Oriented)

        1. 面向对象

        面向对象的基本思想是使用类、对象、继承、封装、消息等基本概念来进行程序设计。

        它从现实世界中客观存在的事物(即对象)出发来构造软件系统,并在系统构造中尽可能运用人类的自然思维方式,强调直接以现实世界中的事物(即对象)为中心来思考、认识问题,并根据这些事物的本质特点,把它们抽象地表示为系统中的类,作为系统的基本构成单元。这使得软件系统的组件可以直接映像到客观世界,并保持客观世界中事物及其相互关系的本来面貌。

        2. 类(class)

        类是具有共同属性、共同方法的一类事物。类的对一类事物的描述,是抽象的、概念上的定义。

        类是整个软件系统最小的程序单元。

        类定义 = Field(属性、字段) + Method(方法、行为) + 构造器。

        (1)属性:一类事物的内部状态数据。(程序只要记录业务关心的状态数据即可,没必要记录该事物的所有状态数据)

        (2)方法:操作这些状态数据的方法,以及为这类事物的行为特征提供相应的实现。

        (3)构造器:用于构造该类的实例。Java通过new关键字来调用构造器,从而返回该类的实例。
        构造器是一个类创建对象的根本途径,如果一个类没有构造器,这个类通常无法创建实例。因此:如果程序员没有为一个类编写构造器,则系统会为该类提供一个默认的无参构造器;一旦程序员为一个类提供了构造器,系统将不再为该类提供构造器。

        以上三种成员都可以定义0个或者多个。

        3. 对象(object)

        对象是面向对象方法中最基本的概念,是面向对象程序设计的中心。

        对象直接映像成客观世界的各种事物。

        对象的基本特点:标识唯一性、分类性、多态性、封装性、模块独立性好。

        Java里的对象具有唯一性,每个对象都有一个标识来饮用它,如果某个对象失去了标识,这个对象将变成垃圾,只能等着系统垃圾回收机制来回收它。

        Java语言不允许直接访问对象,而是通过对对象的引用来操作对象。

        4. 类和对象的关系

        类可以生成多个对象。

        类是对象的抽象,对象是类的实例(instance)。

        5. 抽象

        抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面。

        抽象并不打算了解全部问题,而只是考虑部分问题。例如,需要考察Person对象时,我们不可能在程序中把Person的所有细节都定义出来,通常只能定义Person的部分数据、部分行为特征——而这些数据和行为特征是软件系统所关心的部分。

        虽然抽象是面向对象的重要部分,但它不是面向对象的特征之一。因为所有的编程语言都需要抽象。

        6. 消息

        对象间的相互合作需要一个机制协助进行,这样的机制称为“消息”。

        消息是一个实例与另一个实例之间相互通信的机制。

        7. 三个基本特征

        (1)封装:Encapsulation

        (2)继承:Inheritance

        (3)多态:Polymorphism

        8. 为什么Java是面向对象的语言?

        判断一门语言是否是面向对象的,通常可以使用继承和多态来加以判断。

        Java完全支持面向对象的三种基本特征:继承、封装和多态。

        Java完全以对象为中心,Java程序的最小程序单位是类,整个Java程序是由一个一个的类组成。

        Java完全支持使用对象、类、继承、封装、消息等基本概念来进行程序设计,允许从现实世界中客观存在的事物(即对象)出发来构造软件系统,在系统构造中尽可能运用人类的自然思维方式。


二、封装(Encapsulation)

        1. 概念

        它指的是:将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

        因此需要从以下两方面考虑:

        (1)将对象的属性和实现细节隐藏起来,不允许外部直接访问。

        (2)把方法暴露出来,让方法来控制对这些属性进行安全的访问和操作。

        因此,封装实际上有两方面的含义:把该隐藏的隐藏起来,把该暴露的暴露出来。

        2. 对一个类或对象实现良好的封装,可以实现以下目的:

        (1)隐藏类的实现细节。

        (2)让使用者只能通过事先预定的方式来访问数据,从而可以在该方法里加入控制逻辑,限制对属性的不合理访问。

        (3)可进行数据检查,从而有利于保证对象信息的完整性。

        (4)便于修改,提高代码的可维护性。

        3. 访问控制符

        封装通过访问控制符来实现。

        Java提供3个访问控制符:private、protected和public,分别代表了3个访问控制级别。另外还有一个不加任何访问控制符的访问控制级别,因此共有4个访问控制级别。

面向对象_第1张图片



三、继承(Inheritance)


        1. 概念

        (1)它是面向对象实现软件复用的重要手段。当子类继承父类后,子类作为一种特殊的父类,将直接获得父类的属性和方法。

        (2)继承的类:子类。被继承的类:父类/基类/超类。

        (3)Java的继承通过extends关键字实现。

        (4)Java是单继承:只能有一个直接父类。但是,可以有无限多个间接父类。

        (5)java.lang.Object类是所有类的父类,要么是直接父类,要么是间接父类。因此所有的对象都可以调用该类所定义的实例方法。


四、多态(Polymorphism)

        1. 概念

        它指的是子类对象可以直接赋给父类变量,但运行时依然表现出子类的行为特征。这意味着,同一个类型的对象在执行同一个方法时,可能表现出多种行为特征。

        2. 向上转型(upcasting)

        因为子类其实是一种特殊的父类,因此Java允许把一个子类对象直接赋给一个父类引用变量,无须任何类型转换。这被称为“向上转型”,它由系统自动完成。

        3. 编译时类型与运行时类型

        (1)Java引用变量有两个类型:编译时类型和运行时类型。

        编译时类型由声明该变量时使用的类型决定;运行时类型由实际赋给该变量的对象决定。

        如果编译时类型和运行时类型不一致,就可能出现所谓的多态。

        (2)引用变量只能调用声明该变量时所用类里包含的方法。

        比如:通过 Object p = new Person() 代码定义一个变量p,则这个p只能调用Object类的方法,而不能调用Person类里定义的方法。

        (3)对象的Field不具备多态性。通过引用变量来访问其包含的实例Filed时,系统总是试图访问它编译时类型所定义的Field,而不是它运行时类型所定义的Field。


五、方法重载(overload)与方法重写(override)

        1. 方法重载

        (1)如果同一个类中包含了两个或两个以上方法的方法名相同,但形参列表不同,就被称为方法重载。

        (2)“两同一不同”:同一个类中,方法名相同,参数列表不同。

        至于方法的其他部分,如:方法返回值类型、修饰符等,都与方法重载没有任何关系。

        2. 方法重写

        (1)子类包含与父类同名方法的现象被称为方法重写,也叫方法覆盖(Override)。

        (2)“两同两小一大”:

            “两同”:方法名相同、形参列表相同。

            “两小”:子类方法返回值类型应比父类方法返回值类型更小或相等;子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等。

            “一大”:子类方法的访问权限应比父类方法的访问权限更大或相等。

        (3)覆盖和被覆盖的方法要么都是类方法,要么都是实例方法,不能一个是类方法,一个是实例方法。

        (4)如果父类方法具有private访问权限,则该方法对其子类是隐藏的,因此子类无法访问和重写。如果子类中定义了一个与父类private方法具有相同的方法名和形参列表、返回值类型的方法,则不是重写,而只是在子类中重新定义了一个新的方法。

        3. 二者比较

        (1)把二者放在一起比较没有太大的意义,二者联系很少。

        (2)类似:都发生在方法之间;都要求方法名相同。

        (3)重载主要发生在同一个类的多个同名方法之间;而重写发生在子类和父类的同名方法之间。

        (4)当然,父类方法和子类方法之间也可能发生重载。因为子类会获得父类方法,如果子类定义了一个与父类方法有相同的方法名,但参数列表不同的方法,就会形成父类方法和子类方法的重载。



整理时重点参考:《疯狂Java讲义》(第2版) - 李刚 编著

你可能感兴趣的:(面向对象)