JavaSE 拾遗(3)——JavaSE 面向对象程序设计语言基础(3)...函数


前面一篇文章 《JavaSE 拾遗(2)——JavaSE 面向对象程序设计语言基础(2) 》主要说了 java 应用程序的最底层组成元素——变量,下面接着说 java 应用程序的倒数第二层组成元素——函数。函数的组成元素包含 变量 语句 局部类。因为类是上一层元素,所以后面一篇文章再说。从函数构成角度看,函数分为函数签名和函数体。

和函数相关的有
  • 运算符
  • 表达式
  • 语句
  • 函数
(能做什么)函数,主要是用来表述现实世界中的行为的,计算机描述现实世界主要通过数据来描述现实世界的状态,那么现实世界的行为,在计算机里面主要是通过对数据的操作来描述,所以函数主要做的事情就是通过表达式对数据进行操作;数据操作在 java 里面用运算符来表示,运算符和变量就组成了数据操作的最小单元表达式;有分号的表达式就是语句,用来表述一个短小的操作结束;把多条完成某种功能的语句集合在一起就形成了函数,所以函数时语句的集合,是功能的最小单位,函数命名的时候一定要保持名称功能上的语义性,一般函数命名用动词开头。

运算符

对于变量基本操作有
  • 算术运算符
  • 比较运算符
  • 赋值运算符
  • 逻辑运算符
  • 位运算符
  • 类型判断

算术运算符

表述数学上的算术运算,只能对有数值含义的数据进行算术运算操作
+
-
*
/
%
++
--
字符串连接符 +

比较运算符

比较运算主要用来表述与数值意义相关的数据大小的比较
==  在数值上表示相等,在引用类型上表示同一个引用
!=
>、>=
<、<=
instanceof 判断是否是类的对象只能用于 reference 类型的判断

逻辑运算符

逻辑运算提供了对多个条件判断的组合关系的表达
&、&& ——逻辑与、简洁于
|、||——逻辑或、简洁或

^

位运算符

位运算是计算机底层的运算方式,保留位运算是为了提高某些数值运算的速度,比如乘以或者除以 系数为 0 、1  的 2 的幂级数都可以用移位运算来完成。移位运算符只能用于 整型 和 字符型 数据的运算,因为他们两种类型在内存中的存储形式相同。
现代编程理念认为,不要过早优化,不要过度优化,程序的效率的优化应该让编译器来做。
好的编程语言要易于表达人们的设计和思想,那么在未来高级编程语言里面,位运算符会不会消失!
<< 左移
>> 带符号右移
>>> 无符号右移
&
|
~
^
整数交换数据
int a = 10;
int b = 20;
a= a^b;
b = a^b; //a^b^b = a
a = a^b; //a^a^b = b; a^a =0; a^0=a;
左边a,b,a
右边a^b
关于位运算的便捷性可以看 这里

赋值运算符

给存储单元进行写数据
=
算术复合赋值运算符
+=
-=
*=
/=
%=
逻辑复合赋值运算符
&=
|=
^=
位运算复合赋值运算符
&=
|=
^=
<<=
>>=
>>>=
复合赋值运算符会自动完成右边的表达式的强制类型转换动作

类型判断运算符

instanceof 只能用于 reference 类型的判断

语句

语句主要用来表达程序执行的顺序,程序有三种执行顺序

  • 顺序
  • 分支
  • 循环

分支

判断分支

if...

if...esle...,简单的 if ... else... 可以用 运算符 ... ? ... : ... 替代,选择运算符只是 if...else... 的简写版,但是条件运算符不能加 ; 符号,单独形成表达式,必须使用表达式的值。

if... else if... else...,这个语句可以表达 如果。。。则。。。,否则 如果。。。则。。。,否则。。。 这种语义

选择分支
switch(表达式1)
{
	case 表达式2:
	case 。。。
	default:
	 。。。
}

1.表达式1 只能是 byte short int char 类型,不同 sdk 版本,这个有点不同,5.0 可以判断 enum 类型,7.0 可以判断 String 类型。
2.表达式2 只能是常量表达式,比如 1+1 这种,常量表达式是指表达式中不含变量的编译器就能确定表达式的值的表达式,赋值表达式比如 a = 1+1 也不行。
3.case 表达式的值不能重复。
switch 语句的好处是1.易于阅读,各个分支情况一目了然;2.JVM真对 switch 语句有专门的指令,和 if..else 相比较可以提高这种多分支的效率。

循环

while(循环条件表达式)
{
	循环体;
}
do...while
for(初始化表达式; 循环条件表达式; 循环后的操作表达式)
{
	循环体;
}
for(初始化表达式; 循环条件表达式;)
{
	循环体;
}

for 和 while 可以互换,和 while 相比较,for 循环语句的循环后操作表达式比较清晰,方便阅读。

break 和 continue,在嵌套循环中 break 和 continue 可以加标号来指定对哪一个循环起作用

函数

  • 函数是对对象功能或者某个行为进行描述
  • 函数还是抽取重复的代码,形成独立的功能块

函数是对对象功能或者某个行为进行描述,在面向对象或者面向过程中,自顶向下的编程方法是,要完成某些用例,先对这个用例当中使用到的功能抽象出名字,用名字先实现用例,再对用例中所有刚刚抽象名字的功能进行实现。

函数还是抽取重复的代码,形成独立的功能块,在自底向上的编程方法中,1.发现某段代码出现重复,为了提高代码的复用性对代码进行了抽取;2.将这部分定义成独立的功能,方便日后使用;java 中对功能的定义,就是通过函数来表达的。 对重复部分的抽取,既可以用函数来抽取也可以用接口和类来抽取,用接口和类来抽取,既可以横向抽取也可以纵向抽取。

自顶向上和自底向上两种编程方法在面向对象编程过程中都有使用,开始设计程序的时候一般使用自顶向下这种先抽象后具体的面向对象思想,在重构程序的时候,一般采用自底向上这种方法,提取公共部分,增加复用。


函数的定义

修饰符 返回值类型 函数名(形式参数列表)
{
	函数体
}
函数不能嵌套定义,也就是在函数体中不能定义函数,只能调用函数(自己调用自己就是函数递归,更详细资料可以看 这里)。因为函数之间都是平级关系,没有谁从属与谁。
函数名,从计算机底层实现来说是为了标志函数;从面相对象角度来说,函数名体现了函数的功能

函数定义的步骤
函数的定义需要,先抽象,后具体,先抽象是指先明确函数的功能确定函数的名字,在实现时才明确函数的其他部分
  1. 定义一个函数,需要先明确函数的功能,这样就能明确函数名
  2. 明确函数功能后,就明确函数运行结果了,也就明确返回值和返回值类型
  3. 再明确,函数实现功能是否需要执行时才确定的参数参与

函数重载 overload

(是什么)同一个类中, 函数名相同,参数列表不同,返回值类型可同可不同,这就是函数重载
  1. 方法重载是让类以统一的方式处理不同类型数据的一种手段。多个同名函数同时存在,具有不同的参数个数/类型。重载 Overloading 是一个类中多态性的表现之一。
  2. Java 的方法重载,就是在类中可以创建多个方法,它们具有相同的名字,但具有不同的参数列表和不同的定义。调用方法时通过传递给它们的不同参数个数和参数类型来决定具体使用哪个方法, 这也是多态性。
  3. 重载的时候,方法名要一样,但是参数类型和个数不一样,返回值类型可以相同也可以不相同。无法以返回型别作为重载函数的区分标准。
(为什么)函数编译后的标识符是函数名和参数列表参数类型、返回值类型组合而成,就像
      14: invokevirtual #5                  // Method java/io/PrintStream.println:(I)V
因为函数调用的时候,很多时候只能确定函数名和函数的参数列表,而不能确定函数的返回值,所以重载只和函数名 参数列表有关系,如果只是返回值类型不同,那么编译报错,属于函数名重名错误。
(能做什么)java 是强类型语言(没有泛型的情况下),重载可以方便程序设计,对应功能相同,参数不同的函数,重载可以方便程序的设计和阅读,但是增加了程序的重复性,JDK1.5 有泛型机制,代替了重载时参数个数相同,参数类型不同功能,但没有取代参数格式(个数)不同的情况
设计模式的任务就是 剥离重复的东西,专业术语叫做 隔离变化。
可以在  这里 查看关于重载的陷阱

你可能感兴趣的:(JavaSE 拾遗(3)——JavaSE 面向对象程序设计语言基础(3)...函数)