夯实Java:从面向对象说起
作者:伯特
出处:github.com/ruicbAndroid/LoulanPlan
声明:本文出自伯特的《LoulanPlan》,转载务必注明作者及出处。
刚学习 Java 那会就接触了“面向对象”的概念,但当时并没有太多实战经验,所以对其的理解也仅限于概念。当工作两年后再回顾一下,有些概念能够落地了,遂记录一下,作为 LoulanPlan 的开篇。
1. 什么是面向对象
面向对象是一种程序设计的思想,而不是一种方法,亦或准则。其指导我们从现实世界中客观存在的事物出发,进行程序设计。
2. 什么是对象
Everything is Object,在 Java 语言的世界中,万事万物皆对象。上面提到“从现实世界中客观存在的事物出发”,这里客观存在的事物,我们称之为“对象”。
在程序中,对象是程序的基本构成单元,是客观存在的事物的体现。一个对象通常由一组属性和对这组属性进行操作的若干服务(方法)构成。
3. 面向对象与面向过程的出现
面对简单的软件程序,我们往往不需要考虑过多的设计,任何一个小的功能单元或模块,都可以按照一定的步骤去实现,这种 step by step 的方式即为面向过程。
随着程序的复杂性提升,我们无法按步骤去描述并实现编码,所以面向过程已无法适应。加之考虑到代码的可读及复用性等,便有了对象的概念,以及面向对象的编程思想。
当然,还有面向组件、面向服务等设计思想,不在此讨论。
4. 面向对象与面向过程的区别
要知道,二者并不是非此即彼,而是相辅相成的。
面向对象思想要求我们从宏观上进行程序设计,抽象出一个个“对象”。而面向过程,则在微观上对“对象”内部进行具体的实现。
可以看出,面向对象最终还是离不开面向过程。
举例来说,需要编程实现绘制圆形、三角形、矩形。
面向过程实现:
drawCircle... //一坨绘制相关的代码,下同
drawTriangle
drawRect
面向对象实现:
//抽象出画笔对象
class Painter {
drawCircle(){
//上述面向过程实现,下同
}
drawTriangle(){}
drawRect(){}
}
//面向对象,使用画笔绘制
1. painter.drawCircle() //此处只需要调用对象的方法,下同
1. painter.drawTriangle()
2. painter.drawRect()
5. 对象与类
前面介绍了对象以及面向对象,下面回到 Java 中聊聊类
的概念。
5.1 类
我们常说“物以类聚”,表达“ 同类的东西聚在一起”。其实 Java 中的类也可以这么去理解:“物”即客观存在的“对象”,同类物体的特征描述,即为“类”。
上面是我的个人理解,用术语概括就是:类是客观事物的抽象,或者说是对现实生活中事物的一种描述(属性和行为)。
例如前面定义的 Painter 类,是对客观事物画笔的抽象,包含了一些绘制的方法(行为)。
5.2 对象与类的关系
类进行实例化可生成对象,所以,类的具体表现或者实例就是对象,而对象的抽象或者总概括就是类。
6. 面向对象的三大特性
说到面向对象,就不得不说其三大特性:封装、继承和多态。
下面简单说说自己的理解吧,就不再贴相关示例了,网上有很多优秀的例子。
6.1 封装
封装是面向对象最基础的特性。在前面介绍对象时,提到“一个对象通常由一组属性和对这组属性进行操作的若干服务(方法)构成”,这里的构成体现的就是封装性。
封装,是指对外隐藏对象内部的属性和实现细节,只提供相应的接口和方法进行交互。一方面,外部只需专注于对象所提供的能力,而不用关心内部实现细节;另一方面,避免了外部随意修改或访问内部属性和方法,从而提升了程序的健壮性;同时,封装能提升代码的复用率。
6.2 继承
继承指一个对象从另一个对象中获得属性和方法的过程,继承者称为子类,被继承者称为父类。继承使得子类对象拥有父类对象的全部属性与方法(非私有)。
Key point:
- 子类也可以被其他类继承成为父类;
- 父类可以拥有多个子类,但一个子类只能有一个父类。这一点与现实中父亲与孩子的关系是一致的;
- Java 中任何类都是 java.lang.Object 的直接或间接子类;
- 子类不能继承父类中访问权限为 private 的成员变量和方法;
- 子类可以重写(override)父类的方法;
- 子类可以通过 super 关键字访问父类的成员变量、方法和构造器;
- final 声明的类或方法,不能被继承或重写;
6.3 多态
多态是在继承的基础上实现的,多态实现的三个必要条件:
- 继承
- 方法重写(override)
- 父类引用指向子类对象,例如:Human human = new Man(),这里 Man extends Human。
当使用多态方式调用方法时,会依据以下规则:
- 首先检查父类中是否有该方法,如果没有,则编译错误;
- 若子类重写了该方法,调用子类的重写方法;
- 若子类没有重写该方法,则调用父类的方法;
多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。
7. 总结
以上是本文的全部内容,希望能对你有所启发。内容说不上全面、无误,还望读者朋友补充、指正。
最后,感谢阅读。
原文地址:https://segmentfault.com/a/1190000017056719
夯实Java:从面向对象说起的更多相关文章
- 夯实Java基础系列1:Java面向对象三大特性(基础篇)
本系列文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 [https://github.com/h2pl/Java-Tutorial](https: ...
- 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...
- 夯实Java基础系列9:深入理解Class类和Object类
目录 Java中Class类及用法 Class类原理 如何获得一个Class类对象 使用Class类的对象来生成目标类的实例 Object类 类构造器public Object(); register ...
- 夯实Java基础系列13:深入理解Java中的泛型
目录 泛型概述 一个栗子 特性 泛型的使用方式 泛型类 泛型接口 泛型通配符 泛型方法 泛型方法的基本用法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型方法总结 泛型上下边界 泛型常见面试 ...
- Java工程师学习指南第1部分:夯实Java基础系列
点击关注上方"Java技术江湖",设为"置顶或星标",第一时间送达技术干货. 本文整理了微信公众号[Java技术江湖]发表和转载过的Java优质文章,想看到更多 ...
- 夯实Java基础系列目录
自进入大学以来,学习的编程语言从最初的C语言.C++,到后来的Java,. NET.而在学习编程语言的同时也逐渐决定了以后自己要学习的是哪一门语言(Java).到现在为止,学习Java语言也有很长一段 ...
- java的面向对象
Java是1995年诞生.前身oak,后来改名为java. 面向对象的编程思想:对象是万事万物. 对象是由两部分组成的:属性和方法 1:属性是对象的静态特性(名词) 2:方法是对象的动态特性(动词) ...
- (Java)《head first java》值得Java或面向对象基础的新手看。
看完这本书后本人收获良多. 内容对Java以及面向对象的入门者非常友好. 抽象的内容惯用图解的方法来剖析,通俗易懂 之前看C#入门经典的面向对象时,依然浓浓的一头雾水. (1)很不解为何实例化要写成A ...
- java学习面向对象之异常之一
一.异常的概述: 什么是异常?在我们编写java程序的时候,会出现一些问题,比如内存溢出啊或者数组索引超出最大索引啊,这些编程当中出现的这些个问题就是异常.但是异常也分为可以处理的和不可以处理的.比如 ...
- Java之面向对象相关问题集
面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解所有问题,而仅仅是选择当中的一部分,临时不用部分细节. 抽 ...
随机推荐
- bzoj 1566: [NOI2009]管道取珠【dp】
想不出来想不出来 仔细考虑平方的含义,我们可以把它想成两个人同时操作,最后得到相同序列的情况 然后就比较简单了,设f[t][i][j]为放了t个珠子,A的上方管道到了第i颗珠子,B的上方管道到了第j颗 ...
- bzoj 1060: [ZJOI2007]时态同步【树形dp】
可能算不上dp,大概是个树形模拟 先一遍dfs算出f[u]为每个点最深的叶子到u的距离,然后再dfs一下,ans加上f[u]-f[e[i].to]-e[i].va,f[u]-f[e[i].to]是这条 ...
- CF1045G AI robots(动态开点线段树)
题意 火星上有$N$个机器人排成一行,第$i$个机器人的位置为$x_{i}$,视野为$r_{i}$,智商为$q_{i}$.我们认为第$i$个机器人可以看到的位置是$[x_{i}-r_{i},x_{i} ...
- MySql | 常用操作总结
创建数据库: CREATE DATABASE 数据库名; 删除数据库名: drop database <数据库名>; 选择数据库: use 数据库名; 创建数据表: CREATE TABL ...
- tcp聊天交互
#****setver端 import socket sk = socket.socket() adress = ('127.0.0.1', 8032) sk.bind(adress) sk.list ...
- codeforces 615 B. Longtail Hedgehog (DFS + 剪枝)
题目链接: codeforces 615 B. Longtail Hedgehog (DFS + 剪枝) 题目描述: 给定n个点m条无向边的图,设一条节点递增的链末尾节点为u,链上点的个数为P,则该链 ...
- Hdu 5452 Minimum Cut (2015 ACM/ICPC Asia Regional Shenyang Online) dfs + LCA
题目链接: Hdu 5452 Minimum Cut 题目描述: 有一棵生成树,有n个点,给出m-n+1条边,截断一条生成树上的边后,再截断至少多少条边才能使图不连通, 问截断总边数? 解题思路: 因 ...
- Plugging an Unplugged Pluggable Database
1.unplug To unplug a PDB, you first close it and then generate an XML manifest file. The XML file co ...
- Java编译时根据调用该方法的类或对象所属的类决定
class Base{ int x = 1; static int y = 2; } class Subclass extends Base{ int x = 4; i ...
- 管道命令和xargs的区别(经典解释) 自己的总结
1. 简介 之所以能用到这个命令,关键是由于很多命令不支 持|管道来传递参数,而日常工作中有有这个必要, 所以就有了xargs命令,例如:find /sbin -perm +700 |ls -l 这个 ...