类和对象

在第一次听到“面向对象“这四个字,大家或许多少都感到有些不知所措,感觉像是玄学。到底什么是面向对象,面向对象有什么用?

要谈面向对象,我们应该先来谈谈什么是对象?

什么是对象

对象其实很好解释,一切在世界上(地球终于有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 访问权限修饰词这篇文章写的很详细,推荐看看

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 148,637评论 1 318
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 63,443评论 1 266
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 99,164评论 0 218
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 42,075评论 0 188
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 50,080评论 1 266
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 39,365评论 1 184
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,901评论 2 283
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,649评论 0 176
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,122评论 0 223
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,734评论 2 225
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,093评论 1 236
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,548评论 2 222
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,028评论 3 216
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,765评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,291评论 0 178
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 34,162评论 2 239
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 34,293评论 2 242

推荐阅读更多精彩内容

  • java是面向对象的程序设计语言,java语言提供了定义类、成员变量、方法等最基本的功能。类可被认为是一种自定义的...
    伊卡洛斯丶阅读 315评论 0 1
  • 类是一个重要的C#编程概念,它在一个单元内定义了表示和行为。类提供了面向对象编程和面向组件编程所需的语言支持,是创...
    CarlDonitz阅读 738评论 0 2
  • 2.1 类的基础知识2.2 构造函数2.3 拷贝构造函数2.4 析构函数2.5 C++能自动产生成员函数2...
    笑笑学生阅读 380评论 0 0
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,265评论 18 399
  • 商场里,你挑了两件衣服问我,哪一件更好看呢? 我指了指紫色那件,我觉得紫色挺适合你的。 你说,可是,我觉得红色这件...
    肾毒阅读 178评论 41 9