Java 方法(包括值传递和引用传递) 笔记

本文详细介绍了Java中的方法,包括方法的定义、调用方式、方法重载以及命令行参数的使用。方法是代码的有序组合,用于解决特定问题,可以有返回值或无返回值。方法调用时,静态方法通过类名调用,非静态方法需通过对象实例。方法重载关键在于方法名相同但参数列表不同。此外,还讨论了值传递和引用传递的区别,以及在不同上下文中如何调用方法。
摘要由CSDN通过智能技术生成

方法

  • 方法是一些语句的集合,解决一类问题的代码的有序组合。相当于封装了一些代码,用于解决某些问题。
  • 方法是对象的行为动作。
  • 一个方法只完成一个功能。
  • main方法中可以通过new对象并使用该对象去调用其方法,也可以直接使用某个方法,但是该方法必须是静态方法。
  • 对于一般的非static变量或方法,需要有一个对象的实例才能调用,要先生成对象的实例,才会分配内存空间。而对于static的变量或方法,在程序加载时便已经分配了内存空间,只和特定的类相关联,无需实例化。
  • main 方法是被 JVM 调用的,除此之外,main 方法和其它方法没什么区别。

方法定义

- 基本格式

  • 语法:

    	修饰符 返回值类型 方法名(参数类型 参数名){
    	    ...
    	    方法体
    	    ...
    	    return 返回值;
    	}
    
  • 组成部分

     修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
     
     返回值类型 :方法返回值的数据类型。如果方法没有返回值,那么返回值类型关键字是void。
     
     方法名:方法的实际名称。方法名和参数列表共同构成方法签名。
     
     参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。
     
     参数列表:指方法的参数类型、顺序和参数的个数。
     
     参数列表中的参数分为两种:
     		形参:在方法被调用时用于接收外界输入数据的参数。
     		实参:在调用方法时已经接收了实际传入数据的参数。(形参接收了数据之后变成了实参)
     方法体:完成某个功能的具体语句。
    

- 方法的调用和使用

  • 方法的使用:
    根据方法是否返回值来区分如何使用方法(对于有返回值的方法,用的就是它的返回值):

     当方法有返回值,该方法通常被当做一个值。
     当方法无返回值,该方法通常被当做一个语句。
    
  • 方法的调用:

     如果是静态方法,同一个类中直接在静态方法中直接调用。不同的类中需要使用   类名.静态方法名   调用。
     如果是非静态方法,那么需要分几种情况调用,同项目、同包、同类等。
    
  • 调用一个方法时如果需要提供参数,必须按照参数列表指定的顺序提供。

- 方法的重载

  • 构成重载的规则

     1、方法名相同
     2、参数列表不同(包括参数类型、参数个数、参数顺序)
     3、构造方法也可以重载
    

    另外一些似是而非的东西:

     1、重载与方法的返回值类型无关(方法的返回值类型可以相同也可以不同)
     2、如果参数列表中所有形参的参数类型相同,只是参数名称不同(或者参数名称也相同,只是参数顺序不同),不构成重载
    
  • 说明:

     当方法名相同时,编译器会根据所调用方法的参数列表(参数个数、参数类型、参数顺序)去匹配,以确定调用哪个方法。
    

- 命令行参数

  • 说明

      1、有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给main()函数实现
      2、命令行参数是在执行程序时候紧跟在程序名字后面的信息
      3、感觉用的很少
    
  • 例如:

    //CommandLine.java 文件代码:
    public class CommandLine {
       public static void main(String args[]){ 
          for(int i=0; i<args.length; i++){
             System.out.println("args[" + i + "]: " + args[i]);
          }
       }
    }
    
    //dos窗口中运行这个java文件
    $ javac CommandLine.java 
    $ java CommandLine this is a command line 200 -100
    args[0]: this
    args[1]: is
    args[2]: a
    args[3]: command
    args[4]: line
    args[5]: 200
    args[6]: -100
    

方法种类

- 构造方法

  • 语法:

    //构造方法没有返回值,也不用void修饰,只能是下面的格式
    class 类名 {
      int i;
      //构造方法
      类名() {
        i = 1;
      }
    }
    
  • 说明:

     1、创建对象的时候,构造方法用来初始化对象。
     2、构造方法名称和它所在类的名字相同。
     3、构造方法没有返回值。
     4、通常会使用构造方法给一个类的实例变量赋初值(初始化一个类的实例变量),或者执行其它必要的步骤来创建一个完整的对象。
     5、不管你是否自定义构造方法,所有的类都有构造方法,因为 Java 自动提供了一个默认构造方法,默认构造方法的访问修饰符和它所在类的访问修饰符相同(类为 public,构造函数也为 public;类为 protected,构造函数也为 protected)。一旦你自定义了构造方法,默认构造方法就会失效。
     6、构造方法初始化对象的过程,相当于一个新生儿出生,新生儿有自带属性(面向对象)。
    
  • 普通方法

     存在于类中,不用static修饰(相当于对象的个性化行为习惯)。
    
  • 静态方法

     存在于类中,不用static修饰(相当于对象的普遍行为习惯)。
    

- 可变参数

  • 格式:

    	修饰符 返回值类型 方法名(参数类型 参数名,参数类型... 参数名){		   
    	    方法体		   
    	    return 返回值;
    	}
    	//省略号即代表多个参数(可变参数),可变参数相当于一个数组
    
     JDK 1.5 开始,Java支持传递  同类型的可变参数  给一个方法。
    
     在方法声明中,在指定参数类型后加一个省略号(...) 。
    
     一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。
     
     可变参数相当于一个数组。
    
  • 例如:

    public class Test {
        public static void main(String[] args) {
            ttest("我是谁",1,2,3,4,5,6,7,8,9);
        }
    
        public static void ttest(String s,int... x){
            System.out.println(x[1]);
            System.out.println(s);
        }
    }
    

- 值传递和引用传递

  • 值传递(pass by value):在调用函数时,将实际参数复制一份传递到函数中,这样在函数中对参数进行修改,就不会影响到原来的实际参数。

    package com.baidu.www;
    
    /**
     * Created by joker on 2021/12/10.
     * 值传递
     */
    public class zhiChuanDi {
        public static void main(String[] args) {
        //值传递,下面只是测试代码,在调用test()和test1()方法并将x=1传入两个方法后,main方法中打印x值不变。
        //
            int x = 1;
            System.out.println(x);
    
            test(x);
            System.out.println(x);
    
            test1(x);
            System.out.println(x);
        }
    
        public static int test(int a){
            a = 10;
            return a;
        }
    
        public static void test1(int a){
            a = 100;
        }
    }
    
    
    	1
    	1
    	1
    	
    	Process finished with exit code 0
    
  • 引用传递(pass by reference):在调用函数时,将实际参数的地址直接传递到函数中。这样在函数中对参数进行的修改,就会影响到实际参数,传递的并不是实际的对象,而是对象的引用,外部对引用对象的改变也会反映到源对象上,因为引用传递的时候,实际上是将实参的地址值复制一份给形参。

    package com.baidu.www;
    
    /**
     * Created by joker on 2021/12/10.
     */
    public class zhiChuanDi {
        public static void main(String[] args) {
            Person person = new Person();
            System.out.println(person.name);
    
            test(person);
            System.out.println(person.name);
        }
    
        public static void test(Person person){
            person.name = "joker";
        }
    }
    
    class Person{
        String name; //默认值null
    }
    
    
    
    1
    1
    
    Process finished with exit code 0
    
    
  • 说明:

    对象传递(数组、类、接口)是引用传递,原始类型数据(整形、浮点型、字符型、布尔型)传递是值传递。

- 方法的调用补充

  • 静态方法(和类一起加载,类存在时它的静态方法就存在了)又叫做类方法,可以使用 “类名.方法名()” 的方式访问静态方法,如果再同一个类中,可以直接使用 方法名 调用。普通的非静态方法只能先实例化对象(new对象)再用 “对象名.方法名()”
    的方式访问,普通方法又叫做实例方法(因为它依赖于实例对象存在)。

  • 不能从静态上下文环境中使用this关键字(无法从一个静态方法中发出this 的引用),不能在静态方法中使用this关键字。

  • 不能从一个静态方法中直接调用一个非静态方法,因为非静态方法是依赖于实例对象的,但是静态方法不依赖于实例,所以调用静态方法的时候很可能实例对象还没出现。

  • 不能从静态方法中发出对非静态属性的访问。非静态属性在实例出现后才能调用,此时实例不一定出现。

  • 非静态方法中可以使用“类名.方法名()”调用静态方法。

  • 非静态方法调用非静态方法,如果它们都在同一个类中,可以直接使用 方法名 调用。如果在不同类中,就需要先实例化对象,然后 “对象.方法名()” 调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值