《Java编程思想》笔记——面向对象和类

1、面向对象程序设计简介

面向对象是一种程序设计方法,或者是程序设计规范,其基本思想是使用对象、类、继承、封装、多态等基本概念来进行程序设计。 面向对象是一种符合人们思考习惯的思想,可以将复杂的事情简单化,将程序员从执行者转换成了指挥者。
面向对象的特征:
• 封装(encapsulation)
• 继承(inheritance)
• 多态(polymorphism)

2.java单继承的优点:

相比于C++的多继承,java只支持类的单继承,java中的所有类的共同基类是Object类,Object类java类树的唯一根节点,这种单继承有以下好处:

  1. 单继承可以确保所有的对象拥有某种共同的特性,这样对于JVM虚拟机对所有的类进行系统级的操作将提供方便,所有的java对象可以方便地在内存堆栈中创建,传递参数也变的更加方便简单。
  2. java的单继承使得实现垃圾回收器功能更加容易,因为可以确保JVM知道所有对象的类型信息。

3.多态:

在面向对象编程中,子类中拥有和父类相同方法签名的方法称为子类方法覆盖父类方法,当调用子类方法的某个操作时,不必明确知道子类的具体类型,只需要将子类类型看作是父类的引用调用其操作方法,在运行时,JVM会根据引用对象的具体子类类型而调用应该的方法,这就是多态。
多态不但能够改善代码的组织结构和可读性,还能够创建可拓展性的程序。

多态的基础是java面向对象编程的晚绑定机制。编程中有如下两种绑定机制:

  1. 前期绑定:一般在非面向对象编程语言中使用,在程序编译时即计算出具体调用方法体的内存地址。
  2. 动态绑定/运行时绑定:面向对象编程语言中经常使用,在程序编译时无法计算出具体调用方法体的内存地址,只进行方法参数类型和返回值类型的校验,在运行时才能确定具体要调用方法体的内存地址。Java中除了static和final方法之外,其他所有方法都是后期绑定。

4.类型转换:

Java中有两种常见的类型转换:向上类型转换(upcast)和向下类型转换(downcast):

  1. 向上类型转换(upcast):
    向上类型转换是将子类对象强制类型转换为父类类型,经典用法是面向对象的多态特性。向上类型转换时,子类对象的特性将不可见,只有子类从父类继承的特性仍然保持可见,向上类型转换时编译器会自动检查是否类型兼容,通常是安全的。
  2. 向下类型转换:
    向下类型转换是将父类类型强制转换为子类类型,转换过后父类中不可见的子类特性又恢复可见性,向下类型转换时,编译器无法自动检测是否类型兼容,往往会产生类型转换错误的运行时异常,通常不安全。

向上转型时,任何字段访问操作都是由编译器解析,因此不是多态的。

5.方法重载(overloading)

方法同名,参数列表不同称为方法重载,注意方法的返回值类型不同不能作为方法重载。

6.在组合 与 继承 之间选择

  1. is-a继承:一个类继承具有相似功能的另一个类,根据需要在所继承的类基础上进行扩展。
    优点:具有共同属性和方法的类可以将共享信息抽象到父类中,增强代码复用性,同时也是多态的基础。
    缺点:子类中扩展的部分对父类不可见,另外如果共性比较少的时候使用继承会增加冗余代码;

  2. has-a组合:has-a组合是在一个类中引用另一个类作为其成员变量。
    优点:可扩展性和灵活性高。在对象组合关系中应优先考虑has-a组合关系。
    缺点:具有共性的类之间看不到派生关系。

组合技术通常用于想在新类中使用现有类的功能而非它的接口。

7.java即时编译技术(JIT):

Java的JIT是just-in-time complier技术,JIT技术是java代码部分地或全部转换成本地机器码程序,不再需要JVM解释,执行速度更快。
当一个”.class”的类文件被找到时,类文件的字节码被调入内存中,这时JIT编译器编译字节码代码。
JIT有两个不足:

  1. JIT编译转换需要花费一些时间,这些时间贯穿于程序的整个生命周期。
  2. JIT增加了可执行代码的size,相比于压缩的字节码,JIT代码扩展了代码的size,这有可能引起内存分页,进而降低程序执行速度。

对JIT不足的一种改进技术是延迟评估(lazy evaluation):其基本原理是字节码并不立即进行JIT编译除非必要,在最近的JDK中采用了一种类似延迟JIT的HotSpot方法对每次执行的代码进行优化,代码执行次数越多,速度越快。

8.final关键字

  1. 一个既是static又是final的字段只占据一段不能改变的存储空间。对对象的引用运用final时,该引用无法再指向另一个对象,然而对象本身是可以被修改的。
  2. 定义为final的字段必须在字段的定义处或者构造方法中进行赋值,从而使得final字段在使用前总是被初始化。
  3. 类中所有的private方法都隐式地指定为是final的,以防止任何继承类修改它的含义。
  4. final类禁止继承,所以final类中所有的方法都隐式指定是final的。
  5. 在构造器内唯一能够安全调用的那些方法是基类中的final方法,非final方法可能会使用还未初始化的字段,而出现异常。

9.抽象类

  • 包含抽象方法的类叫做抽象类,但抽象类不一定含有抽象方法。继承于抽象类的类必须实现抽象基类中的抽象方法,否则该类也必须定义为抽象类。
  • 抽象类不能实例化任何对象。

10.接口

  • 可以继承任意多个接口,并可以向上转型为每个接口,因为每一个接口都是一个独立的类型。
  • 接口彼此之间可以嵌套。
  • 嵌套在另一个接口中的接口自动就是public的,而不能声明为private的。
  • 当实现某个接口时,并不需要实现嵌套在其内的任何接口。

11.内部类

  • 内部类可以把一些逻辑相关的类组织在一起,并控制位于内部的类的可视性。
  • 内部类还拥有其外围类的所有元素的访问权。构建内部类对象时,需要一个指向其外围类对象的引用,在拥有外部类对象之前是不可能创建内部类对象的。
  • 在方法和作用域内可以定义内部类,此使用方式把类名去掉就是匿名内部类;由于此种内部类在方法或作用域外不可见,通常向上转型对此类的对象进行引用。
  • 匿名内部类不可能有命名的构造器;匿名内部类既可以拓展类,也可以实现接口,但是不能两者兼备,而且如果是实现接口,也只能实现一个接口。
  • 因为内部类的构造器必须连接到指向其外围类对象的引用,所以在继承内部类的时候,不能使用默认的构造器,而需要传递一个指向外围类对象的引用,并且必须在构造器内调用outer.super();

12.嵌套类

  • 将内部类声明为static,就称为嵌套类。嵌套类不需要外围类的对象,因此不能从嵌套类的对象中访问非静态的外围类对象。
  • 普通内部类的字段和方法,只能放在类的外部层次上,所以普通的内部类不能有static数据和static字段,也不能包含嵌套类。
  • 接口内部的类自动就是嵌套类,因为接口内的任何字段方法类都自动地是public和static的;放置在接口内部的类,甚至可以实现其外围接口。

持续完善补充!

你可能感兴趣的:(《Java编程思想》笔记——面向对象和类)