方法
- 方法是一些语句的集合,解决一类问题的代码的有序组合。相当于封装了一些代码,用于解决某些问题。
- 方法是对象的行为动作。
- 一个方法只完成一个功能。
- 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关键字。
-
不能从一个静态方法中直接调用一个非静态方法,因为非静态方法是依赖于实例对象的,但是静态方法不依赖于实例,所以调用静态方法的时候很可能实例对象还没出现。
-
不能从静态方法中发出对非静态属性的访问。非静态属性在实例出现后才能调用,此时实例不一定出现。
-
非静态方法中可以使用“类名.方法名()”调用静态方法。
-
非静态方法调用非静态方法,如果它们都在同一个类中,可以直接使用 方法名 调用。如果在不同类中,就需要先实例化对象,然后 “对象.方法名()” 调用。