0
点赞
收藏
分享

微信扫一扫

18 java方法_1 _方法的定义与调用 _值传递与引用传递


java方法_1 _方法的定义与调用 _值传递与引用传递

方法介绍

  1. Java方法是语句的集合,它们在一起执行一个功能。
  1. 方法是解决一类问题的步骤的有序组合
  2. 方法包含于类或对象中
  3. 方法在程序中被创建,在其他地方被引用
  1. 设计方法的原则 : 方法的本意是功能块,就是实现某个功能的语句块的集合。我们设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
  2. 回顾:方法的命名规则?
    首字母小写和驼峰原则

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");
}
}
}
}

方法的定义与调用

方法的定义

  1. Java的方法类似于其它语言的函数,是一段用来完成特定功能的代码片段, 一般情况下,定义一个方法包含以下语法:
  2. 方法包含一个方法头 和一个 方法体 。下面是一个方法的所有部分:
  1. 修饰符 :修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
  2. 返回值类型:方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
  3. 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
  4. 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
  1. 形式参数:在方法被调用时用于接收外界输入的数据。
  2. 实参:调用方法时实际传给方法的数据。
  1. 方法体:方法体包含具体的语句,定义该方法的功能。

修饰符  返回值类型  方法名  (参数类型 参数名){
...
方法体
...
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;
}
}

方法调用

  1. 调用方法:对象名.方法名(实参列表)
  2. java支持两种调用方法的方式,根据方法是否有返回值来确定:
  1. 当方法返回一个值的时候,方法调用通常被当作一个值。例如:

int laige = max(30,40);

  1. 如果方法返回值是void,方法调用一定是一条语句。

.out.println("Hello World!");

值传递(java是值传递)与引用传递

一、理解基本类型与引用类型

Java中的数据类型分为两种为基本类型和引用类型。

  1. 基本类型的变量保存原始值,所以变量就是数据本身。
    常见的基本类型:byte,short,int,long,char,float,double,Boolean,returnAddress。
  2. 引用类型的变量保存引用值,所谓的引用值就是对象所在内存空间的“首地址值”,通过对这个引用值来操作对象。
    常见的引用类型:类类型,接口类型和数组类型。

二、值传递和引用传递的理解

  1. 值传递
    在方法的调用过程中,实参把它的实际值传递给形参,此传递过程就是将实参的值复制一份传递到函数中,这样如果在函数中对该值(形参的值)进行了操作将不会影响实参的值。因为是直接复制,所以这种方式在传递大量数据时,运行效率会特别低下。
  2. 引用传递
    引用传递弥补了值传递的不足,如果传递的数据量很大,直接复过去的话,会占用大量的内存空间,而引用传递就是将对象的地址值传递过去,函数接收的是原始值的首地址值。在方法的执行过程中,形参和实参的内容相同,指向同一块内存地址,也就是说操作的其实都是源数据,所以方法的执行将会影响到实际对象。

例子:

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;
}

三、结论

通过上面的分析我们可以得出以下结论:

  1. 基本数据类型传值,对形参的修改不会影响实参;(值传递)
  2. 引用类型传引用,形参和实参指向同一个内存地址(同一个对象),所以对参数的修改会影响到实际的对象。(引用传递)
  3. String, Integer, Double等immutable的类型特殊处理,可以理解为传值,最后的操作不会修改实参对象。(可以看作是值传递)


举报

相关推荐

0 条评论