java之基础篇-对象和类
什么是对象?
对象是理解面向对象技术的关键。现在环顾四周,您会发现许多真实世界物体的示例:您的狗、您的桌子、您的电视机、您的自行车。
现实世界的对象有两个共同特征:它们都有状态和行为。狗有状态(名称、颜色、品种、饥饿)和行为(吠叫、抓取、摇尾巴)。自行车也有状态(当前档位、当前踏板节奏、当前速度)和行为(换档、改变踏板节奏、踩刹车)。识别现实世界对象的状态和行为是开始思考面向对象编程的好方法。
现在花一分钟观察您附近区域的真实世界物体。对于你看到的每个物体,问自己两个问题:“这个物体可能处于什么状态?” 和“这个对象可以执行哪些可能的行为?”。请务必写下您的观察结果。当您这样做时,您会注意到现实世界中的对象的复杂性各不相同。您的台式灯可能只有两种可能的状态(开和关)和两种可能的行为(打开、关闭),但您的台式收音机可能有其他状态(打开、关闭、当前音量、当前电台)和行为(打开) 、关闭、增大音量、减小音量、搜索、扫描和调谐)。您可能还会注意到,某些对象反过来也会包含其他对象。这些现实世界的观察都转化为面向对象编程的世界。
一个物体有了状态之后,可以暴露出来物体的状态。
编程是对现实事物的抽象表示,现实现实世界是复杂的,编程无法完全的来做到,所以只能够化繁为简
编程只是要能够清楚描述这个物体,能够在编程中使用
状态也有多种表现形式。比如说:颜色有黄色、白色、黑色等等,但是这些对于类来说是不确定的,只有具体到一个具体的物体身上才会变得有意义。所以说类也是一种抽象,而对象是一种具体的实现。
类是一种模板,对象是根据模板值来创建出来的。
软件对象在概念上类似于现实世界的对象:它们也由状态和相关行为组成。对象将其状态存储在字段(某些编程语言中的变量)中,并通过方法(某些编程语言中的函数)公开其行为。方法对对象的内部状态进行操作,并作为对象到对象通信的主要机制。隐藏内部状态并要求通过对象的方法执行所有交互称为数据封装——面向对象编程的基本原则。
以一辆自行车为例:
通过赋予状态(当前速度、当前踏板节奏和当前档位)并提供改变该状态的方法,对象保持控制外部世界如何使用它。例如,如果自行车只有 6 个齿轮,则换档方法可能会拒绝任何小于 1 或大于 6 的值。
将代码捆绑到单独的软件对象中提供了许多好处,包括:
- 模块化:对象的源代码可以独立于其他对象的源代码编写和维护。创建后,对象可以轻松地在系统内部传递。
- 信息隐藏:通过仅与对象的方法交互,其内部实现的细节对外界保持隐藏。
- 代码重用:如果一个对象已经存在(可能由另一个软件开发人员编写),您可以在您的程序中使用该对象。这允许专家实现/测试/调试复杂的、特定于任务的对象,然后您可以信任这些对象在您自己的代码中运行。
- 可插拔性和调试简易性:如果某个特定对象被证明有问题,您可以简单地将其从应用程序中删除并插入一个不同的对象作为它的替代品。这类似于解决现实世界中的机械问题。如果螺栓断裂,您需要更换它,而不是整个机器。
不管强调了描述一个对象,从其状态出发,然后通过行为来修改其状态。事实上就是想通过方法来操作其状态的,因为编程是一个动态的过程,不是一成不变的。
什么是class?
在现实世界中,您经常会发现许多相同类型的单个对象。可能还有数以千计的其他自行车存在,它们的品牌和型号都相同。每辆自行车都是根据同一组蓝图制造的,因此包含相同的组件。在面向对象的术语,我们说你的自行车是一个实例中的类的对象被称为自行车。一类是从中创建单个对象的蓝图。
以下 Bicycle
类是自行车的一种可能实现:
class Bicycle {
int cadence = 0;
int speed = 0;
int gear = 1;
void changeCadence(int newValue) {
cadence = newValue;
}
void changeGear(int newValue) {
gear = newValue;
}
void speedUp(int increment) {
speed = speed + increment;
}
void applyBrakes(int decrement) {
speed = speed - decrement;
}
void printStates() {
System.out.println("cadence:" +
cadence + " speed:" +
speed + " gear:" + gear);
}
}
Java 编程语言的语法对您来说很陌生,但该类的设计基于之前对自行车对象的讨论的字段cadence
,speed
和gear
表示该对象的状态,并且这些方法(changeCadence
,changeGear
,speedUp
等)定义其与外界交互。
您可能已经注意到Bicycle
该类不包含main
方法。那是因为它不是一个完整的应用程序;它只是可能在应用程序中使用的自行车的蓝图。创建和使用新Bicycle
对象的责任属于应用程序中的某个其他类。
这是一个 BicycleDemo
创建两个单独Bicycle
对象并调用它们的方法的类:
class BicycleDemo {
public static void main(String[] args) {
// Create two different
// Bicycle objects
Bicycle bike1 = new Bicycle();
Bicycle bike2 = new Bicycle();
// Invoke methods on
// those objects
bike1.changeCadence(50);
bike1.speedUp(10);
bike1.changeGear(2);
bike1.printStates();
bike2.changeCadence(50);
bike2.speedUp(10);
bike2.changeGear(2);
bike2.changeCadence(40);
bike2.speedUp(10);
bike2.changeGear(3);
bike2.printStates();
}
}
此测试的输出打印了两辆自行车的结束踏板节奏、速度和档位:
cadence:50 speed:10 gear:2
cadence:40 speed:20 gear:3
总结:
1、编程世界对应的是现实世界,而编程世界想要描述现实世界中的事物,那么首先需要找到其状态,通过这些物体的状态来直视现实世界中的物体的状态。但是因为对于一个对象来说,每个对象都有自己特有的属性,是属于自己内部的性质。外界想要来进行修改对象内部的性质,那么只需要看对象是否对外提供了操作属性的行为,也就是方法。
所以说方法从一个笼统的概念上来说,就是为了操作其属性的。这种操作可以分为:显示、修改等等
2、基础总结:
- 现实世界的对象包含状态和行为。
- 软件对象的状态存储在fields 中。
- 软件对象的行为通过方法公开。
- 对外部世界隐藏内部数据,并仅通过公开公开的方法访问它被称为数据封装。
- 软件对象的蓝图称为类。
- 通用行为可以在超类中定义,并使用extends关键字继承到子类中。
- 没有实现的方法集合称为接口。
- 按功能组织类和接口的命名空间称为包。
- 术语 API 代表应用程序编程接口。