java编程思想-第1章 对象导理论

目录:

java编程思想-第1章 对象导理论

java编程思想-第2章 一切都是对象

第1章 对象导论

1.1 抽象过程

       OOP的程序设计方式: 

  • 万物皆为对象。对象就是特殊的变量,它可以存储数据,还可以在它自身上执行。
  • 程序是对象的集合,它们通过发送消息来告知彼此所要做的。就是要把消息想象为对某个特定对象的调用请求。
  • 每个对象都有自己的由其他对象所构成的存储。就是创建包含现有对象的新对象。
  • 每个对象都拥有其类型。既每个对象都是某个类的一个实例。类就是类型。而每个类和其它类的区别是:可以发送什么消息给它。这边要明白一个概念,既类其实也是一种接口,每个对象是类这种接口的具体实现。
  • 某一特定类型的所有对象都可以接收同样的信息。既子类可以接收父类的消息,也就是多态,这是OOP最强大的地方。

       对象的简洁描述:对象具有状态、行为和标识。也就是说对象在内存中都有一个唯一的地址。

1.2 每个对象都有一个接口

       对象之间传递消息时,消息的接收是通过接口来传递的,接口对应着对象内部的一个方法,接口暴露给外部对象,内部方法决定消息的执行方式。

1.3 每个对象都提供服务

       我们需要将对象看成服务提供者,这个非常重要,我们需要把这个对象应该能提供的哪些服务都封装进来,也就是实现高内聚。但又需要遵循接口隔离原则,不能将这个类不应该具有的功能都一股脑放到一个类中,会导致高耦合

1.4 被隐藏的具体实现

       访问控制是为了设定一个边界,设定哪些是客户端程序员能够访问的,可以防止客户端程序员随意篡改我们的程序。我们只提供public的接口给客户端程序员,他们只需知道参数和返回值调用即可,这样我们修改了内部实现也不会影响客户端程序。

       在java中public是对任何人都可访问,private是只有类创建者和类内部方法才能访问,protected比private多个子类可以访问。但子类不能访问private。还有默认的包访问权限,在我们不写访问指定词时它发挥作用。

1.5 复用具体实现

       有些时候一个类并不能完全的被复用到另外一种场景,这时我们需要创建一个新的类,并引入之前的类的对象,引入的对象我们声明为private级别的成员对象。

       一个新建的类可以有很多个其它类型的对象,这种方式我们称为组合。它可以有效的实现我们想要的方式的组合,组合是“has-a”的关系,表明某某类有a对象的属性。同时,由于组合类的成员变量通常都被修饰为private,所以客户端程序员并不能访问他们,同时也方便了类创建者在不影响程序功能的前提下修改这些成员变量。

1.6 继承

       当我们创建一个类时,如果另一个新类与这个类功能相似,我们仍然需要创建这个新类。解决这个问题的办法就是继承。继承虽然也是一个新类,但是这个类是由基类(俗称父类)衍生的导出类(俗称子类)。子类拥有父类所有非private的对象、属性、接口,此外可以根据不同的需要增加不同的功能。父类可以有很多个子类,它包含了子类的所有公共部分。如“几何形”是父类,每一个几何形都具有尺寸、颜色、位置等,同时每一个几何形都可以被绘制、擦除和移动。在此基础上可以导出它的子类“三角形”、“平行四边形”等,他们拥有父类的属性、方法之外还有自己独特的属性,例如有的形状可以被翻转等。

       子类不光继承了父类的属性,同时也继承了父类的方法,也就是说所有发给父类的消息,都可以发给子类。子类对接口的实现方法可以不改变,即访问子类的接口实际是与访问父类相同,当然也可以自己“覆盖”父类接口的方法,也就是说我和父类使用相同的接口,但是我们做不同的事情。同时如前边所说,子类也可以自己新增方法来满足自己的需求。前者不改变或者覆盖接口的方法,这种我们称作是“is-a”的关系,因为子类与父类本质的类型没有发生变化。而后边这种我们称作是“is-like-a”,因为在子类中增加了新的方法,所以这种相同的关系并不完全。

1.7 伴随多态的可互换对象

       面向对象程序设计语言使用了后期绑定的概念(也叫动态绑定)。当向对象发送消息时,被调用的代码直到运行时才能确定。编译器确保被调用方法的存在,并对调用参数和返回值执行类型检查(Java是强类型的语言,无法提供此类保证的语言被称为是弱类型的),但是并不知道将被执行的确切代码。

       在某些语言中,必须明确地声明希望某个方法具备后期绑定属性所带来的灵活性(C++使用virtual关键字来实现的)。这些语言中,方法在默认情况下不是动态绑定的。而在Java中,动态绑定是默认行为,不需要添加额外的关键字来实现多态。

       把将导出类看做是它的基类的过程称为向上转型(upcasting)。

1.8 单根继承结构

       在java中(事实上还包括除C++以外的所有OOP语言),所有的类最终都继承自单一的基类,这个终极基类的名字就是Object

       单根继承结构带了的好处:

  • 在单根继承结构中的所有对象都具有一个共用接口,所以它们归根到底都是相同发基本类型。
  • 单根继承结构保证所有对象都具备某些功能。
  • 单根继承结构使垃圾回收器的实现变得容易的多,而垃圾回收器正是Java相对C++的重要改进之一。由于所有对象都保证具有其类型信息,因此不会因无法确定对象的类型而陷入僵局。这对于系统级操作(如异常处理)显得尤其重要,并且给编程带来了更大的灵活性。

1.9 容器

有时候我们并不知道处理一个问题需要多少个对象,或者他们需要存活多久,那么我们就不知道该怎么样存储这些对象。Java语言中创建了一种对象类型,叫做容器(也叫集合)。这种新的对象类型内部有对其他对象的引用,当你需要的时候你可以很容易的扩充容器的空间来容纳对象。
       Java中提供的容器类型:

  • List:用于存储序列
  • Map:也被称为关联数组,用来建立对象之间的关联
  • Set:每种对象类型只持有一个

       选择容器的原因:

  • 第一,不同容器提供了不同类型的接口和外部行为。
  • 第二,不同容器对于某些操作具有不同的效率。

       ArrayList和LinkedList的相同点:它们都具有相同的接口和外部行为的简单序列

      ArrayList和LinkedList的不同点

  • 在ArrayList中,随机访问元素是一个花费固定时间的操作;但是,对LinkedList来说,随机选取元素需要在列表中移动,这种代价是高昂的,访问越靠近表尾的元素,花费的时间越长
  • 如果想在序列中间插入一个元素,LinkedList的开销却比ArrayList要小

       因为容器中存储了其他对象的引用,所以根据单根继承结构,容器中的对象类型都是Obejct类型,这样很方便其他对象类型进行转型。但是从Object类型转到其它特定类型(称作向下转型)很容易发生错误,所以Java SE5之后引入了泛型的概念,参数传递使用一对<>,<>内部可以传递任意类型的对象,这便解决了向下转型带来的安全隐患。

1.10 对象的创建和生命周期

       对象的创建主要有两种:

  • 一种是在编程时由程序员控制,将对象置于栈中或者是静态区域,这种的好处是知道对象的大小、生命周期。同时也限制了对象的灵活性。
  • 另一种是通过new在内存堆中动态的创建对象,这种方式的好处是灵活,需要的时候直接在内存中创建即可,实现了存储空间的动态管理。Java中完全采用了动态内存的分配方式。

     对于允许在堆栈上创建对象的语言,编译器可以确定对象的生命周期,并可以自动销毁它。然而,在堆上创建对象,编译器不会知道它的生命周期。在像C++这样的语言中,必须通过编程方式来确定何时销毁对象,这可能会因为不能正确处理而导致内存泄漏。

       Java提供的垃圾回收器机制,可以自动发现不再被使用的对象,并自动释放其占用的内存。

1.11 异常处理:处理错误

       Java内置了异常处理机制,相当于一条与正确执行并行的路线,当程序发生异常时会执行异常的代码。同时,允许程序在异常中进行处理并返回到正确的结果中去。

1.12 并发编程

       Java与其他语言一样,提供多线程的并发编程方式,提高程序运行效率。

猜你喜欢

转载自blog.csdn.net/qq_35766758/article/details/81878953