Java的面向对象1
1 神速熟悉面向对象
1.1 表格结构和类结构
我们在现实生活中,思考问题、发现问题、处理问题,往往都会用“表格”作为工具。
实际上,“表格思维”就是一种典型的面向对象思维。 实际上,互联网上所有的数据本质上都是“表格”。我们在这里通过从表格表示数据开 始,引入对象和类。大家就会神奇的发现,原来“表格就是对象”。
我们也经常将表中的“列”,叫做“字段”,英文中统一叫做“field”。显然,field 定义了表的结构。我们可以通过增加新的 field(列),让表中所有的行增加数据:
面向对象编程中,类对应表的结构(表的 field),我们可以定义出“雇员类”:
通过上图,可以看到,雇员类和雇员表的结构完全一样。只不过,雇员类增加了数据的类型而已。
1.2 表格的动作和类的方法
每个公司的雇员都要有相关的动作。比如:所有雇员每天的工作标准动作有:
1.参加晨会,领取当天任务 。
2…午休
3…提交工作日志
我们可以在雇员表中将动作信息也包含进去:
新增的列“雇员动作说明”,显然是对所有的雇员都有用,每个雇员都有这个动作。 在类 中就是定义成方法:
当然,我们也可以根据需求,为雇员定义多个动作。比如:午休、提交工作日志、领取 工资等等。
1. 3 对象对应“表中的行数据”
前面两节,我们主要讲解的是“表结构和类的对应关系”。那么,表中的数据和什么对 应呢?
表中的一行一行的数据,都在表结构的约束范围内,大家的结构都是相同的。如下表:
显然,每一行数据都有“姓名”、“基本工资”等“列”,也都有标准的“晨会动作”。 在面向对象编程中,下面三句话大家记住:
- 表结构对应:类结构.
- 一行数据对应:一个对象
- 表中所有数据对应:这个类的所有对象.
因此,上面的四行数据,我们使用四个对象就需要这样表示(假设有对应的构造方法, 如下代码是示意,非真实代码):
有的人可能注意到了,创建对象的时候没有传入“晨会动作”这个列,是因为“晨会动 作”是一个所有数据都有的标准动作,没必要再重复为每个对象创建“标准晨会动作”。
【注意】:1. 本节课中的代码仅是“示意型”,你可以再文档笔记中写,没有必要再开发环境中 写并运行。2. 看完本节,如果还有点糊涂,没有关系,本节仅是你的“初恋对象”。本节仅仅是 为了方便大家入门,更快的了解面向对象。从第二节才是真正开始“面向对象”,真正为了 “结婚”、为了“开发”的“真对象”。
2 面向过程和面向对象思想
2.1 面向过程和面向对象的区别
面向过程和面向对象都是对软件分析、设计和开发的一种思想,它指导着人们以不同的 方式去分析、设计和开发软件。早期先有面向过程思想,随着软件规模的扩大,问题复杂性 的提高,面向过程的弊端越来越明显的显示出来,出现了面向对象思想并成为目前主流的方 式。两者都贯穿于软件分析、设计和开发各个阶段,对应面向对象就分别称为面向对象分析 (OOA)、面向对象设计(OOD)和面向对象编程(OOP)。C 语言是一种典型的面向过 程语言,Java 是一种典型的面向对象语言。
面向过程思想思考问题时,我们首先思考“怎么按步骤实现?”并将步骤对应成方法, 一步一步,最终完成。 这个适合简单任务,不需要过多协作的情况下。比如,如何开车? 我们很容易就列出实现步骤:
面向过程适合简单、不需要协作的事务,重点关注如何执行。
但是当我们思考比较复杂的设计任务时,比如“如何造车?”,就会发现列出 1234 这 样的步骤,是不可能的。那是因为,造车太复杂,需要很多协作才能完成。此时面向对象思 想就应运而生了。
面向对象(Oriented-Object)思想更契合人的思维模式。我们首先思考的是“怎么设计 这个事物?” 比如思考造车,我们就会先思考“车怎么设计?”,而不是“怎么按步骤造 车的问题”。这就是思维方式的转变。
比如,我们用面向对象思想思考“如何设计车”:
天然的,我们就会从“车由什么组成”开始思考。发现,车由如下对象组成:
为了便于协作,我们找轮胎厂完成制造轮胎的步骤,发动机厂完成制造发动机的步骤; 这样,发现大家可以同时进行车的制造,最终进行组装,大大提高了效率。但是,具体到轮 胎厂的一个流水线操作,仍然是有步骤的,还是离不开执行者、离不开面向过程思维!
因此,面向对象可以帮助我们从宏观上把握、从整体上分析整个系统。 但是,具体到 实现部分的微观操作(就是一个个方法),仍然需要面向过程的思路去处理。
我们千万不要把面向过程和面向对象对立起来。他们是相辅相成的。面向对象离不开面向过程!
·面向对象和面向过程思想的总结
- 都是解决问题的思维方式,都是代码组织的方式。
- 面向过程是一种“执行者思维”,解决简单问题可以使用面向过程。
- 面向对象是一种“设计者思维”,解决复杂、需要协作的问题可以使用面向对象。
- 面向对象离不开面向过程:
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 整体事件设计![](/assets/blank.gif)
2.4.4 对象的进化史(数据管理和企业管理共通之处)
本节课从另一个角度出发,帮助大家理解对象。从数据管理的角度出发,看待对象是如 何诞生的。
事物的发展总是遵循“量变引起质变”的哲学原则;企业管理和数据管理、甚至社会管 理也有很多共通的地方。本节课类比企业管理的发展,让大家更容易理解为什么会产生“对 象”这个概念。
·数据无管理时代
最初的计算机语言只有基本变量(类似我们学习的基本数据类型),用来保存数据。那时 候面对的数据非常简单,只需要几个变量即可搞定;这个时候不涉及“数据管理”的问题。 同理,就像在企业最初发展阶段只有几个人,不涉及管理问题,大家闷头做事就 OK 了。
数组管理和企业部门制
企业发展中,员工多了怎么办?我们很自然的想法就是归类,将类型一致的人放到一起; 企业中,会将都做销售工作的放到销售部管理;会将研发软件的放到开发部管理。同理在编 程中,变量多了,我们很容易的想法就是“将同类型数据放到一起”, 于是就形成了“数 组”的概念,单词对应“array”。 这种“归类”的思想,便于管理数据、管理人。
·对象和企业项目制
企业继续发展,面对的场景更加复杂。一个项目可能需要经常协同多个部门才能完成工 作;一个项目从谈判接触可能需要销售部介入;谈判完成后,需求调研开始,研发部和销售 部一起介入;开发阶段需要开发部和测试部互相配合敏捷开发,同时整个过程财务部也需要 跟进。在企业中,为了便于协作和管理,很自然就兴起了“项目制”,以项目组的形式组织, 一个项目组可能包含各种类型的人员。 一个完整的项目组,麻雀虽小五脏俱全,就是个创 业公司甚至小型公司的编制,包含行政后勤人员、财务核算人员、开发人员、售前人员、售 后人员、测试人员、设计人员等等。事实上,华为、腾讯、阿里巴巴等大型公司内部都是采 用这种“项目制”的方式进行管理。
同理,计算机编程继续发展,各种类型的变量更加多了,而且对数据的操作(指的就是 方法,方法可以看做是对数据操作的管理)也复杂了,怎么办?
为了便于协作和管理,我们“将相关数据和相关方法封装到一个独立的实体”,于是“对 象”产生了。 比如,我们的一个学生对象: 有属性(静态特征):年龄:18,姓名:高淇,学号:1234 也可以有方法(动态行为):学习,吃饭,考试 请大家举一反三,根据上表理解一下企业的进化史,会发现大道至简。原来,数据管理、 企业管理、社会发展也是有很多共通的地方。“量变引起质变,不同的数量级必然采用不同 的管理模式”。
总结
1.对象说白了也是一种数据结构(对数据的管理模式),将数据和数据的行为放到了一起。
2.在内存上,对象就是一个内存块,存放了相关的数据集合!
3.对象的本质就一种数据的组织方式
3 对象和类的详解
3.1 类和对象的概念
我们人认识世界,其实就是面向对象的(此对象可不是男女谈对象的彼对象呀) 。比 如现在让大家认识一下“天使”这个新事物,天使大家没见过吧,怎么样认识呢?最好的办 法就是,给你们面前摆 4 个天使,带翅膀的美女,让大家看,看完以后,即使我不说,大 家下一次是不是就都认识天使了。
但是,看完 10 个天使后,我们总要总结一下,什么样的东东才算天使?天使是无数的, 总有没见过的!所以必须总结抽象,便于认识未知事物!总结的过程就是抽象的过程。小时 候,我们学自然数时怎么定义的?像 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相关推荐
- java基础面向对象_Java基础面向对象
一.面向过程的思想和面向对象的思想 面向对象和面向过程的思想有着本质上的区别,作为面向对象的思维来说,当你拿到一个问题时,你分析这个问题不再是第一步先做什么,第二步再做什么,这是面向过程的思维,你应该 ...
- Java基础-面向对象第二特征之继承(Inheritance)
Java基础-面向对象第二特征之继承(Inheritance) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.继承的概述 在现实生活中,继承一般指的是子女继承父辈的财产.在程序 ...
- 从C++到Java --理解面向对象是关键所在
从C++到Java --理解面向对象是关键所在 本文将提供一个对这些概念的简明的解释,而不是提供一些深入的或者如何使用的问题.记住,这只是依据我对Java的经验带而提出的一些主要的差异. Java在虚 ...
- Java 基础 - 面向对象(不错N多教程集合)
著作权归https://pdai.tech所有. 链接:Java 基础 - 面向对象 | Java 全栈知识体系 本文主要介绍Java OOP 面向对象基础和相关类图.@pdai Java 基础 - ...
- 第一部分 Java:面向对象理解
Java:面向对象理解.集合.IO.NIO.并发.反射源码分析 一.面向对象 1.创建对象的5种方式 (1)使用new关键字(2)使用Class类的newInstance方法(3)使用构造函数类的ne ...
- 学习Java编程面向对象的五大基本原则
Java 是面向对象的高级编程语言,类和对象是 Java 程序的构成核心.围绕着 Java 类和 Java 对象,有三大基本特性:封装是 Java 类的编写规范.继承是类与类之间联系的一种形式.而多态 ...
- java 168转换成861_java实验-java语言面向对象编程基础
java实验-java语言面向对象编程基础 (12页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 8.90 积分 广州大学学生实验报告广州大学学生实验报告 ...
- JAVA 的面向对象设计的特点-书后感-01-21天学通JAVA-深入分析
JAVA 作为面向对象的一种语言究竟有哪些特点.本文尝试列举最基本的一些:从<21天学通JAVA>中摘来一些概念,并且做了一定的深挖理解. 本章尝试重编译顺序角度理解JAVA继承的覆盖,重 ...
- java c 面向对象比较教程_c语言初学指针,对于java面向对象的初理解
最近在看关于c语言的指针,学习下,发现指针原来运用理解成其实可以抽象出我们java的面向对象封装,地址--> 对象或变量,先看一段代码: public class Cat { public St ...
- 【Java】面向对象是什么
自从开始接触java,就有人告诉我说,java是面向对象的编程语言.最多就是new一个对象,但是并不知道对象是什么.我以为对象就是一个class类,没有什么特别的.但开始找工作的时候,面试的人问了一个 ...
最新文章
- 捍卫者usb管理控制系统_捍卫超模块化JavaScript
- Flume的安装与配置
- prototype中顶层元素的测试
- 聚类算法(2):系统聚类/层次聚类算法
- 服务器系统2012怎么多人连接,windows2012服务器TCP连接数
- Leetcode#206Reverse Linked List
- HTML5 API详解(6):getUserMedia实现拍照功能
- 双极结型三极管及放大电路基础
- wpsppt流程图联系效果_| JEAM | 文章精选:大城市收取交通拥堵费的影响与效果
- python中turtle画圆填充颜色_Python之turtle绘图
- idea中maven下载依赖包出错
- mysql将日期转换年份_mysql将日期转换为当前年份的相同日期
- linux的php探针使用,php探针在Linux下的安装过程
- UTD2202C示波器如何显示峰峰值
- Flutter | Sliver 系列
- 数据库查询时报IllegalArgumentException异常是什么原因?
- linux和windows认证sssd,linux – 使用sssd和Active Directory集成的麻烦
- 用大家的力量来总结一个目录(众人拾柴火焰高)
- HBaseCon亚洲2018峰会盛大开幕 阿里带你洞悉HBase大数据生态最新发展和行业实践...
- bmp文件数字水印c语言代码,图像数字水印+matlab程序文件.doc