在第一次听到“面向对象“这四个字,大家或许多少都感到有些不知所措,感觉像是玄学。到底什么是面向对象,面向对象有什么用?
要谈面向对象,我们应该先来谈谈什么是对象?
什么是对象
对象其实很好解释,一切在世界上(地球终于有cp啦(.)客观存在的事物都叫对象,所谓万物皆对象。我们看一下维基百科对对象的解释:
在计算机科学中,对象(英语:object),是一个存储器地址,其中拥有值,这个地址可能有标识符指向此处。对象可以是一个变量,一个数据结构,或是一个函数。是面向对象(Object Oriented)中的术语,既表示客观世界问题空间(Namespace)中的某个具体的事物,又表示软件系统解空间中的基本元素。
在软件系统中,对象具有唯一的标识符,对象包括属性(Properties)和方法(Methods),属性就是需要记忆的信息,方法就是对象能够提供的服务。在面向对象(Object Oriented)的软件中,对象(Object)是某一个类(Class)的实例(Instance)
上面提到了类,要理解面向对象就必须先理解什么是类。那么我们来聊一聊什么是“类”
类
类就是对“对象”的抽象,它不是任何事物,只是一个抽象
下面是维基百科对类的定义
类(英语:class)是一种面向对象计算机编程语言的构造,是创建对象的蓝图,描述了所创建的对象共同的属性和方法。
类的更严格的定义是由某种特定的元数据所组成的内聚的包。它描述了一些对象的行为规则,而这些对象就被称为该类的实例。类有接口和结构。接口描述了如何通过方法与类及其实例互操作,而结构描述了一个实例中数据如何划分为多个属性。
支持类的编程语言在支持与类相关的各种特性方面都多多少少有一些微妙的差异。大多数都支持不同形式的类继承。许多语言还支持提供封装性的特性,比如访问修饰符。类的出现,为面向对象编程的三个最重要的特性(封装性,继承性,多态性),提供了实现的手段。
我们从上面的定义可以看出来,类是对象的抽象,所以需要大家明白什么是抽象。可能很多人看抽象派大师的画看多了,会评论什么什么东西很抽象,比如你的脸长得很抽象。大家可能觉得抽象这个词是个形容词,其实不然,他也是个动词。
抽象的意思是把某些具有共同特性的事物(对象)的共同点“抽”出来,用来划分对象的区别,这就是抽象。抽象出来的对象就变成了类
下面关于抽象的概念摘自百度百科
抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃其非本质的特征。例如苹果、香蕉、生梨、葡萄等,它们共同的特性就是水果。得出水果概念的过程,就是一个抽象的过程。要抽象,就必须进行比较,没有比较就无法找到在本质上共同的部分。共同特征是指那些能把一类事物与他类事物区分开来的特征,这些具有区分作用的特征又称本质特征。因此抽取事物的共同特征就是抽取事物的本质特征,舍弃非本质的特征。所以抽象的过程也是一个裁剪的过程。在抽象时,同与不同,决定于从什么角度上来抽象。抽象的角度取决于分析问题的目的。
我们从思想上解释了什么是面向对象。下面我们举个具体的例子来更直观的说明一下
问题域
有一个帐户,帐户中有存款余额,您可以对帐户进行存款与提款的动作,并可以查询以取得存款余额。
分析
我们用面向对象的思想来分析一下这需求,并通过代码解决这个需求。通过分析我们可以从这个需求里识别出我们操作的对象是一个账号。那么我们就对账号这个对象进行抽象。看账号这个对象有什么属性和行为
Paste_Image.png
如上图所示,通过分析需求,基本可以抽象出账号对应的属性和行为。下面我们用 java 来实现这个需求
实现
根据之前的分析。我们用 java 代码来实现一下。首先我需要定义一个叫 Account 的类来表示“账号”
public class Account {
//账号标识
private String accountNum;
//余额
private double balance;
//存款
public void deposit(double money) {
balance += money;
}
//提款
public double withdraw(double money) {
balance -= money;
return money;
}
//重新余额
public double getBalance() {
return balance;
}
}
我们分析一下上面的代码,说明一下 java 是如何定义类的
定义类
所谓类就是对象的类型,从上面的代码可以看出来。通过关键字class来表示“我准备告诉你一种新类型的对象包含什么属性和行为”,class 关键字后面紧跟着的就是这个类型的名称
java class ClassName{ /* 类的内容*/}
然后就可以通过 new来创建这种类型的对象了
java ClassName cn = new ClassName();
这样就定义了一个类,关于 public,看下面的访问权限控制
定义成员变量
//账号标识
private String accountNum;
//余额
private double balance;
这就是 Account 类的成员变量,在定义成员变量的时候可以指定初始值,如果没有初始值,则会有默认值。如果是非基本类型,默认值是 null ,如果是基本类型,那么它的默认值如下图所示:
类型 | 初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0f |
double | 0.0d |
char | \u0000 |
boolean | false |
定义成员变量的时候,有一个原则,就是变量的最小化公开,也就是说尽量把变量设置成 private 的,然后通过方法来访问这些成员变量
定义方法
略。。。
包
包:包内包含有一组类,它们在单一的名字空间之下被组织在一起。
例如,在jdk中,提供了一个工具库,它被组织在 java.util 的名字空间下,java.util 中有一个叫 ArrayList类。使用 ArrayList 的话,可以通过 java.util.ArrayList 来指定它,事实上只有带上包名+类名才能真正确定一个类,同一包名下的类不能重复。不同包名下的类名可以重复。所以包起到了一个命名隔离的作用。
访问权限控制
public 、protected 和 private 这几个 Java 访问权限修饰词在使用时,是置于类中每个成员定义之前——无论它是一个域还是一个方法。每个访问权限修饰词仅控制它所修饰的特定定义的访问权。
如果不提供任何访问权限修饰词,则意味着它是“包访问权限”。因此,无论如何,所有事物都具有某种形式的访问权限控制。
《Think in java》
Java访问权限控制机制提供了大小不同的四种访问权限修饰词,分别代表对于类、成员、方法(为方便起见,以下将类、成员和方法这些能被访问权限修饰词修饰的部分统称为成员)的不同访问权限。这四种权限由大至小依次为:public、protected、package和private。
public:接口访问权限,该访问权限意味着任何包中的任何类都可以对该成员进行访问;
protected:继承访问权限,拥有继承访问权限的成员可以被同一包中的其他类访问、也可以被该类的子类访问(无论是否处于同一个包中),但是不能被不同包中的非子类访问;
package:包访问权限,也是默认访问权限,当未给成员赋予任何访问权限修饰词时,该成员即为包访问权限,拥有该访问权限的成员只能被同一包中的类访问;不同包中的类无访问权(即便是子类也不行);
private:私有权限,该权限意味着除了包含该成员的类以外,其余的类均不能够访问该成员。
下面通过一个表格说明这四类访问权限的作用域,会更加简洁明了。
同一个类 | 同一个包 | 不同包中的子类 | 不同包中的非子类 | |
---|---|---|---|---|
public | OK | OK | OK | OK |
protected | OK | OK | OK | |
package | OK | OK | ||
private | OK |
Java 访问权限修饰词这篇文章写的很详细,推荐看看
网友评论