前段时间在抽工作之空余,更加系统和深入的重新学习Java的一些技术知识。
最近也试着申请了一个专栏,对前段时间的一些收获和知识点做一个系统性的归纳回顾和总结。
昨天也是刚刚写完了关于Java中的各种基础语言要素的总结,总觉得少了点什么。
对基础语言要素的理解和使用,实际上是很重要的。
俗话说,一切伟大的行动和思想,都源于一个微不足道的开始。
而对于一门语言来说,熟练的掌握对其基础语言要素的理解和使用,就是这个“微不足道的开始”
可以这样说,一门语言的基础语言要素,就等同于是一门武功的内功。
将自己的“内功”练到炉火纯青,剩下的,就只是招式(外功)而已了。
我在网上看到别人这样解释内功与外功的区别,觉得用于表达我想说的话,十分契合:
内功就像子弹,外功就像枪。
每个人都会有子弹和枪,但问题是多少和优劣。
内功越强,子弹越多;外功越强,枪就越好。
其两者之间的关系就是,内功是基础,决定外功建筑。
对应于Java当中来说则是:
基础语言要素是根基;而我们所做的所谓的“编程”工作,实际就是通过根基创造使用招式而已。
回想最初学习Java时,一直没能对这些基础语言要素有足够的重视,
也没能对其有一个很系统性的分类归纳的理解,导致总觉得思路有点杂乱。
时常在想,怎么样可以对这些语言要素的概念和使用方式,有一个更形象的理解。
后来在渐渐深入的过程中,发现:
“编程”工作与我们在学生时代都经历的“作文”工作实际上是很相似的。
举例来说:
请以《站在……的门口》为题写一篇文章。 要求:1.立意自定。 2.文体不限。可以记叙经历,抒发感情,发表议论,展开想象,等等。 3.不少于800字
这是什么?这是一个作文题目。
而:
有一个100万长度的数组,其中有两个数是重复的, 请使用Java语言写一个最快的算法,查找到重复的数。
这又是什么?这是一道程序题目。
所以我们不难发现,所谓的“作文题目”与“程序题目”。
归纳来讲:实际上也就是一种“实现需求”罢了。
对于二种不同的需求,我们所做的工作实际上都是“编写文章”!不同的是,
- 对于“作文题目”,我们使用的语言是:中文;对于“程序题目”,我们使用的语言是:Java;
- 对于用中文书写的文章,我们通常称为“一篇作文”;对于用Java语言书写的文章,我们通常称为“一个Java类”。
一篇作文的构成可能通常包括:
- 标题:用于对整篇作文所讲的内容做一个最精短的概括。例如每个人小时候可能都用过的作文题目《我的父亲》,目的就是让阅读的人看见就题目就知道这篇作文是描写关于你父亲的事迹的。
- 人、物、地点:一篇文章自然会涉及到相关的人,物和事情发生的地点。例如《我的父亲》一文里,通常都有一个经典情节:记得小时候,夜里发高烧下着大雨,也打不到车了。父亲毅然决然的冒着大雨背着我跑到了医院..云云。那么这里涉及到的人就是:“我”和“父亲”;涉及到的物可能包括:雨伞,雨衣等;涉及到的地点可能包括:“家”,医院等.
- 故事情节(段落):故事情节可能是一篇作文所占比重最大的部分。而同样以《我的父亲》为言,通常我们会根据多个事例来表现父亲对自己的好,而每个事例就会分别对应于一个故事情节。而我们就会通过分段来分别描述这些故事情节,而故事情节里涉及到的就是所谓的“人、物、地点”。
同理的,一个Java类的构成通常包括:
- 类的声明:Java类的类名与作文的“标题”作用实际是一样的。就是用于描述你封装的该类提供的功能。
- 变量/常量:变量与常量实际上就是作文中的“人,物和地点”。
- 方法(函数):方法用于描述我们要提供的程序功能,就如同段落用于描述故事情节一样。而段落涉及“人、物、地点”,方法里使用定义的变量/常量。
我们将上面举例说到的《我的父亲》转换为一个Java类的体现形式,可能能让我们更形象的进行理解:
/* * 作文《我的父亲》用Java类体现 */ public class MyDad /* 类声明::作文标题 */{ // 变量(常量)用于记录作文中的人、物、地点 // 人物: private static final String ME = "我"; private static final String MY_DAD = "我的父亲"; // 物: private static final String RAINCOAT = "雨衣"; // 地点: private static final String MY_HOME = "我家"; private static final String HOSPITAL = "医院"; //函数 ::段落 private static void see_a_patient(){ StringBuilder sb = new StringBuilder(); sb.append("记得小时候,有一次"); sb.append(ME);//使用变量 sb.append("发高烧!窗外下着大雨,也打不到车。万分紧急之下,"); sb.append(MY_DAD); sb.append("赶紧拿出一件"); sb.append(RAINCOAT); sb.append("为我披上,背上我,冒着大雨把我从"); sb.append(MY_HOME); sb.append("送到了"); sb.append(HOSPITAL); System.out.println(sb.toString()); } public static void main(String[] args) { see_a_patient(); } }
该程序运行的输出信息为:
记得小时候,有一次我发高烧!窗外下着大雨,也打不到车。万分紧急之下,我的父亲赶紧拿出一件雨衣为我披上,背上我,冒着大雨把我从我家送到了医院
请看了,我们不正是用Java语言写了一篇“作文”吗?
到此,我们通过以熟悉的“作文”为切入点,了解了一个Java类的构成结构。
由此我们知道了:一个Java类的构成实际并不复杂,它的结构通常就是类声明、变量(常量)以及方法(函数)。
而所谓的一个“复杂的类”就如同“一篇几万字的文章”的原理一样,无非就是:
1、涉及到的人、物更多 = 定义的变量\常量更多
2、段落更多/描述的故事情节更多 = 定义的方法(函数更多)
而对应的,以长篇小说为例。如果一篇文章的故事的字数已经达到了一定范围,那么可能就会影响阅读性。这个时候,我们就可以进一步的对其进行“分解”。
例如一本自传体的长篇小说,一个人一生中可以描述的情节有很多,那么它可能被搭建成如下结构:
有十篇用于描述其青年时期事迹的故事,我们将其提取出来放在一起,形成小说的第一篇:《我的青年时期》
有十篇用于描述其中年时期事迹的故事,我们也将其提取出来,作为小说的第二篇:《我的中年时期》..
从而以此类推。最终这个结构的总和被我们称作“小说”。
Java中,也是一样的。如果多个类综合完成同一方面的功能实现,
那么我们也可以将这些类提取出来,形成一个“篇章”,Java中的包结构就是这个“篇章”。
而最终由多个包结构组合起来的整个程序,就是所谓的一个完整的Java项目。
再壮观的高楼大厦,究其根本也不过就是由众多数量的钢精水泥搭建起来的。
而建筑师能做的就是通过设计手段(招式)让大楼的结构更加稳固,美观和实用。
我们谈到,之所以对一篇长篇小说进行这样的结构搭建。是因为当文章字数达到一定量的时候,就会影响阅读性,其主题也会模糊。
所以在Java中也是同样的道理,这一定程度上也是“代码重构”的初衷之一。类应该具有足够的功能特性化。
前面我们说到的是程序的结构,但同时我更想重点谈到的是Java的基础语言要素的使用。
但是在了解了程序的结构之后,我们相对就更容易了解基础语言要素的意义了。
同样以作文为例,了解作文结构是必要的。但我们还应该做的,就是以结构为切入点,
继续深入看一篇作文的基础要素与基础成分,也就是是:标点符号,词语,语句之类的东西。
因为即使你对于作文结构的研究再深,如果不会使用文字,不会使用标点,不会书写语句,那一切都是空谈。
同理,假设我们要搭建一所房屋。需要了解房屋的结构构成要有卧室,厨房,浴室,客厅。
但仅仅是了解这样的结构,也许足够成为一名在纸上画房屋结构设计图的设计师;但还不足以让你真的搭建出一所房子。
要成功的搭建出房子,还需要了解房屋的构建成分也就是材料,如同水泥,钢筋,一些建材等等。
那么对应到Java中来说,其实也是一样的道理。
而Java为我们提供的材料(基础语言要素),包括:
标示符、关键字、注释、常量(变量)、运算符、表达式以及程序语句。
到了这里我们再对前面说到的“类声明、变量、方法”的Java类的结构构成,进行成分分析:
类声明 = 访问修饰符关键字 + 类声明关键字 + 类名标示符。
变量(常量) 的声明 = 访问修饰符关键字 + 数据类型(基本数据类型或对象数据类型) + 赋值运算符 + 变量或常量的值
方法的声明 = 访问修饰符关键字 + 类/变量/方法修饰符关键字 + 返回类型关键字 + 方法名标示符 + 方法参数列表(局部变量)
而方法的内容通常就是通过对:运算符、表达式、程序语句(简单语句和复合语句)组成“招式”,完成对数据(变量等)的操作。
//类声明 public/* 访问修饰符关键字 */class /* 类声明关键字 */JavaArticlescrap /* 类名标示符 */{ private/* 访问修饰符关键字 */int /* 数据类型 */num_1 /* 变量标示符 */= /* 赋值运算符 */10; private int num_2 = 20; public/* 访问修饰符关键字 */static/* 静态修饰符关键字 */int /* 方法返回类型 */getSum /* 方法名标示符 */( int a, int b)/* 参数列表(局部变量) */{ int sum = a + b; // 运算符、表达式、语句等等方法内容 return sum; } }
由此我们简单的总结一下,一个Java程序的编写工作,实际通常就是:
根据“需求”,通过对Java基础语言要素(示符、关键字、注释、常量(变量)、运算符、表达式以及程序语句)的使用,组成“招式”。
写一篇结构为:题目(类声明) + 人、物、地点(变量/常量声明) + 段落(方法/函数)的“作文”。