重学Java(一):什么是对象

本系列文章内容来自于《Thinking in Java》作者的最新续作《On Java》基础卷,作者根据最新 Java 8、11、17的内容,重讲了Java的编程思想,值得初学者阅读。

引子

编程语言是用于创建应用程序的思维模式。而面向对象编程(OOP)是使用计算机作为表达媒介的一种尝试。

抽象

所有编程语言都是一种抽象。汇编语言对计算机底层进行了抽象,一些命令式的编程语言对汇编语言进行了抽象,这些抽象的方式主要是根据计算机的结构来决定的,而不是实际解决问题的方式

在这种情况下,程序员必须必须在机器模型(实际解决问题的方式,如计算机)和问题模型(问题实际存在的地方,比如某个业务逻辑)建立关联。

而面向对象编程通过其向程序员提供的展示问题模型的通用工具,使程序员可以不再局限于特定的问题。问题模型中的元素以及其解决方案中的具体呈现,就是对象

面向对象编程的语言,有以下几个基本特征

  • 万物皆对象。
  • 一段程序实际上就是多个对象通过发消息来通知彼此干什么。
  • 从内存角度而言,每一个对象都是由其他更为基础的对象组成的。
  • 每一个对象都有类型
  • 同一类型的对象可以接受相同的消息

接口

创建抽象数据类型(即)是面向对象编程的基本概念。描述了一系列具有相同特征(数据元素)和行为(功能方法)的对象,是一种数据类型。

抽象数据类型和内置数据类型不同的是,可以通过一个新定义的类来解决问题,而不局限于内置数据类型。

一旦创建了类之后,就可以用它创建多个对象。对象发挥作用,是它的接口决定的。而它所属的则定义了这些接口。

1
2
Light lt = new Light();
lt.on();

以上代码加上隐藏的数据,是对类 Light 中方法on()实现

对象提供服务

从要解决的问题开始,可以拆分其为一系列的对象,然后将其简化为对象提供的服务,来简化问题。

让对象提供服务,还能提升对象的聚合程度,体现高内聚性

隐藏实现

类创建者在创建新类时,只暴露必要的接口给其使用者,同时隐藏其他不必要的信息。隐藏代码的具体实现可以有效减少程序错误。

设置访问控制的首要原因,一是防止使用者接触到他们本不该触碰到的内容,二是让库的设计者在改变类内部的工作机制时,不用担心其是否会影响到使用者

Java 提供了3个显式关键字来控制这种访问控制,这种关键字叫访问修饰符。这三个关键字分别是privatepublicprotected

  • private 可以修饰成员,不能修饰类。private 表示定义的内容只能被该类的创建者通过该类自身的方法使用。
  • protected 可以修饰成员,不能修饰类。protected 表示定义的内容可被继承的子类所访问。
  • public 可以修饰成员,也可以修饰类。public表示定义的内容可以被任何类使用。在同一个文件中,最多只能有一个类被声明为public,且其类名需和文件名保持一致

除此之外,如果不使用以上任何修饰符,Java 还会提供一种默认(default)的访问权限。这种情况下,同一包下的其他类可以访问此类或此类的某个成员。

复用实现

代码复用是我们使用面向对象编程的理由之一。复用最简单的方法是直接用这个类所生产的对象,也可以把这个对象放到一个新类里。

利用已有的类组合成一个新类,这叫做组合(composition)。如果组合是动态的,叫做聚合(aggregation)。组合通常代表一种“有”(has-a)的关系。

继承

当创建一个类时,如果存在已有的一个类,在功能上与要创建的新类功能较为相近的话,可以使用继承

如果最初的类(基类)发生了变化,新生成的“复制”的类(子类)也会发生变化。基类拥有的所有特征和行为都与子类共享。

继承可以为子类添加新的方法,但这不是必须的。还有一种方法能让子类产生差异化,即修改基类已有方法的行为,称为重写

未完待续