1 神速熟悉面向对象

1.1 表格结构和类结构

我们在现实生活中,思考问题、发现问题、处理问题,往往都会用“表格”作为工具。
实际上,“表格思维”就是一种典型的面向对象思维。 实际上,互联网上所有的数据本质上都是“表格”。我们在这里通过从表格表示数据开 始,引入对象和类。大家就会神奇的发现,原来“表格就是对象”。

我们也经常将表中的“列”,叫做“字段”,英文中统一叫做“field”。显然,field 定义了表的结构。我们可以通过增加新的 field(列),让表中所有的行增加数据:
面向对象编程中,类对应表的结构(表的 field),我们可以定义出“雇员类”:
通过上图,可以看到,雇员类和雇员表的结构完全一样。只不过,雇员类增加了数据的类型而已。

1.2 表格的动作和类的方法

每个公司的雇员都要有相关的动作。比如:所有雇员每天的工作标准动作有:
1.参加晨会,领取当天任务 。
2…午休
3…提交工作日志
我们可以在雇员表中将动作信息也包含进去:
新增的列“雇员动作说明”,显然是对所有的雇员都有用,每个雇员都有这个动作。 在类 中就是定义成方法:
当然,我们也可以根据需求,为雇员定义多个动作。比如:午休、提交工作日志、领取 工资等等。

1. 3 对象对应“表中的行数据”

前面两节,我们主要讲解的是“表结构和类的对应关系”。那么,表中的数据和什么对 应呢?
表中的一行一行的数据,都在表结构的约束范围内,大家的结构都是相同的。如下表:

显然,每一行数据都有“姓名”、“基本工资”等“列”,也都有标准的“晨会动作”。 在面向对象编程中,下面三句话大家记住:

  1. 表结构对应:类结构.
  2. 一行数据对应:一个对象
  3. 表中所有数据对应:这个类的所有对象.
    因此,上面的四行数据,我们使用四个对象就需要这样表示(假设有对应的构造方法, 如下代码是示意,非真实代码):
    有的人可能注意到了,创建对象的时候没有传入“晨会动作”这个列,是因为“晨会动 作”是一个所有数据都有的标准动作,没必要再重复为每个对象创建“标准晨会动作”。
 【注意】:1. 本节课中的代码仅是“示意型”,你可以再文档笔记中写,没有必要再开发环境中 写并运行。2. 看完本节,如果还有点糊涂,没有关系,本节仅是你的“初恋对象”。本节仅仅是 为了方便大家入门,更快的了解面向对象。从第二节才是真正开始“面向对象”,真正为了 “结婚”、为了“开发”的“真对象”。

2 面向过程和面向对象思想

2.1 面向过程和面向对象的区别

面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的 方式去分析、设计和开发软件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性 的提高,面向过程的弊端越来越明显的显示出来,出现了面向对象思想并成为目前主流的方 式。两者都贯穿于软件分析、设计和开发各个阶段,对应面向对象就分别称为面向对象分析 (OOA)、面向对象设计(OOD)和面向对象编程(OOP)。C 语言是一种典型的面向过 程语言,Java 是一种典型的面向对象语言。
面向过程思想思考问题时,我们首先思考“怎么按步骤实现?”并将步骤对应成方法, 一步一步,最终完成。 这个适合简单任务,不需要过多协作的情况下。比如,如何开车? 我们很容易就列出实现步骤:
面向过程适合简单、不需要协作的事务,重点关注如何执行。
但是当我们思考比较复杂的设计任务时,比如“如何造车?”,就会发现列出 1234 这 样的步骤,是不可能的。那是因为,造车太复杂,需要很多协作才能完成。此时面向对象思 想就应运而生了。
面向对象(Oriented-Object)思想更契合人的思维模式。我们首先思考的是“怎么设计 这个事物?” 比如思考造车,我们就会先思考“车怎么设计?”,而不是“怎么按步骤造 车的问题”。这就是思维方式的转变。
比如,我们用面向对象思想思考“如何设计车”:
天然的,我们就会从“车由什么组成”开始思考。发现,车由如下对象组成:

为了便于协作,我们找轮胎厂完成制造轮胎的步骤,发动机厂完成制造发动机的步骤; 这样,发现大家可以同时进行车的制造,最终进行组装,大大提高了效率。但是,具体到轮 胎厂的一个流水线操作,仍然是有步骤的,还是离不开执行者、离不开面向过程思维!
因此,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到 实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。
我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!
·面向对象和面向过程思想的总结

  1. 都是解决问题的思维方式,都是代码组织的方式。
  2. 面向过程是一种“执行者思维”,解决简单问题可以使用面向过程。
  3. 面向对象是一种“设计者思维”,解决复杂、需要协作的问题可以使用面向对象。
  4. 面向对象离不开面向过程:
    4.1 宏观上:通过面向对象进行整体设计.
    4.2 微观上:执行和处理数据,仍然是面向过程。

2.2 面向对象是“设计者思维

面向对象是一种“设计者思维”。设计时,先从问题中找名词,然后确立这些名词哪些 可以作为类,再根据问题需求确定的类的属性和方法,确定类之间的关系。
设计一款企业管理软件,我们需要进行面向对象分析(OOA:Object-Oriented Analysis),写一首诗、一篇文章、一篇小说也需要进行面向对象分析。
因此,面向对象这种思维是任何人都需要学习、任何人都需要掌握的。

2.3 面向对象分析:写诗

“面向对象思维”不止适合工科、理科,也适合文科。比如:我要写一首诗,就是一种 设计的过程,怎么样用简单的、有意境的词汇来描述一个场景。
《登鹳雀楼》是一首名诗,我们使用面向对象的思维方式分析一下。
我们先从场景中找出名词。里面有: 外在场景:1. 太阳 2. 天空 3. 黄河 4. 河流交汇处 5. 鹳雀楼 6. 草
诗人情怀:1. 登高望远 2. 进取 3. 努力
描述过程:由远及近,再到自身情怀。
我们也可以使用表格来表示上面的信息:

分析完上面这些 Object 后,我们需要进行组合。把这些 Object 融合到一个场景。王之涣 大诗人设计的场景就是:
实:在高楼上看着太阳和黄河,真好看。
虚:寄托一下登高望远、
人生积极进取的精神。 好了。程序员“王之涣”开始琢磨他的程序了。
0.1 版《登鹳雀楼》
王之涣诗人爬上了登鹳雀楼,心情大好。把看到的场景和旁边的小甜甜说(0.1 版诗歌):
啊,太阳快下山了
啊,黄河往海的方向流。
啊,我还想看的远一点
啊,咱们再向上爬一层楼吧。
0.2 版《登鹳雀楼》
这么说完,哄小甜甜都有点费劲, 这和我们村的二牛说的差不多啊。需要加工一下,太阳太 俗,换成“红日”。“远一点”太没志气“诗人得夸张点,远一点怎么也得千里吧,估计李 白那家伙就要写万里了,我就千里吧”。于是,诞生了 0.2 版诗歌:
红日要下山, 黄
河往海(的方向)流。
要想看千里,
向上爬一楼。
0.3 版《登鹳雀楼》
至少都是 5 个字了,但是用语太俗,哄小甜甜还是费劲,但比村里面的二牛强一点,不光 词汇要雅,句子也要再雅一点(0.3 版诗歌):
红日依山尽,
黄河往海流。
欲看千里远,
向上爬一楼。
0.4 版《登鹳雀楼》
红日大家都知道,还是俗,我得变变样。咦,红的有点泛白(也可能是看久了,眼睛疲 劳),那就白日吧,别人都没用过,“微创新一下”。
欲看千里远,里面的动词换成名词更有场景感,欲目千里远。不错不错,再倒装一下变 成“欲远千里目”。
成“欲远千里目”。 向上爬一楼,这个爬字看着就恶心,而且和“上”是一个意思,去掉它。“向上爬一楼” -->“向上一层楼”。于是(0.4 版诗歌出来了):
红日依山尽,
黄河往海流。
欲远千里目,
向上一层楼。
1.0 版《登鹳雀楼》
这个 0.4 版已经哄的小甜甜花枝乱颤了。大诗人觉得这诗有流传的潜力,晚上回去再好 好“精加工一下”。于是,字斟句酌,让读起来更加朗朗上口,最终成就了流传千年的诗歌 (1.0 版诗歌):
白日依山尽,
黄河入海流。
欲穷千里目,
更上一层楼。
兄弟,会写诗了吗?多用“面向对象的设计思维”模拟“原创者的思考过程”,你离“封 神”会越来越近,你的学习也会越来越有意思。

2.4. 面向对象分析

写小说 写小说本质上和设计软件是一样的,根据想要表达的内容,设计不同的场景、设计不同 的任务。
设计完成后,作者再按照一章一章的完成写作(执行阶段)。
所以,只要是“设计工作”都是相通的。程序员副业写写小说也不是不可能,《哈利波 特》的作者J.K.罗琳(J.K. Rowling),也是利用业余时间写出了传世之作,并且获得了数亿英镑的收入。2004 年,罗琳荣登《福布斯》富人排行榜,她的身价达到10亿美元。
《哈利波特》太长了,关键是我也没看过。 在这里,以短篇小说《茶馆》为例,简单 分析“面向对象设计方式写小说”的过程。

2.4.1 明确小说主要内容和目标

《茶馆》是现代文学家老舍所著,《茶馆》这本文章主要展现戊戌变法,揭示了近半个 世纪中国社会的黑暗,腐败的社会现象。 以大茶馆的兴衰变迁,展示了清末到北洋军阀再到抗战胜利后,北京的各个阶层和社会 风貌不同人物的变迁,像是亲身在当时的环境中,感受近 50 年的北京的变化!

2.4.2 人物设计分析

一个茶馆就是一个小社会,各类人物开始出现,他们不同的命运也被体现,侧面反映出 当时黑反腐朽的时代。

2.4.3 整体事件设计

2.4.4 对象的进化史(数据管理和企业管理共通之处)

本节课从另一个角度出发,帮助大家理解对象。从数据管理的角度出发,看待对象是如 何诞生的。
事物的发展总是遵循“量变引起质变”的哲学原则;企业管理和数据管理、甚至社会管 理也有很多共通的地方。本节课类比企业管理的发展,让大家更容易理解为什么会产生“对 象”这个概念。
·数据无管理时代
最初的计算机语言只有基本变量(类似我们学习的基本数据类型),用来保存数据。那时 候面对的数据非常简单,只需要几个变量即可搞定;这个时候不涉及“数据管理”的问题。 同理,就像在企业最初发展阶段只有几个人,不涉及管理问题,大家闷头做事就 OK 了。
数组管理和企业部门制
企业发展中,员工多了怎么办?我们很自然的想法就是归类,将类型一致的人放到一起; 企业中,会将都做销售工作的放到销售部管理;会将研发软件的放到开发部管理。同理在编 程中,变量多了,我们很容易的想法就是“将同类型数据放到一起”, 于是就形成了“数 组”的概念,单词对应“array”。 这种“归类”的思想,便于管理数据、管理人。
·对象和企业项目制
企业继续发展,面对的场景更加复杂。一个项目可能需要经常协同多个部门才能完成工 作;一个项目从谈判接触可能需要销售部介入;谈判完成后,需求调研开始,研发部和销售 部一起介入;开发阶段需要开发部和测试部互相配合敏捷开发,同时整个过程财务部也需要 跟进。在企业中,为了便于协作和管理,很自然就兴起了“项目制”,以项目组的形式组织, 一个项目组可能包含各种类型的人员。 一个完整的项目组,麻雀虽小五脏俱全,就是个创 业公司甚至小型公司的编制,包含行政后勤人员、财务核算人员、开发人员、售前人员、售 后人员、测试人员、设计人员等等。事实上,华为、腾讯、阿里巴巴等大型公司内部都是采 用这种“项目制”的方式进行管理。
同理,计算机编程继续发展,各种类型的变量更加多了,而且对数据的操作(指的就是 方法,方法可以看做是对数据操作的管理)也复杂了,怎么办?
为了便于协作和管理,我们“将相关数据和相关方法封装到一个独立的实体”,于是“对 象”产生了。 比如,我们的一个学生对象: 有属性(静态特征):年龄:18,姓名:高淇,学号:1234 也可以有方法(动态行为):学习,吃饭,考试 请大家举一反三,根据上表理解一下企业的进化史,会发现大道至简。原来,数据管理、 企业管理、社会发展也是有很多共通的地方。“量变引起质变,不同的数量级必然采用不同 的管理模式”。

总结
1.对象说白了也是一种数据结构(对数据的管理模式),将数据和数据的行为放到了一起。
2.在内存上,对象就是一个内存块,存放了相关的数据集合!
3.对象的本质就一种数据的组织方式

3 对象和类的详解

3.1 类和对象的概念

我们人认识世界,其实就是面向对象的(此对象可不是男女谈对象的彼对象呀) 。比 如现在让大家认识一下“天使”这个新事物,天使大家没见过吧,怎么样认识呢?最好的办 法就是,给你们面前摆 4 个天使,带翅膀的美女,让大家看,看完以后,即使我不说,大 家下一次是不是就都认识天使了。
但是,看完 10 个天使后,我们总要总结一下,什么样的东东才算天使?天使是无数的, 总有没见过的!所以必须总结抽象,便于认识未知事物!总结的过程就是抽象的过程。小时 候,我们学自然数时怎么定义的?像 1,2,3,4…这样的数就叫做自然数。 通过抽象,我 们发现天使有这样一下特征:

  1. 带翅膀(带翅膀不一定是天使,还可能是鸟人)
  2. 女孩(天使掉下来脸着地,也是天使!)
  3. 善良
  4. 头上有光环
    那么通过这 4 个具体的天使,我们进行抽象,抽象出了天使的特征,我们也可以归纳一 个天使类。 通过这个过程,类就是对象的抽象。
    类可以看做是一个模版,或者图纸,系统根据类的定义来造出对象。我们要造一个汽车, 怎么样造?类就是这个图纸,规定了汽车的详细信息,然后根据图纸将汽车造出来。
    类:我们叫做 class。 对象:我们叫做 Object,instance(实例)。以后我们说某个类的对 象,某个类的实例。是一样的意思。
总结:
1.类可以看成一类对象的模板,对象可以看成该类的一个具体实例。
2.类是用于描述同一类型的对象的一个抽象概念,类中定义了这一类对象所应具有的共 同的属性、方法。

3.2 类的定义

做了关于对象的很多介绍,终于进入代码编写阶段。本节中重点介绍类和对象的基本定 义,属性和方法的基本使用方式。
属性(field 成员变量)
属性用于定义该类或该类对象包含的数据或者说静态特征。 属性作用范围是整个类体。 在定义成员变量时可以对其初始化,如果不对其初始化,Java 使用默认的值对其初始化。

属性定义格式如下:

 [修饰符] 属性类型 属性名 = [默认值] ;

方法
方法用于定义该类或该类实例的行为特征和功能实现。方法是类和对象行为特征的抽 象。方法很类似于面向过程中的函数。面向过程中,函数是最基本单位,整个程序由一个个 函数调用组成。面向对象中,整个程序的基本单位是类,方法是从属于类和对象的。
方法定义格式如下:

[修饰符] 方法返回值类型 方法名(形参列表) {// n 条语句 }

类的定义方式的代码如下:

// 每一个源文件必须有且只有一个public class,并且类名和文件名保持一致!
public class Car { }
class Tyre { // 一个Java文件可以同时定义多个class
}
class Engine { }
class Seat { }

上面的类定义好后,没有任何的其他信息,就跟我们拿到一张张图纸,但是纸上没有任 何信息,这是一个空类,没有任何实际意义。所以,我们需要定义类的具体信息。对于一个 类来说,一般有三种常见的成员:属性 field、方法 method、构造器 constructor。这三 种成员都可以定义零个或多个。
编写简单的学生类代码如下:

public class SxtStu { // 属性(成员变量)int id; String sname; int age; // 方法void study(){ System.out.println("我正在学习!"); }// 构造方法 SxtStu(){ }
}

一个典型的 IT 学生类的代码如下:

package com.txw;class  Computer{String brand;  // 品牌
}
public class SxtStu2 {// fieldint id;String sname;int age;Computer comp;void study() {System.out.println("我正在学习!使用我们的电脑," + comp.brand);}public static void main(String[] args) {SxtStu2 stu = new SxtStu2();stu.sname = "张三";Computer comp = new Computer();comp.brand = "联想";stu.comp = comp; stu.study();}
}

4 构造方法(构造器 constructor)

4.1 构造方法基础用法

构造器也叫构造方法(constructor),用于对象的初始化。构造器是一个创建对象时被 自动调用的特殊方法,目的是对象的初始化。构造器的名称应与类的名称一致。Java 通过 new 关键字来调用构造器,从而返回该类的实例,是一种特殊的方法。
声明格式:

 [修饰符] 类名(形参列表){  // n 条语句 }

构造器 4 个要点:
1.构造器通过 new 关键字调用!!
2. 构造器虽然有返回值,但是不能定义返回值类型(返回值的类型肯定是本类),不能 在构造器里使用 return 返回某个值。
3. 如果我们没有定义构造器,则编译器会自动定义一个无参的构造方法。如果已定义 则编译器不会自动添加!
4. 构造器的方法名必须和类名一致!
演示的代码如下:

package com.txw;/*** 定义一个“点”(Point)类用来表示二维空间中的点(有两个坐标)。要求如下:* 可以生成具有特定坐标的点对象。* 提供可以设置坐标的方法。* 提供可以计算该“点”距另外一点距离的方法。* @author Adair* @date 2022/2/15 0015上午 9:37* @email 1578533828@qq.com*/class Point{double x ,y;public Point(double _x, double _y) {x = _x; y = _y;}public double getDistance(Point p) {return Math.sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));}
}
public class TestConstructor {public static void main(String[] args) {Point p1 = new Point(3.0, 4.0);Point origin = new Point(0.0, 0.0);System.out.println(p1.getDistance(origin));}
}
新手雷区
对象的创建完全是由构造方法实现的吗? 不完全是。构造方法是创建 Java 对象的重要途径,通过 new 关键字调用构造器时,构造器 也确实返回了该类对象,但这个对象并不是完全由构造器负责创建的。创建一个对象分为如下四步:
1. 分配对象空间,并将对象成员变量初始化为 0 或空
2. 执行属性值的显式初始化
3.  执行构造方法
4. 返回对象的地址给相关的变量

4.2 构造方法的重载

构造方法也是方法,只不过有特殊的作用而已。与普通方法一样,构造方法也可以重载。
构造方法重载(创建不同用户对象)的代码如下:

package com.txw.test;/*** 构造方法重载(创建不同用户对象)* @author Adair* @date 2022/2/15 0015上午 9:43* @email 1578533828@qq.com*/
public class User {int id;  // idString name; // 账户名String pwd; // 密码public User() {}public User(int id, String name) {this.id = id;this.name = name;}public User(int id, String name, String pwd) {this.id = id;this.name = name;this.pwd = pwd;}public static void main(String[] args) {User u1 = new User();User u2 = new User(1001,"Adair");User u3 = new User(1001,"Adair","123456");}
}
新手雷区:
如果方法构造中形参名与属性名相同时,需要使用 this 关键字区分属性与形参。如上代码所示: this.id 表示属性 id;id 表示形参id

Java的面向对象1相关推荐

  1. java基础面向对象_Java基础面向对象

    一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别,作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该 ...

  2. Java基础-面向对象第二特征之继承(Inheritance)

    Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...

  3. 从C++到Java --理解面向对象是关键所在

    从C++到Java --理解面向对象是关键所在 本文将提供一个对这些概念的简明的解释,而不是提供一些深入的或者如何使用的问题.记住,这只是依据我对Java的经验带而提出的一些主要的差异. Java在虚 ...

  4. Java 基础 - 面向对象(不错N多教程集合)

    著作权归https://pdai.tech所有. 链接:Java 基础 - 面向对象 | Java 全栈知识体系 本文主要介绍Java OOP 面向对象基础和相关类图.@pdai Java 基础 - ...

  5. 第一部分 Java:面向对象理解

    Java:面向对象理解.集合.IO.NIO.并发.反射源码分析 一.面向对象 1.创建对象的5种方式 (1)使用new关键字(2)使用Class类的newInstance方法(3)使用构造函数类的ne ...

  6. 学习Java编程面向对象的五大基本原则

    Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...

  7. java 168转换成861_java实验-java语言面向对象编程基础

    java实验-java语言面向对象编程基础 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 8.90 积分 广州大学学生实验报告广州大学学生实验报告 ...

  8. JAVA 的面向对象设计的特点-书后感-01-21天学通JAVA-深入分析

    JAVA 作为面向对象的一种语言究竟有哪些特点.本文尝试列举最基本的一些:从<21天学通JAVA>中摘来一些概念,并且做了一定的深挖理解. 本章尝试重编译顺序角度理解JAVA继承的覆盖,重 ...

  9. java c 面向对象比较教程_c语言初学指针,对于java面向对象的初理解

    最近在看关于c语言的指针,学习下,发现指针原来运用理解成其实可以抽象出我们java的面向对象封装,地址--> 对象或变量,先看一段代码: public class Cat { public St ...

  10. 【Java】面向对象是什么

    自从开始接触java,就有人告诉我说,java是面向对象的编程语言.最多就是new一个对象,但是并不知道对象是什么.我以为对象就是一个class类,没有什么特别的.但开始找工作的时候,面试的人问了一个 ...

最新文章

  1. 捍卫者usb管理控制系统_捍卫超模块化JavaScript
  2. Flume的安装与配置
  3. prototype中顶层元素的测试
  4. 聚类算法(2):系统聚类/层次聚类算法
  5. 服务器系统2012怎么多人连接,windows2012服务器TCP连接数
  6. Leetcode#206Reverse Linked List
  7. HTML5 API详解(6):getUserMedia实现拍照功能
  8. 双极结型三极管及放大电路基础
  9. wpsppt流程图联系效果_| JEAM | 文章精选:大城市收取交通拥堵费的影响与效果
  10. python中turtle画圆填充颜色_Python之turtle绘图
  11. idea中maven下载依赖包出错
  12. mysql将日期转换年份_mysql将日期转换为当前年份的相同日期
  13. linux的php探针使用,php探针在Linux下的安装过程
  14. UTD2202C示波器如何显示峰峰值
  15. Flutter | Sliver 系列
  16. 数据库查询时报IllegalArgumentException异常是什么原因?
  17. linux和windows认证sssd,linux – 使用sssd和Active Directory集成的麻烦
  18. 用大家的力量来总结一个目录(众人拾柴火焰高)
  19. HBaseCon亚洲2018峰会盛大开幕 阿里带你洞悉HBase大数据生态最新发展和行业实践...
  20. bmp文件数字水印c语言代码,图像数字水印+matlab程序文件.doc

热门文章

  1. 生鲜超市管理系统(JavaSSH)
  2. 英语到数字翻译 (20 分)
  3. JS Number类型的数值转换
  4. KalznOJ评测机,有待完善的一个OnlineJudge评测机
  5. 开放式多媒体应用平台OMAP综述
  6. 推荐系统--评估方法和评估指标
  7. WordPress 网站漏洞扫描 wpscan Kali Linux
  8. C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子
  9. 美国队长3:内战_隐藏的宝石:寻找美国最好的秘密线索
  10. jq中 html append appendto