Java中的方法
一、方法的介绍
方法,把某些需要重复使用的代码段放在一块,可供重复调用。
方法的好处:代码得到了重复使用
方法本质:
方法就是一段代码片段,并且这段代码片段:
可以完成某个特定的功能,可以被重复的使用
方法,对应英语单词:Method
方法在C语言中叫做函数/Function
方法定义在类体之中,在一个类当中可以定义多个方法,
方法编写的位置没有先后顺序,可以随意
方法体当中不能再定义方法!!!!
方法体由java语句构成,方法体中的代码遵循自上而下执行
public class MethodTest02
{
public static void main(String[] args){
//调用函数,计算两个int类型数据的和
MethodTest02.sumInt(10,20);
MethodTest02.sumInt(666,888);
MethodTest02.sumInt(1000,2022);
}
// 单独定义一个方法
// 该方法完成计算两个int类型数据的和,并且将结果输出
public static void sumInt(int a,int b){
int c = a+b;
System.out.println(a+"+"+b+"="+c);
}
}
二、方法的描述
/*
关于java语言中的方法:
1、方法怎么定义,语法结构:
[修饰符列表] 返回值类型 方法名(形式参数列表){
方法体;
}
2、对以上的语法结构进行解释
2.1、关于修饰符列表
* 可选项,不是必须的
* 目前统一写成:public static
* 方法的修饰符列表中有static关键字的话,调用时:
类名.方法名(实际参数列表);
2.2、返回值类型
* 什么是返回值?
一个方法是可以完成某个特定功能的,这个功能结束之后大多数都是需要返回
最终执行结果的,执行结果可能是一个具体存在的数据。而这个具体存在的数据就是返回值
* 返回值类型?
返回值是一个具体存在的数据,数据都是有类型的,此时需要指定的是返回值的具体类型
* 返回值类型都可以指定哪些类型呢?
java任意一种类型都可以,包括基本数据类型和引用数据类型
*也可能这个方法执行结束之后不返回任何数据,java中规定,当一个方法执行结束之后不返回任何数据的话,返回值类型位置必须编写:void关键字
* 返回值类型:
byte、short、int、long、float、double、char、boolean
* 返回值类型若不是void,表示这个方法执行结束之后必须返回一个具体的数据
当方法执行结束没有返回任何数据的话,编译器报错。
return "值";并且要求“值”的数据类型必须和方法的返回值类型一致。
* 返回值类型是void的时候,在方法体内不能编写“return 值;”这样的语句
可以编写“return;”这样的语句
* 只要带有return关键字的语句执行,return语句所在的方法结束,强行终止当前方法
2.3、方法名:
* 只要是合法的标识符就行
* 方法名最好见名知意
* 方法名最好是动词
* 方法名首字母小写,后面每个单词首字母大写
2.4、形式参数列表:简称形参
* 形参是局部变量:int a;double b;String s;
* 形参的个数可以是0~N个
* 多个形参之间用"逗号"隔开
* 形参中起决定作用的是形参的数据类型,形参的名字就是局部变量的名字
* 方法调用时,实际给方法传递的真是数据,被称为:实际参数,简称实参
* 实参列表和形参列表必须满足数量相同,类型对应想同
例如:
方法定义
public static int sum(int a,int b){
}
方法调用
sum("abc","a");编译器报错
2.5、方法体必须由大括号括起来,自上而下执行,
由java语句构成,每一个java语句以";"结尾。
3、方法怎么调用?
方法只有在调用的时候才会执行
语法规则:<方法的修饰符列表当中有static>
类名.方法名(实参列表);
*/
/*
public 表示公开的
class表示定义类
MethodTest03是一个类名
*/
public class MethodTest03
{
// 类体
// 类体中不能直接编写java语句,除声明变量之外
// 方法出现在类体当中
// 方法
// public表示公开的
// static表示静态的
// void表示方法执行不返回任何数据
// main是方法名:主方法
// (String[] args):形式参数列表,其中String[]是一种固定的写法
// 所以以下只有args这个局部变量名是随意的
// 主方法固定写法
public static void main(String[] args){
//调用sum方法
MethodTest03.sum(10,20);
}
// 自定义方法,不是程序的入口
// 方法作用:计算两个int类型数据的和,不要求返回结果
// 修饰符列表:public static
// 返回值类型:void
// 方法名:sum
// 形参列表:(int a,intb)
// 方法体
public static void sum(int a,int b){
int c = a+b;
System.out.println(c);
}
// 无参数无返回值的方法(如果方法没有返回值,不能不写,必须写void,表示没有返回值)
public void f1() {
System.out.println("无参数无返回值的方法");
}
/**
* 有参数无返回值的方法
* 参数列表由零组到多组“参数类型+形参名”组合而成,多组参数之间以英文逗号(,)隔开,形参类型和形参名之间以英文空格隔开
*/
public void f2(int a, String b, int c) {
System.out.println(a + "-->" + b + "-->" + c);
}
// 有返回值无参数的方法(返回值可以是任意的类型,在函数里面必须有return关键字返回对应的类型)
public int f3() {
System.out.println("有返回值无参数的方法");
return 2;
}
// 有返回值有参数的方法
public int f4(int a, int b) {
return a * b;
}
// return在无返回值方法的特殊使用
public void f5(int a) {
if (a>10) {
return;//表示结束所在方法 (f5方法)的执行,下方的输出语句不会执行
}
System.out.println(a);
}
}
三、方法的调用顺序
方法的调用不分顺序,只要在同一个类体中都可以调用,其中main方法是程序的进口,从main方法开始执行。
/*
方法的调用不一定在main方法中,只要是程序可以执行到的位置,
都可以调用其他方法
*/
public class MethodTest04
{
public static void sum(int a,int b){
int c = a+b;
System.out.println(c);
//调用dosome方法
MethodTest04.dosome();
}
public static void main(String[] args){
//调用some方法
MethodTest04.sum(10,20);
}
public static void dosome(){
System.out.println("Hello World!");
}
}
四、方法的传参
public class MethodTest05
{
public static void main(String[] args){
// 传参错误
// MethodTest05.sum();
// 正确
MethodTest05.sum(10,20);
// 转换数据类型
MethodTest05.sum((long)3.0,20);
}
public static void sum(long a,long b){
System.out.println(a+b);
}
}
为什么java中只有值传递?
首先了解程序语言设计中有关将参数传递给方法(或函数)的专业术语:
- 按值调用(call by value):表示方法接受的是调用者提供的值
- 引用调用(call by reference):表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
Java程序语言设计总是采用按值调用。也就是说:方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。
public static void main(String[] args) {
int num1 = 10;
int num2 = 20;
swap(num1, num2);
System.out.println("num1 = " + num1);// num1=10
System.out.println("num2 = " + num2);// num2=20
}
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
System.out.println("a = " + a); // a=20
System.out.println("b = " + b); // b=10
}
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(arr[0]);//1
change(arr);
System.out.println(arr[0]); //0
}
public static void change(int[] array) {
// 将数组的第一个元素变为0
array[0] = 0;
}
public class Test {
public static void main(String[] args) {
// TODO Auto-generated method stub
Student s1 = new Student("小张");
Student s2 = new Student("小李");
Test.swap(s1, s2);
System.out.println("s1:" + s1.getName()); // 小张
System.out.println("s2:" + s2.getName()); // 小李
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
System.out.println("x:" + x.getName()); // 小李
System.out.println("y:" + y.getName()); // 小张
}
}
下面再总结一下 Java 中方法参数的使用情况:
- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型)。
- 一个方法可以改变一个对象参数的状态。
- 一个方法不能让对象参数引用一个新的对象。
五、方法的调用规则
/*
方法调用:
1、方法的修饰符列表当中有static关键字,完整的调用方式是:类名.方法名(实参列表);
2、但是,有的时候“类名.”可以省略
* 在当前类中调用时,类名可以不写
* 在其他类中调用时必须要写
3、建议一个java源文件只定义一个class
*/
public class MethodTest06
{
public static void main(String[] args){
//调用
m();
}
public static void m(){
System.out.println("m method execute!");
m2();
A.m2();
}
public static void m2(){
System.out.println("m2 method execute!");
}
}
class A
{
public static void main(String[] args){
// 调用其他类中的方法
MethodTest06.m();
}
public static void m2(){
System.out.println("A's method execute!");
}
}
六、方法的内存分配
方法调用时候,分配的内存空间在栈内存中,进行压栈操作,当栈中的内存过多时,会报栈溢出错误。
/*
分析以下程序的输出结果
*/
public class MethodTest07
{
/*
main begin
m1 begin
m2 begin
m3 begin
m3 over
m2 over
m1 over
main over
当前main方法结束之后整个程序才结束
*/
public static void main(String[] args){
System.out.println("main begin");
m1();
System.out.println("main over");
}
public static void m1(){
System.out.println("m1 begin");
m2();
System.out.println("m1 over");
}
public static void m2(){
System.out.println("m2 begin");
m3();
System.out.println("m2 over");
}
public static void m3(){
System.out.println("m3 begin");
System.out.println("m3 over");
}
}