Java中的方法 == C语言中的函数
如果一个代码需要重复使用(每一次调用的数据不同)
方法:调用/invoke
应该在java语言上有这样一种机制:
-
-某个功能代码只需要写一遍
-
-需要使用这个功能只需要给这个功能传递数据
-
这样代码就可以重复利用,提高代码复用率
方法的本质:
-
方法就是一段代码片段,并且可以重复使用满足某个特定功能
-
方法在C语言中叫做函数!!
方式定义在类体当中,一个类体中可以有多个类体,但是方法体当中不能定义方法。
//以下代码 包含两个方法 mian方法和 sumInt方法
public class MethodTest01 {
//类体
public static void main(String[] args) {
MethodTest01.sumInt(5, 6);
MethodTest01.sumInt(7, 10);
}
//计算两个整数的和
public static void sumInt(int a ,int b) {
int c = a + b;
System.out.println(a+"+"+b+"="+c);
}
}
1.方法怎么定义,语法结构:
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
-
修饰符列表:可选项不是必须; 目前统一写成:public static
-
返回值类型: 返回值类型可以是:String char double byte boolean long… int //规定这个方法结束返回整数类型,void //执行结束没有返回类型,返回值若不是void的时候,这个方法执行结束必须有一个具体的数值
-
方法名: 只要是合法的标识符就行 最好是一个动词
-
方法体:必须有大括号括起来,方法体中的代码有顺序
-
形参:局部变量 :int a ; double b; 形参可以是0-N个 多个形参之间用逗号隔开,方法在调用的时候,实际给这个方法传入的的数据称为“实参".
3.方法怎么调用?
方法只定义不调用是不会执行的,只有在调用时才会执行。
语法规则: (方法中有static时)
类名.方法名(实参列表);
//public:表示公开的
//class:表示定义类
//MethodTest02:是一个类名
public class MethodTest02 {
//类体
//类体之中不能直接写java语句,除声明变量之外
//方法出现在类体当中
//方法
//public:公开
//static:静态的
//void:表示执行结束之后不返回任何类型
//main:是方法名:主方法
//(String[] args):形式参数列表,其中String[]是一种引用数据类型,args是一个局部变量的变量名
//所以只有args这个局部的变量名是随意的
public static void main(String[] args) {
MethodTest02.sum(2,3);
}
public static void sum(int a,int b) {
System.out.println(a+b);
}
}
例1:
package bilili;
/*
* 方法的调用不一定在main方法中 可以在其他程序里,并且按顺序执行
*/
public class MethodTest03 {
public static void sum(int x,int y) {
System.out.println(x+"+"+y+"="+(x+y));
//调用doSome方法;
MethodTest03.doSome();
}
public static void main(String[] args) {
MethodTest03.sum(8, 2);
System.out.println("?????????????/");
}
public static void doSome() {
System.out.println("my name is ninininininin!!!");
}
}
例2:
package bilili;
/*
* 方法调用
*/
public class MethodTest04 {
public static void main(String[] args) {
m(); //对于方法修饰符当中有static关键字,类名可以省略不写
//N(); 调用其他类的不能直接省略,编译报错 在当前类中该方法报错
A.N();//
}
public static void m() {
System.out.println("llll1111111111");
}
}
class A{
public static void N() {
System.out.println("88888888888888");
MethodTest04.m();//顺序调用
}
}
例3:
package bilili;
/*
* 建议在一个源文件中只定义一个class
*
* 分析程序的输出结果
*
* eg:套娃代码!!!
*/
public class MethodTest05 {
public static void main(String[] args) {
m1();
}
public static void m1() {
System.out.println("11111111111111");
m2();
}
public static void m2() {
System.out.println("222222222222222222");
m3();
}
public static void m3() {
System.out.println("333333333333");
m4();
}
public static void m4() {
System.out.println("44444444444444");
}
}
例4:
package bilili;
/*
* 方法的返回值不是void
* 必须要有return
*
* 需求:定义一个方法 要求计算两个int类型的值
*/
public class MethodTest06 {
public static void main(String[] args) {
int m = devide(8,2); //接收这个返回值但是不会直接显示相出
System.out.println(m);
double j= devide(100,2); //小转大
System.out.println(j);
}
public static int devide(int x,int y) {
int c = x/y;
return c;
//System.out.println("8791561123102"); 无法输出,只能输出int类型的东西
}
}
例5:
package bilili;
/*
* 关于return
* 带有return关键字的语句只要执行,所在的方法执行结束
*
* 在同一个作用域中 return语句下面不能编写任何代码,因为执行不到,所以编译报错
*/
public class MethodTest07 {
public static void main(String[] args) {
System.out.println(mn(8));
}
public static int mn(int x) { //必须要有一个结果以整数型输出
if (x>5){
System.out.println("俺比5大"); //可以在return语句前边编写其他语句
return 1;
}
else {
return 3;
}
}
}
例6:
package bilili;
/*
* 在返回值是void的方法中使用return语句
* 作用:可以终止方法的执行
*/
public class MethodTest08 {
public static void main(String[] args) {
l();
}
public static void l() {
//return 0; 编译报错 对于返回值是空的方法 无法返回值
for (int i = 0;i<10;i++) {
if (i == 5) {
return; //return不是终止for循环 而是终止l()方法 终止for循环用break;
}
System.out.println("i"+"=="+i);
}
}
}
方法的内存分布:
方法在执行中,在JVM内存中是如何分配的,内存如何变化
- 1.方法只定义,不调用,是不会执行的,并且在JVM中也不会给该方法分配所属的内存空间
- 2.在jvm内存划分上有三块主要的内存空间
-
方法区内存
-
堆内存
-
栈内存
- 3.关于栈:一种数据结构,先进后出
方法的重载
现不使用“重载”来编译以下程序:
public class OverloadTest01 {
public static void main(String[] args) {
int r1 = sumInt(1,2);
double r2 = sumdouble(1.0,3.1);
long r3 = sumlong(1L,9L);
System.out.println(r1);
System.out.println(r2);
System.out.println(r3);
}
public static long sumlong(long l, long m) {
return l+m;
}
public static double sumdouble(double d, double e) {
// TODO Auto-generated method stub
return d+e;
}
public static int sumInt(int i, int j) {
// TODO Auto-generated method stub
return i+j;
}
}
缺陷:以下方法虽然功能不同 但是功能相似,都是求和
有一个机制:可以处理这种功能不同但是相似的方法 ,这种机制就是重载
修改过后的程序
优势:程序元调用方法的时候,不需要记忆更多的方法名
public class OverloadTest02 {
public static void main(String[] args) {
int r1 = sum(1,2);
double r2 = sum(1.0,3.1);
long r3 = sum(1L,9L);
System.out.println(r1);
System.out.println(r2);
System.out.println(r3);
}
//以下三个方法构成方法重载机制
public static long sum(long l, long m) {
return l+m;
}
public static double sum(double d, double e) {
return d+e;
}
public static int sum(int i, int j) {
return i+j;
}
}
1.方法重载又称为overload
2.功能相似的时候尽可能让方法名相同
3. 什么条件下构成了方法重载?
在同一个类中;方法名相同;参数列表不同;数值不同;类型不同
- 方法重载只和 方法名和参数列表有关
public class OverloadTest03 {
public static void main(String[] args) {
O.p("bshdaslds k");
//以下两个方法构成重载
//public static void m1()
//public static void m1(int x)
//以下两个方法构成重载
//public static void m2(double a,double b)
//public static void m2(int a,int b)
//以下两个方法构成重载
//public static void m2(int x)
//public static void m2(float x)
//以下两个方法构成重载
//public static void m2(int b,int a)
//public static void m2(int a,int b)
}
}
递归
递归的本质就是:自己调自己
public class RecursionTest01 {
public static void main(String[] args) {
doSelf();
}
//以下代码虽然只有一份
//但是可以重复使用,只有调用doSelf就会在分配一块内存空间
public static void doSelf() {
System.out.println("my name is meini");
doSelf();
System.out.println("dog name is rururur");
}
}
不使用递归 计算1-n的和
方法1:
//方法1 :直接编写
java.util.Scanner s =new java.util.Scanner(System.in);//输入
int N = s.nextInt();
int total =0;
for (int i = 1;i<=N;i++) {
total+=i;
}
System.out.println(total);
System.out.println(sumN(10));
方法二:
//方法2: 单独定义一个方法,这是一个独立的功能
public static int sumN(int n) {
int total =0;
for (int i = 1;i<=n;i++) {
total+=i;
}
return total;
}
使用递归的方法:
/*
* 使用递归 计算1-N的和
*/
public class RecursionTest03 {
public static void main(String[] args) {
// TODO Auto-g
System.out.println(sumN(5));
}
public static int sumN(int n) {
if(n>0) {
return n+sumN(n-1);
}else {
return 0;
}
}
}
递归的缺点:特别占用内存,不建议使用
/*
* 计算阶乘
*/
public class RecursionTest04 {
public static void main(String[] args) {
int n = jiecheng(5);
System.out.println(n);
}
public static int jiecheng(int x) {
if( x == 1 ){
return 1;
}
return x*jiecheng(x-1);
}
}