一:方法的概述:
1,定义:方法就是完成某个功能的代码
2,使用方法的目的
提高代码的复用性(由编写多次,变成编写一次,被多次调用)
提高了编码的效率
提高代码的安全性
二:方法定义语句:
1,语法定义:
修饰符 返回值类型 方法名称(形式参数……)方法抛出的异常类型{
方法体
return 返回值;
}
2,语法讲解:
修饰符:暂时记住 public static
返回值类型:
如果方法有返回值,返回值类型根据使用方法的需求定义;
如果方法没有返回值 void
方法名称:见名知意。见到方法名称,就明白这个方法完成什么功能了。
形式参数:是可能在方法体中使用到的具有具体意义的变量。
如果形式参数在方法体内被实际使用了,则形式参数就叫做实际参数。
在这里,形式参数是使用变量表示的,但是在编写时只需要数据类型和名称。
形式参数可以有多个,两两之间使用英文的逗号分开。
方法爆出异常类型:目前写方法不考虑(在后面的异常课程讲解)
方法体:就是完成功能的代码
return 返回值:
return代表方法执行结束,直接跳出方法;
如果在方法定义时,返回值类型是void;
那么在方法中可以不写return,或者可以有写return但是不要写返回值
返回值:返回值的数据类型必须符合方法定义中的返回值类型。
返回值在java语言中每个方法只能有一个返回值,
处理返回值的方法:
A;直接输出;
B,使用一个变量接收(注意:变量类型必须和返回值类型一致)
3,编写方法的步骤:
A,方法的代码一定要写在某个class内部;
B,一个class中,所有的方法都是同级别的
4,方法二要素:
形式参数
返回值
三:方法调用
A,方法光定义,不调用;则方法体的代码是不会执行的。
B,方法定义后,一定是在另一个方法内被调用(递归除外)。
C,调用语法:
方法名称(参数值……)。
参数值的个数必须和方法定义时形式参数的个数一样。
参数值每个对应位置的形式参数和参数值必须数据类型一致。
D,方法结果的显示
如果是在调用方法后,显示结果,则这个方法必须有返回值。
eg:
class MethodDemo{
public static void main(String[] args){
//add方法只能在main方法内部调用;
//add(2,3);
System.out.println(add(2,3));
}
public static int add(int x1,int x2){
return x1+x2;
}
}
方法的执行过程文字描述:
JVM执行到add(2,3)会自动认知是一个方法调用,
就开始从代码上下文中找到add方法的定义。
使用参数值为方法定义的形式参数赋值,
执行方法体的语句,
使用return5把数值5返回(从什么地方调用就返回到哪里)
那么输出语句就变成System.out.println(5);
五,方法使用练习题01
class MethodDemo2{
public static void main(String[] args){
//请使用方法(返回值),输出任意两个正数最大值
System.out.println(compare(3,5));
}
//方法二要素:
//形式参数: 2 int
//返回值: int
public static int compare(int a,int b){
if(a>=b){
//a比b大,所以返回a
return a;
}else{
//a比b小,所以返回b
return b;
}
}
}
方法使用练习题02
class MethodDemo3{
public static void main(String[] args){
/*
编写一个方法,返回任意两个数的乘积
要求在main方法中接收这个乘积,在输出
因为chengJi方法只有一个返回值,是double类型的,
所以接收这个值也是必须使用double类型变量去接收
*/
double cj=chengJi(1.2*1.5);
//如果方法有返回值,就可以调用它的方法中使用变量去接收
//注意:接收变量的数据类型必须和方法的返回值类型一致。
System.out.println("cj="+cj);
}
//方法二要素:
//形式参数: 2 double
//返回值: double
public static double chengJi(double x1;double x2){
return x1*x2;
}
}
方法使用练习题03
方法没有返回值
class MethodDemo4{
public static void main(String[] args){
/*
需求:输入一个m*n的由*号组成的矩形
因为*号矩形是在方法体执行过程中使用输出语句完成
所以没法返回,即这个方法不用返回。
调用矩形的方法
*/
juXing(5,4);
}
public static void juXing(int n,int m){
for(int i=1;i<=n;i++){
for(int x=1;x<=m;x++){
System.out.print("*");
}
System.out.println();
}
}
}
方法使用练习题04
在返回值类型为coid 的方法中使用return关键字
class MethodDemo5{
public static void main(String[] args){
juXing(-1,6);
}
public static void juXing(int m , int n){
/*
在方法体的代码执行之前会方法的形式参数值根据业
务需求进行安全性校验,只有通过才会执行以下方法。
对于方法入口的校验,往往使用以下代码。
以下的if结构只是起到参数的正确性校验
*/
if((m<=0) || (n<=0)){
System.out.println("m或者n不符合矩形要求");
return;
}
//以下代码是方法的主功能
for(int i=1;x<=n;i++){
for(int x=1;x<=m;x++){
System.out.print("*");
}
System.out.println();
}
}
}
六,JVM常见内存分类
栈内存:
栈内存主要放置
局部变量
每个方法的每次执行都会在栈内存中开辟空间
存放数据特点:
栈内存是按照栈数据结构来存储数据的。
数据是有序的,先进后出,后进先出。
处理数据特点:
栈内存的数据只要使用完,就立即释放空间。
栈内存是属于栈结构
栈结构是属于数据结构
数据结构:就是说明数据和数据之间的排列关系。
常见的数据结构:
栈结构:
先进后出,先进后出
队形结构:
树形结构:
把数据放入栈内通常叫做进栈、入栈、压栈
把数据从栈内取出通常叫做出栈、弹栈
堆内存:
堆内存
放置new出来的所有事物(对象)
方法区
类的描述信息
静态信息
方法描述信息
常量池
七,方法执行过程的内存解析
class MethodDemo6{
public static void main(String[] a rags){
double cj=chengJi(1.2,1.5);
System.out.println("乘积是:"+cj);
}
public static double chengJi(double x1, double x2){
return 1.2*1.5;
}
}
注:X是表示内存释放。
栈内存执行完,方法开始被释放,main方法不调用也被释放。
执行结果:乘积是:1.7999999999999998
八,基本数据类型做方法参数内存解析
class MethodDemo7{
public static void main(String[] args){
int i=10;
System.out.println("1 i="+i);
chengeValue(i);
System.out.println("2 i="+i);
}
public static void chengeValue(int i){
i=20;
System.out.println("3 i="+i);
}
}
执行结果: 1 i=10
3 i=20
2 i=10
基本数据类型做方法参数内存解析02
class MethodDemo8{
public static void main(String[] args){
int i=10;
System.out.println("1 i="+i);
i=chengeValue(i);
System.out.println("2 i="+i);
}
public static int chengeValue(int i){
i=20;
System.out.println("3 i="+i);
return i;
}
}
执行结果:
1 i=10
3 i=20
2 i=20
九,方法重载
1,在一个class内部
2,方法名称全部相同的方法
3,判断方法重载的条件
A,方法两两之间参数个数不同
B,方法两两之间对应位置,位置的参数的数据类型不同
4,从方法定义角度说明重载
A:方法重载和修饰符没有关系
B:方法重载和返回值类型没有关系
C:方法重载和方法体没有关系
D:方法重载和抛出异常类型没有关系
E:方法重载和方法名称有关系,方法名称必须相同
F:方法重载和形式参数没有关系,一个是方法之间的形式参数个数不同;
或者,一个是方法之间对应位置的形式参数的数据类型不同。
5,如果判断一个类中的两个方法之间发生了方法重载?(重点)
必须是名称相同
必须是参数不同
参数个数不同
对应位置的参数的数据类型不同
6,使用方法重载的时机?
通常在工具类中使用
工具类:为做某件事提高服务
class MethodDemo9{
public static void main(String[] args){
add(2,3);
add(1.23,1.24);
}
//求两个整数的和
public static int add(int a,int b){
return a+b;
}
/*
已在类MethodDemo9中定义了方法add(int,int) 方法没有重载
static int add(int a,int b){
return a+b;
}
已在类MethodDemo9中定义了方法add(int,int) 方法没有重载
public static double add(int a,int b){
return 1.23;
}
已在类MethodDemo9中定义了方法add(int,int) 方法没有重载
public static int add(int a,int b){
return 10;
}
*/
//求三个整数的和
public static int add(int a,int b,int c){
return a+b+c;
}
//求两个小数的和
public static double add(double a,double b){
return a+b;
}
}
十,递归
1,定义:递归就是方法在方法体内部调用自己(方法调用自己)。
2,递归二要素:
A,递归必须有一个出口,如果没有出口就是死递归。
B,找出计算规律
eg:5!=5*4*3*2*1
3,使用递归的注意事项
通常在正常编程中不常用递归解题
使用递归会不停地在栈内存开辟空间,如果递归次数过多,会造成栈内存的内存溢出。
其次,如果内存不溢出,但是递归数值过大,可能会超出。
最终结果所使用的数据类型范围,造成了最终结果并不符合要求。
所以递归具有以上的注意事项,通常在编程中多数使用循环解题。
class DiGuiDemo{
public static void main(String[] args){
int x=DiGui(5);
System.out.println("x="+x);
}
public static int DiGui(int n){
if(n==1){
return n;
}else{
return n*DiGui(n-1);
}
}
}
十一,文档注释
1,作用:
文本注释除了有解释说明代码含义之外;
还可以借助java代码中的文本注释创建针对此代码的API文档。
Application(应用) Program(程序) Interface(接口) 程序如何使用说明书
2,语法:
/**
*
*/
其中的每行注释之前都有一个星号。
还会使用@特殊含义单词,来指明方法参数,返回值,或者异常类型……
@param 对方付的形式参数进行说明
@return 对返回值类型说明
@exception 对异常类型进行说明
再使用以下命令创建代码的API文档
javadoc -d 目录名称 -version -author NoteDemo01.java
javadoc:说明要根据文档注释创建帮助文档。
-d:为了指明要把创建的所有说明文档都放在一个文件夹下,便于管理。
目录名称:指明存放帮助文档的文件夹名称
-version:指明要在帮助文档中输出版本
-author:指明要在帮助文档输出作者
NothDemo01.java:待创建帮助文档的代码(即文档注释写在其内部)
/**
*以下的类是为了计算两数的和
*@version 1.0
*@author 小明
*/
public class NoteDemo01{
public static void main(String[] args){
}
/**
*这个方法是求两个整数的和
*@param a加法因子
*@param b加法因子
*return 和值
*/
public static void add(int a,int b){
return a+b;
}
/**
*这个方法是求两个小数的和
*@param a加法因子
*@param b加法因子
*return 和值
*/
public static double add(double a,double b){
return a+b;
}
}