一、方法调用
1. 指通过对象对类的各个方法调用以便实现方法
2. 常见形式就是对象名.方法名(参数列表)
3.方法调用可以多次,没有限制
public class People
{
public int age;
public String name;
public void getInformation()
{
System.out.println("这是方法");
}
/**
* 方法调用
*/
public static void main(String[] args)
{
People test=new People();
System.out.println("我好");
test.getInformation();
System.out.println("你好");
}
}
执行结果为:
二、方法调用执行顺序
1. JAVA是遇方法则进方法,如A方法调用B方法,B方法调用C方法,那么执行时会依次进入ABC三个方法
2. JAVA是必须执行完被调用方法后才可回到调用方法中,如A方法调用B方法,那么执行到调用时,必须等B方法执行完后再执行剩余的代码
public class People
{
public int age;
public String name;
/**
* 这是A方法
*/
public void A()
{
System.out.println("这是A方法");
this.B(); //调用B方法
System.out.println("A方法执行完毕");
}
/**
* 这是B方法
*/
public void B()
{
System.out.println("这是B方法");
System.out.println("B方法执行完毕");
}
/**
* 方法调用
*/
public static void main(String[] args)
{
People test = new People();
System.out.println("开始方法调用");
test.A(); // 进行方法调用
System.out.println("方法调用结束");
}
}
执行结果: 程序运行先执行main方法,而后往下执行时遇到A方法调用,进入到A方法执行,遇到B方法调用,进入到B方法执行
B执行完毕后,回到A执行,A执行完后回到main方法
三、方法参数传递
1、方法调用时传递参数必须要类型一致,否则编译报错
2、JAVA参数传递是哪种模式?
1)程序设计语言中方法参数传递有两种模式,一种是按值传递,一种是按引用传递
2)按值传递:方法接受的是调用者提供的参数的值
3) 按引用传递:方法接受的是调用者提供的参数地址(参数引用)
4)JAVA中方法参数总是按值传递的
当参数是基本数据结构时,是按值传递,方法无法改变参数的值
public class People
{
/**
* 这是change方法
*/
public void Change(int a,int b)
{
a=a+1;
b=b*10;
}
/**
* 方法调用
*/
public static void main(String[] args)
{
People test = new People();
int x=1;
int y=10;
test.Change(x, y);
System.out.println(x);
System.out.println(y);
}
}
控制台输出:1 10
若是按照引用传递,那么调用方法的时候传递的是x、y这两个变量,然后对变量值修改,得到的结果应该是2,100,但是实际结果却是1,10说明传递的并不是参数变量
若按照值传递,那么调用方式传递了1和10过去,到了change方法内部后,变量a赋值为1,变量b赋值为10,而后的操作都是对a和b执行的,因此对x和y变量没有影响,因此最后结果是1,10
当参数是对象时,传递的是对象的拷贝引用,而不是参数引用
public class People
{
private int age;
// 设置年龄
public void setAge(int number)
{
age = number;
}
// 获取年龄
public int getAge()
{
return age;
}
/**
* 交换对象
*/
public void ChangeAge(People x,People y)
{
People temp=x;
x=y;
y=temp;
System.out.println(x.getAge());
System.out.println(y.getAge());
}
/**
* 方法执行
*/
public static void main(String[] args)
{
People a = new People();
People b = new People();
People test= new People();
a.setAge(200);
b.setAge(300);
test.ChangeAge(a, b);
System.out.println("分割线");
System.out.println(a.getAge());
System.out.println(b.getAge());
}
}
若按引用传递,传递的是对象a和b,那么经过方法中对象交换,那么最后a的age是300、b的age是200,但是结果却如下所示
若按值传递,传递的是对象的拷贝引用,即变量x和变量y是拷贝的,引用指向变量a和变量b的对象
然后通过红线指引的1、2、3步完成了方法changeAge()的三步交换
最终x指向300的age对象,y指向200的age对象
变量a和变量b的指向从未改变,因此结果如控制台
通过上述图,深入了解下,是否可以通过拷贝的引用改变对象状态,这样原变量指向的对象状态也会改变?
public class People
{
private int age;
// 设置年龄
public void setAge(int number)
{
age = number;
}
// 获取年龄
public int getAge()
{
return age;
}
/**
* 改变对象状态
*/
public void ChangeAge(People x)
{
x.setAge(500);
}
/**
* 方法执行
*/
public static void main(String[] args)
{
People a = new People();
People test= new People();
a.setAge(200);
test.ChangeAge(a);
System.out.println(a.getAge());
}
}
控制台输出:500,达到了改变指向对象状态的目的
图解:
因此可以得出以下结论:
1、方法不能改变基本数据类型变量的值
2、方法可以改变一个对象的状态
3、方法不能改变一个对象变量的引用(即变量始终指向该对象)