概念

概念:具有一定特殊功能的一段代码,将需要在多个位置重复使用的一组代码,定义在方法内部
意义:1、避免了重复的代码 2、增强了程序的扩展性

方法定义

**访问修饰符** **返回数据类型** **方法名**(参数类型 参数名称) {
方法体
return 返回值;
}

  • 访问修饰符控制方法使用的范围,如果不写默认访问,[有四种: public, protected, 默认, private]
  • 返回数据类型:表示成员方法输出, void 表示没有返回值, 返回类型可以为任意类型,基本类型或引用类型(数组,对象)
  • 方法名: 小驼峰命名法
  • 参数类型:进入方法的数据是什么类型
  • 参数名称:进入方法的数据对应的变量名:cal(int n) , getSum(int num1, int num2)
  • 方法主体:表示为了实现某一功能代码块
  • return :停止当前方法,将返回值返回调用处
  • 返回值:方法执行后最终产生的数据结果

注意:return后面的返回值,必须和方法前面的返回值类型保持一致,语句不是必须的,方法有返回数据类型,则方法必须有 return 值;,要求返回值类型必须和 return 的 值类型一致或兼容, 如果方法是 void,则可没 return 语句或只写 return ;

方法三种调用格式

1、单独调用:**方法名称(参数)** 没有返回值就用此调用
2、打印调用:**System.out.println(方法名称(参数));** 返回值跟参数的方法调用
3、赋值调用:**数据类型 变量名称 = 方法名称(参数);** 有返回值跟参数的方法调用
image.png

1、无返回值的方法调用: **方法名称(参数);**

  1. public class Method01 {
  2. public static void main(String[] args) {
  3. //无返回值的方法调用
  4. getSum();
  5. }
  6. public static void getSum(){
  7. int sum = 0;
  8. for (int i = 0; i <= 10; i++) {
  9. sum +=i;
  10. }
  11. System.out.println("1~10之间的和"+ sum);
  12. }
  13. }

2、有返回值方法调用 **数据类型 变量名 = 方法名;**

  1. public class Method02 {
  2. public static void main(String[] args) {
  3. //有返回值方法调用 数据类型 变量名 = 方法名
  4. int result = getSum();
  5. System.out.println("1~10之间的和是:"+result);
  6. }
  7. public static int getSum() {
  8. int sum = 0;
  9. for (int i = 0; i <= 10; i++) {
  10. sum += i;
  11. }
  12. return sum;
  13. }
  14. }

3、有返回值跟参数的方法调用 **数据类型 变量名 = 方法名(参数);**

  1. public class Method03 {
  2. public static void main(String[] args) {
  3. //有返回值跟参数的方法调用 数据类型 变量名 = 方法名(参数);
  4. int result = getSum(10);
  5. System.out.println("1~10之间的和是:"+ result);
  6. }
  7. //定义有返回值跟参数的方法
  8. public static int getSum(int num){
  9. int sum = 0;
  10. for (int i = 0; i <= num; i++) {
  11. sum += i;
  12. }
  13. return sum;
  14. }
  15. }

4、有static跟无static调用

static的方法:静态方法

  • **类名.方法名();** 本类中类名可以省略

非static的方法:非静态方法

  • 创建该类的对象,通过对象调用方法
  • **类名 对象名 = new 类名();**
  • **对象.方法名();**

    方法调用流程图

    image.png

方法练习

  • 定义一个方法,用来判断两个数字是否相同 ```java public class Demo01MethodSame {

    public static void main(String[] args) {

    1. System.out.println(isSame(10, 20)); // false
    2. System.out.println(isSame(20, 20)); // true

    }

    public static boolean isSame(int a, int b) {

    1. /*boolean same;
    2. if (a == b) {
    3. same = true;
    4. } else {
    5. same = false;
    6. }*/
    7. // boolean same = a == b ? true : false;
    8. // boolean same = a == b;
    9. return a == b;

    }

}

  1. - 定义一个方法,用来求出1-100之间所有数字的和值
  2. ```java
  3. public class Demo02MethodSum {
  4. public static void main(String[] args) {
  5. System.out.println("结果是:" + getSum());
  6. }
  7. public static int getSum() {
  8. int sum = 0;
  9. for (int i = 1; i <= 100; i++) {
  10. sum += i;
  11. }
  12. return sum;
  13. }
  14. }
  • 定义一个方法,用来打印指定次数的HelloWorld ```java public class Demo03MethodPrint {

    public static void main(String[] args) {

    1. printCount(10);

    }

    public static void printCount(int num) {

    1. for (int i = 0; i < num; i++) {
    2. System.out.println("Hello, World!" + (i + 1));
    3. }

    }

}

  1. <a name="KUU0v"></a>
  2. ## 方法的注意事项
  3. - 方法应该定义在`类当中`,但是不能在方法当中再定义方法。不能嵌套。
  4. - 方法定义的前后顺序无所谓。
  5. - 方法定义之后不会执行,如果希望执行,一定要调用:`单独调用`、`打印调用`、`赋值调用`。
  6. - 如果**方法有返回值**,那么必须写上“return 返回值;”,不能没有。
  7. - return后面的返回值数据,必须和方法的返回值类型,对应起来。
  8. - 对于一个`void`没有返回值的方法,不能写return后面的返回值,只能写return自己
  9. - 对于void方法当中最后一行的return可以省略不写。
  10. - 一个方法当中可以有多个return语句,但是必须保证同时只有一个会被执行到,两个return不能连写。
  11. ```java
  12. public class Demo04MethodNotice {
  13. public static int method1() {
  14. return 10;
  15. }
  16. public static void method2() {
  17. // return 10; // 错误的写法!方法没有返回值,return后面就不能写返回值。
  18. return; // 没有返回值,只是结束方法的执行而已。
  19. }
  20. public static void method3() {
  21. System.out.println("AAA");
  22. System.out.println("BBB");
  23. // return; // 最后一行的return可以省略不写。
  24. }
  25. public static int getMax(int a, int b) {
  26. /*int max;
  27. if (a > b) {
  28. max = a;
  29. } else {
  30. max = b;
  31. }
  32. return max;*/
  33. if (a > b) {
  34. return a;
  35. } else {
  36. return b;
  37. }
  38. }
  39. }

方法之间相互调用

  1. public class Method {
  2. public static void main(String[] args) {
  3. test01();
  4. test02();
  5. }
  6. public static void test01(){
  7. System.out.println("test01");
  8. }
  9. public static void test02(){
  10. test01();
  11. System.out.println("test02");
  12. }}

方法的重载【重点】

规则:**同一个类中方法名相同,形参列表不同**。跟**方法返回值类型、修饰符等无关**

方法重载与下列因素相关

  1. 参数个数不同
  2. 参数类型不同
  3. 参数多类型顺序不同

方法重载与下列因素无关

  1. 与参数名称无关
  2. 方法的返回类型无关
    1. 与参数名称无关:定义一个xy,跟ab参数,那么方法调用时,不知道把参数传给谁
    2. 方法的返回类型无关:定义2个方法参数相同(int a,int b),但是类型不同,方法调用的时候不知道该传那个参数类型


重载的好处 :

  • 减轻了起名的麻烦
  • 减轻了记名的麻烦
    1. public int StudenClass() {
    2. int a;
    3. return a;
    4. }
    5. //方法重载
    6. public int StudenClass(String name, int age) {
    7. this.name = name;
    8. this.age = age;
    9. return this.age;
    10. }

构造器【重点】

构造器作用

构造器,又叫构造方法,是类中定义的一种特殊方法,通过构造方法来实例化该类对象,也就是该类实例。

  1. class Foo{
  2. String name;
  3. int age;
  4. public Foo(){
  5. System.out.println("Foo()");
  6. }
  7. public Foo(String name , int age){
  8. this.name = name;
  9. this.age = age;
  10. }
  11. }

总结 构造器作用 1. 创建对象 2.为对象属性赋值

构造方法特点

构造方法有一下特点,需要记忆。

  1. 构造方法与类同名
  2. 构造方法 没有返回值类型 ,也不可写void 。
  3. 构造方法 通过 new 调用
  4. 如果没有显示定义构造器,系统提供一个默认的无参构造,反之,一旦编写,系统不再提供。 ```java class Coder{ String name; int age; // 其他属性 …..

    public void sayHello(){ System.out.println(“hello”); } // 其他行为 …… }

class TestCoder{ public static void main(String[] args){ Coder coder = new Coder(); coder.name = “张三”; coder.age = 30; coder.sayHello(); } }

  1. <a name="CpLyR"></a>
  2. ##
  3. <a name="CFOuu"></a>
  4. ### 构造方法重载
  5. 构造方法本质是方法,是方法就可以具备重载的特性, **一个类中之所以存在多个版本的构造器,是为了满足不同人对 对象属性初始化的要求**。
  6. ```java
  7. /**
  8. * 定义一个Java程序员类
  9. */
  10. public class JavaCoder {
  11. //实例属性
  12. String name ;
  13. int age ;
  14. //构造方法,也是一个方法,和实例方法一样定义在类中,通常情况大部分人的习惯,定义在属性后
  15. //无参数构造器
  16. public JavaCoder(){
  17. System.out.println("构造器执行");
  18. }
  19. //有参数构造器
  20. public JavaCoder( String coderName ){
  21. name=coderName;
  22. }
  23. //全参构造
  24. public JavaCoder( String coderName, int coderAge ){
  25. name = coderName;
  26. age = coderAge;
  27. }
  28. //实例方法
  29. public void writeCode(){
  30. System.out.println( "我是"+name+"今年" +age+"岁,正在写hello world ");
  31. }
  32. }

可变参数

访问修饰符 返回类型 方法名(数据类型... 形参名) { }

  1. public class Test03 {
  2. public static void main(String[] args) {
  3. HasMethod m = new HasMethod();
  4. System.out.println(m.sum(2,4,67));
  5. }}
  6. class HasMethod {
  7. public int sum(int... nums) {
  8. int res = 0;
  9. for (int i = 0; i < nums.length; i++) {
  10. res += nums[i];
  11. }
  12. return res;
  13. }
  14. }
  • 当跟普通参数放一起时,可变参数必须放在最后 public void f(String str,double…nums){}
  • 一个形参列表只有一个可变参数

    静态方法 非静态方法

静态方法
属于类本身,在类装载的时候被装载到内存中,不自动进行销毁,会一直存在内存中,直到JVM关闭。静态方法可以直接调用。需加static

非静态方法
又称实例化方法,属于实例对象,实例化之后才会分配内存,必须通过类的实例来引用,当实例对象被JVM回收之后,也跟着消失。 需要使用对象来调用

无参方法 有参方法

有参:小括号当中由内容,当一个方法需要数据条件,才能完成任务

例如:两个数字相乘,必须知道2个数字是多少,才能相乘

  1. //两个数相乘
  2. public class Test08 {
  3. public static void main(String[] args) {
  4. method1(10,20);
  5. }
  6. public static void method1(int a,int b){
  7. int result = a * b;
  8. System.out.println(result);
  9. }
  10. }

无参:小括号当中无内容,一个方法不需要任何数据条件,自己能独立完成任务

例如2:一个方法,固定打印10次hello world

  1. public class Test09 {
  2. public static void main(String[] args) {
  3. method();
  4. }
  5. public static void method(){
  6. for (int i = 0; i < 10; i++) {
  7. System.out.println("hello world" + i);
  8. }
  9. }
  10. }

形参和实参

形参 :形参出现在方法定义中,在整个方法体内都可以使用, 离开该方法则不能使用。

实参: 实参出现在主调方法中,进入被调方法后,实参变量也不能使用。
image.png
注:**实际参数和形式参数的类型要对应**

递归

  • 方法自己调用自己,递归一定要有出口
    1. public class Method04 {
    2. public static void main(String[] args) {
    3. test1(3);
    4. }
    5. public static void test1(int n){
    6. System.out.println("test1");
    7. if(n==1){
    8. return;//方法的出口
    9. }
    10. test1(n-1);//递归:自己调用自己,递归一定要有出口
    11. }
    12. }

练习:求1~之间的和

  1. public class Method07 {
  2. public static void main(String[] args) {
  3. int sum = getSum(5);
  4. System.out.println("1~5之间的和"+sum);
  5. }
  6. public static int getSum(int n){
  7. if(n==1){
  8. return 1;
  9. }
  10. return getSum(n-1)+n;
  11. }
  12. }

值传递和引用传递

值传递:
实参传递给形参的是值 形参实参在内存上是两个独立的变量,对形参做任何修改不会影响实参

  1. public class Demo1 {
  2. public static void main(String[] args) {
  3. int b =20;
  4. change(b);// 实参 实际上的参数
  5. System.out.println(b);//20
  6. }
  7. public static void change(int a){//形参 形式上的参数
  8. a=100;
  9. }
  10. }

第7章:方法 - 图4

小明去餐厅吃饭,看见别人点的红烧肉挺好吃,把服务员叫过来,说我要一份红烧肉,服务员从后厨拿来一份红烧肉,小明吃完了,但是他吃的红烧肉跟旁边那个人吃的是一份吗?当然不是。

引用传递:
实参传递给形参的是堆内存上引用的地址,形参和实参在内存上指向的是同一地址,对形参的改变会影响实参

  1. public class Demo1 {
  2. public static void main(String[] args) {
  3. int [] a={1,2,3};
  4. System.out.println(a[0]); //1
  5. change(a);
  6. System.out.println(a[0]); //100
  7. }
  8. public static void change(int[] a ){
  9. a[0]=100;
  10. }
  11. }

第7章:方法 - 图5
原来a[0]指向0x13地址,值是1,
后来在a[0] 指向的也是0x13地址,将值变成了100
所以,再查询a[0]的值的时候,值自然变成了100

通俗点的讲法就是: 小明回到家,他妻子说:冰箱二层有一只鸡,你去做了; 小明做好了,叫妻子过来吃饭。 这个时候,他妻子现在看见的鸡和她买回来的一样吗? 当然不一样,都做熟了; 什么意思呢? 鸡就是数据 冰箱二层就是存储数据的地址 把鸡做熟了就是相当于把值改变了 地方还是那个地方,就是鸡变了。

返回值和无返回值

在定义方法是需要加入返回值如:int,double,,,在调用的方法中需要有一个变量来接收这个返回值。
返回值的类型根据程序的需求来确定。

image.png

有返回值

  1. /*
  2. 题目要求:定义一个方法,用来求出两个数字之和{()你帮我算,算完之后把结果告诉我
  3. */
  4. public class Test05 {
  5. public static void main(String[] args) {
  6. int num = getSum(10,20);
  7. System.out.println("返回值"+num);
  8. }
  9. public static int getSum(int a,int b){
  10. int result = a + b;
  11. return result;
  12. }
  13. }

无返回值

  1. /*
  2. 题目要求:定义一个方法,用来打印两个数字之和(你来计算,算完之后你自己负责显示结果,不用告诉我)
  3. */
  4. public class Test06 {
  5. public static void main(String[] args) {
  6. getSum(10,20);
  7. }
  8. public static void getSum(int a ,int b){
  9. int result = a+b;
  10. System.out.println(result);
  11. }
  12. }

注意事项

  • 对于有返回值的方法,可以使用单独调用打印调用赋值调用
  • 对于无返回值的方法,只能使用单独调用

Java方法中通过传递参数改变变量的值:

基本数据类型,操作传递的是变量的值,改变一个变量的值不会影响另一个变量的值。引用数据类型(类、数组和接口),赋值是把原对象的引用(可理解为内存地址)传递给另一个引用
1、对于基本类型参数,在方法体内对参数进行重新赋值,并不会改变原有变量的值。
2、对于引用类型参数,在方法体内对参数进行重新赋予引用,并不会改变原有变量所持有的引用。
3、方法体内对参数进行运算,不影响原有变量的值。
4、方法体内对参数所指向对象的属性进行操作,将改变原有变量所指向对象的属性值。
QQ图片20210412162013.png