java方法_1 _方法的定义与调用 _值传递与引用传递
方法介绍
-
Java方法是语句的集合,它们在一起执行一个功能。
- 方法是解决一类问题的步骤的有序组合
- 方法包含于类或对象中
- 方法在程序中被创建,在其他地方被引用
-
设计方法的原则 : 方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
-
回顾:方法的命名规则?
首字母小写和驼峰原则
package com.wlw.method;
public class Demo01 {
// main 方法, 程序来管的,在栈的最底层
public static void main(String[] args) {
/*int sum = add(1,2);
System.out.println(sum);*/
test();
}
//加法
//修饰符 返回值 方法名(参数) //如果想在main中直接使用该方法,要加修饰符static
public static int add(int a,int b){
return a+b;
}
public static void test(){
//用 while 或for循环输出 1~ 1000 之间能被5整除的数,并且每行输出三个
for (int i = 1; i <= 1000; i++) {
if(i % 5 == 0){
System.out.print(i + "\t");
}
if(i % (5*3) == 0){//换行
System.out.println();
//System.out.print("\n");
}
}
}
}
方法的定义与调用
方法的定义
-
Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段, 一般情况下,定义一个方法包含以下语法:
-
方法包含一个 方法头 和一个 方法体 。下面是一个方法的所有部分:
-
修饰符 :修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
-
返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
-
方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
-
参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 形式参数:在方法被调用时用于接收外界输入的数据。
- 实参:调用方法时实际传给方法的数据。
-
方法体:方法体包含具体的语句,定义该方法的功能。
修饰符 返回值类型 方法名 (参数类型 参数名){ ... 方法体 ... return 返回值; //如果返回值类型是void,就没有返回值 }
package com.wlw.method; public class Demo01 { // main 方法, 程序来管的,在栈的最底层 public static void main(String[] args) { //实际参数:实际调用时,传递给方法的参数(1,2) int sum = add(1,2); System.out.println(sum); } //加法 //形式参数:用来定义用的 (a,b) public static int add(int a,int b){ return a+b; } }
package com.wlw.method; public class Demo02 { public static void main(String[] args) { int num = max(10,20); //调用max方法 System.out.println(num); } //比大小 public static int max(int num1,int num2){ int result = -1; if(num1 == num2){ System.out.println("两个数相等"); return 0;//终止语句,如果执行到这,这个方法也就结束了 }else if(num1 > num2){ result = num1; }else { result = num2; } return result; } }
-
方法调用
-
调用方法:对象名.方法名(实参列表)
-
java支持两种调用方法的方式,根据方法是否有返回值来确定:
-
当方法返回一个值的时候,方法调用通常被当作一个值。例如:
int laige = max(30,40);
-
如果方法返回值是void,方法调用一定是一条语句。
System.out.println("Hello World!");
-
值传递(java是值传递)与引用传递
一、理解基本类型与引用类型
Java中的数据类型分为两种为基本类型和引用类型。
-
基本类型的变量保存原始值,所以变量就是数据本身。
常见的基本类型:byte,short,int,long,char,float,double,Boolean,returnAddress。
-
引用类型的变量保存引用值,所谓的引用值就是对象所在内存空间的“首地址值”,通过对这个引用值来操作对象。
常见的引用类型:类类型,接口类型和数组类型。
二、值传递和引用传递的理解
-
值传递
在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。
-
引用传递
引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。
例子:
package com.wlw.method;
public class Example {
String str = new String("hello");
char[] ch = {'a', 'b'};
public static void main(String[] args) {
Example ex = new Example();
ex.change(ex.str, ex.ch);
System.out.println(ex.str + " and");
System.out.println(ex.ch);
}
public void change(String str, char[] ch) {
str = "ok";
ch[0] = 'c';
}
}
/*
输出是:
hello and
cb
*/
//因为String是不可变类且为值传递,而ch[]是引用传递,所以方法中的str = "ok",相当于重新创建一个对象并没有改变实参str的值,数组是引用传递,直接改变,所以执行完方法后,char[] ch = {'c', 'b'};
//第5行定义的 ch 与第13行定义的 ch 指向的是同一块内存数据,要变是一起变的
package com.wlw.method;
public class TestMyValue {
public static void main(String[] args) {
MyValue m1 = new MyValue();// 此时value属性默认值为0
m1.value = 100; // 此时设置value属性值为100
MyValue m2 = m1; // 将mv1的值传给mv2,由于mv1中存储的是对象的首地址,故mv2也指向了相同的对象首地址
m2.value = 200; // 改变对象的value属性值为200
System.out.println(m1.value);
// 结果是200 ,原因是mv1引用和mv2引用指向了同一块内存数据(对象),mv1引用和mv2引用都有修改的权利, 先然数据被mv2引用修改为200。
}
}
class MyValue{
int value;
}
三、结论
通过上面的分析我们可以得出以下结论:
- 基本数据类型传值,对形参的修改不会影响实参;(值传递)
- 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。(引用传递)
- String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。(可以看作是值传递)