Introduction to Objects

编程语言抽象(abstraction)程度的发展历程


  1. 汇编语言提供对底层机器的抽象
  2. 一些命令式(imperative)的语言(比如FORTRAN,BASIC,C)等提供了对汇编语言的抽象,应用这些语言解决问题程序员必须考虑计算机的结构,必须建立起计算机的结构与问题的结构的关联。
  3. 面向对象语言提供了问题空间中的元素的代表---对象,使得程序员可以直接考虑问题的结构,而不用考虑计算机的结构。

面向对象编程的特点


  1. 把所有的东西都看作对象。
  2. 程序由对象构成,这些对象通过传递消息(message)来交流。
  3. 每个对象有自己的存储空间,这个存储空间由其它的对象构成。
  4. 每个对象有一个类型。
  5. 所有同类型的对象可以接收相同的消息。
  6. 一个对象具有状态,行为和身份。

java的访问控制符

  1. public:所有类可以访问
  2. private:只有自己的类型可以访问
  3. protected:子类可以访问
  4. 默认:同一个包中的类可以访问

聚合(aggregation)和组合(composition)的区别

     二者都表示B是A的一部分,但是组合更强一些,在组合中B只能依靠A而存在,就好比眼睛和人的关系,而聚合中B可以单独存在,如人与部落的关系。

    组合中的B和A具有相同的生命周期,聚合中的B可以在A的生命周期结束之后继续存在。聚合关系中A的构造函数以B作为参数,组合关系中直接在A的构造函数中初始化。如下所示:

聚合:

Class A{
  private B _b;
  public A(B b){
     _b = b;
  }
}
组合:
Class A{
  private B _b;
  public A(){
     _b = new B();
  }
}

    二者的信息封装程度不同,组合的话B完全被隐藏,而聚合的话B不被隐藏。

继承注意的几点

  1. 所有可以发送给父类的消息都可以发送给子类
  2. 一个类的类型是由能够接收的消息来体现的,这意味着子类有和父类一样的类型
  3. 子类可以重写父类的方法,叫override
  4. 替换原则:所有使用父类的地方都可以用它的子类来替换

多态注意的几点

  1. 多态指的是把不同的子类都当作父类来看待,同一个方法根据运行时刻的对象不同可以有不同的运行方式。
  2. java中是通过late binding来实现,在运行时刻计算方法代码的地址并执行,这种动态绑定是java默认的方式,而在c++中必须通过virtual关键字来指明应用late binding。
  3. java语言在编译时不知道方法的具体实现代码,编译器只确保这个方法存在并且调用的参数正确,只有在运行时才能找到具体的实现代码。

Upcasting

    可以将子类当成父类来使用,这种方式叫做Upcasting。比如有个父类是shape,它的子类有line,circle,triangle,shape有draw方法,它的子类重写各自的draw方法,有一个类有个dosomething(Shape)方法,这个方法中调用Shape的draw方法,这样我们可以传line或者circle等子类给dosomething,这就叫做upcasting。当传给dosomething方法不同的子类类型时,dosomething中讲调用不同子类的draw方法,这就是多态的体现。

单继承结构

    java采用单继承结构,所有的类都继承自Object类,叫做单根继承,这样的好处是能够对所有的类执行基本的操作,并且使得实现垃圾回收器更加简单。

对象的存储

    Java使用动态内存分配的方法,所有的非内置对象都在堆(heap)上,垃圾回收器自动回收;但是内置基本类型的变量和对象的引用存放在栈中。

     C++使用三种方法,一种是对于局部变量或函数参数使用栈空间,一种是对于全局变量或静态变量使用静态存储区,一种是对于使用new操作符动态创建的对象使用堆空间。栈空间和静态存储区上的对象的存储细节和生命周期是在编译时就可以确定的,而堆对象的生命周期是必须由程序员控制的。

    在堆上创建对象通常比在栈上创建空间更耗时。






你可能感兴趣的:(java)