A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© bluehat 中级黑马   /  2016-9-20 22:11  /  937 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

============================

大纲下载地址上传了,为方便大家学习可以去下载额:

https://yunpan.cn/cky6U4jKVk8vv 访问密码 6919 (注意是360云盘额)

============================

方法概述和定义:


方法(Method),有人称之为函数(function),表示一个功能.

定义:

程序中能完成独立功能,可重复使用的一段代码的集合;

作用:

解决了代码功能重复问题.

方法格式:

[修饰符] 返回值类型 方法名字([类型 变量1,类型变量2 ,....])

{

方法体

[return 值];

}

--------------------------------------

方法中术语:

修饰符: 方法的访问权限等,静态的(static).

返回值类型: 当方法操作完毕之后,可能会给调用者返回一个结果.如果没有返回值,此时我们把返回值类型声明为void.

如果方法定义了返回类型,则方法体必须使用return返回该类型的一个值.

如果方法使用void来表示返回值类型,此时在方法体中不需要使用return.

方法名字: 命名的使用符合标识符规范,使用一个动词或者动词短语表示,首字母小写,如:sendMsg(发生信息),register(注册)

形式参数: 其实是多个变量,统称为形参,包括:参数个数,参数的类型,参数的顺序,此时参数的名字没有实质的意义.

方法签名: 方法签名 = 方法名字 + 形式参数;

在同一个类中,多个方法的签名不能相同.

推论:1)方法必须定义在类中,2)方法之间是兄弟关系(平行).

实际参数: 调用方法的时候,实际传递的参数值.

方法只有被调用才会执行!方法可以被重复调用!

如何设计方法:

1):如何确定方法的参数列表.

在完成该功能的时候,有哪些未知的元素参与,此时未知的元素就作为形式参数.

2):如何确定方法的返回值类型.

完成该功能之后是否需要给调用者返回一个结果.

如果不会返回结果,此时使用void声明.

若方法有返回,一般的,调用者都会去接收结果.

实例:求两个整数之和:

1):未知的元素:两个加数分别是啥?

2):求和,最终运算之后,必须给调用者返回一个整数结果.

long getSum(int x,int y)

{

int ret = x + y;

return ret; //返回给调用者

}

调用者:

long ret = getSum(3,4);//实参

-------------------------------------------------

方法特点-执行流程

使用2个案例解释方法执行流程如下:

发短信:

登录:

方法重载设计:

在同一个类中,分别定义两个整数,小数之和的方法.

求两个整数之和:

static int getSum1(int x,int y){....}

求两个小数之和:

static double getSum2(double x,double y){....}

求一个整数和一个小数之和:

static double getSum3(int x,double y){....}

--------------------------------------------

如此设计,没有问题,但是调用者就很痛了,因为要去记忆getSum1表示整数之和,getSum2表示小数之和.....

分析问题:上述方法,都是求两个数之和,仅仅只是参数的类型不一样,带来了方法的名字也不一样.

解决方案:方法的重载.

方法重载(overload):

解决:同一种功能的多个方法,因为参数列表不同,带来方法名称不同的问题.

遵循的原则:

两同一不同:

两 同: 方法必须在同一个类中,并且方法的名字相同.

一不同: 方法各自的参数列表不同(参数类型,参数个数,参数顺序).

遵循了两同一不同原则的多个方法,之间就属于重载关系. 和返回类型没有关系.

-------------------------------------------------------------

System.out.println的println方法可以打印出任意的数据类型,甚至不传递参数.

断言:println方法存在重载设计.

看看你是否清楚重载的概念没有,实战一下吧:

在同一个类中:

void doWork(int a,char b,boolean c){}

下列方法哪些是上述doWork方法的重载方法。

a. void doWork(char b, int a, boolean c){}// YES

b. int doWork(boolean a,char c ,int b){}// YES

c. void doWork(int a,char b,double c){}// YES

d. void doWork(int x,char y,boolean z){}// NO

e. int doWork(int x,double y){} // YES

f. int doWork(int x, char y,boolean z){} // NO

方法递归操作:

读高中学数列的时候,我们见过斐波纳契数列,其通项公式为:

F(0)=0,F(1)=1,Fn=F(n-1) +F(n-2)(n>=3,n∈N*),

现在求F(5)的值,怎么做呢?

观察:这个数列从第三项开始,每一项都等于前两项之和。

要求F(5)的值,肯定要先求F(4)和F(3)的值,而求F(4)的值又需要求F(3)和F(2)的值... ...

解决办法1:

依次求出F(1)、F(2)、F(3)、F(4)值,再处理。

------------------------------------------

递归(recursion)操作:汉诺塔 递归操作得有出口,否则就是死循环.


---------------------------------------------------

引出数组和数组定义:

为什么使用数组:

问题1: int age = 17;

声明变量时,每一个单独的变量都要对应一个变量名,但现在要处理一组相同类型的数据时,如要表示班上100个人的年龄,绝对不希望定义100个变量来表示每个人的年龄,那怎么办呢?再看下列例子。

问题2:

求两个数之和,方法得有2个参数,求5个数之和,需要重载一个方法,方法有5个参数,求100个数之和、1000个数之和、10000个数之和,方法的参数列表会很长很长,而且方法得有很多个,而且还得去记住哪个方法是两个参数的,哪个方法是三个参数的。这样总感觉很不爽,仔细分析这个功能,其实就是求一组数值的和而已,这个方法并不在乎具体是多少个加数,它只在乎需要把哪些数加起来。

-----------------------------------------

什么是数组(array),容器:

所谓数组(一组数据),是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种数据形式。这些按一定顺序排列的同类型数据的集合称为数组。而数组中的每一个数据称之为数组元素(element),数组中的元素以索引(index)来表示其存放的位置,索引从0开始,步长是1,有点像Excel表格的行号,逐行递增。 好比宾馆的房间.

Java的引用数据类型(类/接口/数组):

--------------------------------------

变量的定义:

数据类型 变量名; 只能存储一个数据

int age;

数组的定义:

元素的类型[] 变量名; 可以存储一组数据

int[] ages; 此时:可以把int[]看做是一种数据类型,int的数组类型.

此时代表含义:ages数组中可以存放多个int类型的值/变量.

定义的另外一种方式:

元素的类型 变量名 [];

int ages[]; 非常不推荐

数组的初始化操作:开辟内存空间,存储数据.

数组必须先初始化才能使用.

当数组初始化之后,数组的长度就已经确定了,不能更改.

静态初始化:

程序员自己设置需要存储的数据(元素),而数组的长度由系统决定.

语法:

元素类型[] 数组名称 = new 元素类型[]{元素1,元素2,元素3,....};

如:

int[] nums = new int[]{1,3,5,7,9};

更简单的语法:

int[] nums = {1,3,5,7,9};

动态初始化:

程序员指定数组的长度,而数组的元素的默认值由系统决定.

语法:

元素类型[] 数组名称 = new 元素类型[length];

如:

int[] nums = new int[5];

如果事先知道需要存储哪些数据,---->使用静态初始化.

若事先不知道存储哪些数据--------->动态初始化.

注意:

不能同时使用静态和动态初始化.

int[] nums = new int[5]{1,3,5,7,9};

数组的基本操作:

数组的基本操作:

0):打印数组对象,会打印出数组的hashCode值,看不出来数组元素值.

1):获取/设置/遍历元素元素:

获取数组元素值: 数组元素类型 变量 = 数组名[index];

设置数组元素值: 数组名[index] = 值;

迭代数组元素: 使用循环,一般的,首选for循环.

2):数组的长度(使用length属性):

int len = 数组名.length;//获取当前数组有几个元素个数

3):数组的索引从0开始,逐一递增.

数组索引的范围:[0,数组长度-1]

4):操作数组常见异常(错误):

ArrayIndexOutOfBoundsException:数组的索引越界,不在索引范围之内.

NullPointerException:空引用异常,操作了一个为null的数组变量.

5):获取数组最大最小元素

求最大值: getMax

求最小值: getMin

6):打印数组元素:

期望:打印格式:[A, B, C, D, E]

7):逆序排列数组元素:

[A, B, C, D, E]--->[E, D, C, B, A]

8):元素出现索引(第一次/最后一次)

详细数组方法可以参考我们jdk API文档额:

总结今天讲的内容如下了:



1 个回复

正序浏览
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马