OOP 笔记

面向对象编程(OOP)的概念

面向对象编程技术的关键性观念是它将数据及对数据的操作行为放在一起,作为一个相互依存、不可分割的整体——对象。对于相同类型的对象进行分类、抽象后,得出共同的特征而形成了类。面向对象编程就是定义这些类。类是描述相同类型的对象集合。类定义好之后将作为数据类型用于创建类的对象。程序的执行表现为一组对象之间的交互通信。对象之间通过公共接口进行通信,从而完成系统功能。类中声明的public成员组成了对象的对外公共接口。简单来说就是以功能为解决问题的中心。

对象的产生的方式。

原型(prototype)对象

以原型对象为基础产生新的对象。原型的概念已经在认知心理学中被用来解释概念学习的递增特性,原型模型本身就是企图通过提供一个有代表性的对象为基础来产生各种新的对象,并由此继续产生更符合实际应用的对象。而原型-委托也是OOP中的对象抽象,代码共享机制中的一种。

类(class)对象

以类为基础产生新对象。一个类提供了一个或者多个对象的通用性描述。从形式化的观点看,类与类型有关,因此一个类相当于是从该类中产生的实例的集合。而这样的观点也会带来一些矛盾,比较典型的就是在继承体系下,子集(子类)对象和父集(父类)对象之间的行为相融性可能很难达到,这也就是OOP中常被引用的—子类型(subtype)不等于子类(subclass)。

有元类(metaclass)的新对象模型

在一种所有皆对象的世界观背景下,在类模型基础上还诞生出了一种拥有元类(metaclass)的新对象模型。即类本身也是一种其他类的对象。

以上三种根本不同的观点各自定义了三种基于类(class-based),基于原型(prototype-based)和基于元类(metaclass-based)的对象模型。而这三种对象模型也就导致了许多不同的程序设计语言。像C++、Java都是使用基于类的对象模型。

OOP的基本思想

oop强调在程序构造中语言要素的语法。使用继承,使用类,使用对象,对象传递消息。不关心你继承或是不继承,它的开端是分析产品的分类,有些什么种类,他们的行为如何。就是说,两件东西相等意味着什么?怎样正确地定义相等操作?不单单是相等操作那么简单,你往深处分析就会发现“相等”这个一般观念意味着两个对象部分,或者至少基本部分是相等的,据此我们就可以有一个通用的相等操作。

OOP 特性

三大特性分别是封装,继承,多态。

封装

概念:把对象的属性和方法结合成一个独立的整体,隐藏实现细节,并提供对外访问的接口。
作用:
1. 隐藏实现细节。好比你买了台电视机,你只需要怎么使用,并不用了解其实现原理。
2. 安全性。比如你在程序中私有化某属性,并提供了对外的get和set方法,当外界使用set方法为属性设值的时候,可以在set方法里限制赋值。
3. 增加代码的复用性。好比在工具类中封装的各种方法,你可以在任意地方重复调用,而不用再每处都去实现其细节。
4. 模块化。封装分为属性封装,方法封装,类封装,插件封装,模块封装,系统封装等等。有利于程序的协助分工,互不干扰,方便了模块之间的相互组合与分解,也有利于代码的调试和维护。

继承

概念:从已知的一个类中派生出新的一个类,叫子类。子类实现了父类所有非私有化属性和方法,并能根据自己的实际需求扩展出新的行为。
作用:
1. 继承是传递的,容易在其基础上构造,建立和扩充出新的类。
2. 简化了人们对事物的认识和描述,能清晰体现相关类之间的层次结构关系。
3. 能减少数据和代码的冗余度。
4. 大大增加了代码的维护性。

多态

概念:多个不同的对象对同一消息作出响应,同一消息根据不同的对象而采用各种不同的行为方法。
作用:主要是利于扩展。
例子:

public class MyGarage {  
    public static void main(String[] args){       
        Benz benz = new Benz("奔驰");  
        VW vw = new VW("大众");  
        BMW bmw = new BMW("宝马");  
        People p = new People();  
        p.drive(benz);
        p.drive(vw);  
        p.drive(bmw);  
    }  
}  

class People {  
    public String name;  
    public Car car;  

    public void drive(Car car){  
        this.car = car;  
        car.run();  
    }  

}  

class Car{  
    public String name;  

    public Car(String name){  
        this.name = name;  
    }  

    public void run(){  
        System.out.println(name + "已放入车库");  
    }  
}  
class VW extends Car{  
   public VW(String name){  
        super(name);  
    }  
}  

class Benz extends Car{  
    public Benz(String name){  
        super(name);  
    }  
}  

class BMW extends Car{  
    public BMW(String name){  
        super(name);  
    }       
}

多态体现在以下几个方面:
1. 继承的存在(继承是多态的基础,没有继承就没有多态).
2. 子类重写父类的方法(多态下调用子类重写的方法).
3. 父类引用变量指向子类对象(子类到父类的类型转换).

所以在以上例子中,主要体现了1和3。

多态的实现方式在此列举以下:
方式一:重写(Override)与重载(Overload)
方式二:接口(Interface)
方式三:抽象类和抽象方法。

待续……

发表评论

电子邮件地址不会被公开。 必填项已用*标注