Java中的方法好似c/c++/python中的函数:
方法是一种语法结构,它可以把一段代码封装成一个特定功能,减少代码重复,提高开发效率。使得代码逻辑更加清晰、更牛逼!
方法格式:
标志符(public static) 方法返回类型 方法名(形式参数【注意这种格式 int a】)
实现方法的代码
...
}
如写一个两数求和函数:
使用方法的好处?
修饰符 返回值类型 方法名(参数列表){
方法体代码(需要执行的功能代码)
return返回值;
}
方法的调用格式:
方法名(实参列表);
方法的修饰符:暂时使用public static修饰
方法申明了具体的返回值类型,内部必须使用return 返回需要返回的数据 对应的返回值类型
形参列表可以是多个,亦可以没有 形参之间使用,隔开 不能像Python一样关键字传参 仅位置参数
例如:无返回值无参数类型的方法
如果方法不需要返回值,不需要接收参数,怎么办?
方法不需要返回结果则申明返回类型为void;方法不需要传参数则直接不写形参()
方法没有设置返回值 方法体里面是不能写return语句的!
方法常见的问题:
- 方法的编写顺序无所谓
- 方法与方法之间是平级关,不能使用嵌套定义。
- 方法的返回值为void时,方法体内不能使用return语句不然会报错;如果写了返回值类型 return的数据类型必须要和起初定义的返回值类型一致。
- return语句执行后直接退出这个函数,其下面的语句不会执行,属于无效代码。
- 方法不调用,定义函数里的代码就不会执行,调用时必须复合规则 如:实参个数与形参个数对等
- 有返回值的方法调用时可以定义变量接收结果,或者直接输出调用,甚至直接调用无返回值只能调用 不需要使用变量接收。
方法定义的技巧:
复习一边地定义方法的格式:
修饰符 返回值类型 方法名(形参列表){
方法体语句
返回值
}
例如:
public static int add(int a,int b){
return a+b;
}
返回值类型+方法名+形参列表
修饰符:public static(暂时固定)
方法名:见名知义 有意义 驼峰模式 英文模式 复合标识符命名规则
方法体代码:具体功能具体实现
真正需要关注的两点:
练习:输入一个n,计算出1~n的和
练习:判断一个数是基数还是偶数;返回某数是否(奇偶)
想想能不能简化代码呢?之前学了一个三元运算符 可以替代if else(双分支语句)
数组求最值的方法:类似于选择排序
定义一个数组 假设第一个数是最大的 然后和他后面的数进行比较,每次交换得到最大的数。
也可直接赋值,更新:
利用选择排序降序得到最大值:
回忆一下之前说过的几个区(内存被分为五个区:栈、堆、方法区、接口...):
栈:里面一般放局部变量 函数 main函数(主体函数) 执行特点:先进后出
堆:new 对象 例如 int[] arr={1,2,3}; {1,2,3}就先存在堆区 数组地址在栈区 通过指向方法。
方法的内存运行机制:
简单口述一下执行流程:
栈区有:main、study 、eat、Sleep
首先执行main函数 然后直接来到study()函数内 又先开始执行eat() 执行完成后eat()退出栈区;
继续执行study()里的打印学习 然后执行Sleep() 执行完毕后退出栈区==study退出栈区==main函数也退出栈区,代码结束完毕。
So:方法的运行区在哪里?
栈内存里。
Java的参数传递机制:值传递!!!
- 在传输实参给方法的时候,并不是传输的变量本身,而是传输实参变量中存储的值,这就是值传递。
- 实参:调用函数是传入的值
- 形参: 定义函数是的值 参数
针对不同的数据类型(基本数据类型/引用数据类型),若改变形参的值,有不同的结果:
例如:
又如数组:
小结:同样是值传递,改变值,基本类型(形参的改变不会作用于实参的改变,方法里的形参执行完毕 就会销毁 整个方法也会销毁 内存会释放空间)不会变化;引用类型会发生值的变化。
java不像c语言一样,有指针的知识(指针==地址) c语言分为传值调用 传址调用。java是类似的,传入基本数据类型是传的值 引用数据类型是传的地址。
练习:打印任何数据的内容:
打印格式:[1,2,3]
补充一个二分查找:
申明:二分查找针对顺序数组进行元素查找(如果是无序的数组,也可以通过排序方法先排好,在进行二分查找); 二分查找的效率很高,每查找一次减少一半的规模 时间复杂度:O(logn)
练习:比较两个数组是否一样
如果说比较内容的话我们就可以利用排序来比较,这里要比较完全相同就需要遍历一个一个判断。
有时候我们编程的时候可以考虑逆向思维,更加简单,思路更加灵活。
方法重载:
特点:
实现功能类似,方法名一样,参数列表不同,方法重载可以提高代码的复用性。
同一个类里,多个方法相同,形参列表不同,区分大小写。参数的类型数量顺序,与参数名无关。
方法重载的好处:
对于相同的功能业务场景,可读性好,方同提法名相似是统一类型的功能,通过不同实现的功能差异化的选择,这是一种专业的代码设计。
简化方法:
return关键字的独用:
直接结束方法运行,后面的代码不会再执行到了,有一种拦截的作用。该方法可以单独使用在任何方法
使用格式:
return;
例如:执行除法(要求 除数不能为0)
案例训练:
结合之前学习的所有java基础知识,完成一个个案例。
涉及到的Java知识点:
- 变量、数组
- 运算符
- 程序流程控制if else if else switch 死循环 循环嵌套
- 跳出关键字:break、continue、return
- 方法
编程思维:
利用Java技术解决实际问题,代码就是解决问题的逻辑。
提高编程思维和编程能力:
写代码之前将问题细分,画出流程图;结合大量练习,勤于思考,熟能生巧。
前期:模仿 后期:内化+创新
不积跬步,无以至千里;不积小流,无以成江海。 学习在于重复,积累,坚持!!!
案例一:买飞机票:
- 机票价格按照淡季旺季、头等舱和经济舱、输入机票原价、月份、类型
- 按照如下规则计算机票的最终售价:旺季(5~10)经济舱:八五折 头等舱:九折 淡季(其他月份) 经济舱:六五折 头等舱:七折
- 键盘录入+流程控制语句的选择+描述规则+反回对应类型的数据
代码测试:
注意:
遇到判断区间匹配使用if语句;遇到值匹配使用switch语句。
案例二:找素数:
- 基于一道面试题,判断1001~200之间的素数 满足打印
- 素数:只能被1和本身整除的数
- 使用试除法
案例三:开发验证码
- 定义方法实现随机生成5位验证码,每位可能是英文大写、英文小写、数字
- 定义方法 返回验证码(String)方法参数是验证码的位数
- 方法内部使用for循环 随机生成验证码对应的类型(标志)再具体随机验证码
- 把生成的验证码结合起来即可
测试:
注意:确定密码的类型 知道类型的个数 利用随机数(利用ASCII码)强转类型 随机生成验证码。
"+"运算 能算就算 不能算就在一起 如:1+'a'==98 (int char) 最终结果为最大存储字节。
案例四:数组元组赋值:
- 例如: int[] arr={..}; int[] arr2=arr; 这种不算数组元素赋值 而是指向一个相同的数组对象(共用数组数据)
- 需求:把一个数组的所有元素赋值到另一个数里
- 遍历 赋值 输出两个数组的值验证
案例五:评委打分
需求:
- 打分区间【0~100】6个评委 每个人打分 选手最终的分数:去掉最高分,最低分 计算平均分
- 利用动太初始化数组
- 遍历 获得最高分 最低分 平均分
- 业务处理 返回结果
注意:类型的重要性 不管是变量 方法 数组 他们是一个体系的 需要什么类型的数据 ?
案例六:数据加密
- 定义一个数组 输入数据 进行加密(按一定的规则 例如:先+5 然后%10最后逆置数组)
- 打印加密的和解密的数据
- 加密,解密是双向的。
案例七:双色球开发系统
需求:随机生成一组中奖号码(六个红球、一个蓝球)
红球号码在1~33 中选择 不能重复 、蓝球号码在1~16中选择 依照对应球的个数进行发奖;
假设规则:
红球命中个数+蓝球命中个数 来确立。
5元(1+1)
10元(2+1/3+1/4+0)
200元(4+1/5+0)
3000元(5+1)
最高500w(6+0)
最高1000w(6+1)
主要有三个部分:首先、随机生成7个中奖号码 然后用户输入猜测这7个号码 最后系统判定。
主要要点:
录入数据到数组后,如何判断之前数据是否重复?利用无限循环+标志位巧妙解决;
统计红蓝球个数时的清晰头脑,什么时候记录,什么时候展示数据。
Java基础结束后,我下一篇文章将会介绍Java面向对象的基础知识。
谢谢大家的阅读,我会不断更新写出更好地文章!!!