今天内容更新:
============================
大纲下载地址上传了,为方便大家学习可以去下载额:
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文档额:
总结今天讲的内容如下了:
本文暂时没有评论,来添加一个吧(●'◡'●)