Java(9)Java方法

Java方法

Java 方法简介:

在前面几个章节中我们经常使用到 System.out.println(),那么它是什么呢?

println() 是一个方法。

System 是系统类。

out 是标准输出对象。

这句话的用法是调用系统类 System 中的标准输出对象 out 中的方法 println()

那么什么是方法呢?

  1. Java方法是语句的集合,它们在一起执行一个功能。
  2. 方法是解决一类问题的步骤的有序组合
  3. 方法包含于类或对象中
  4. 方法在程序中被创建,在其他地方被引用

方法的优点

  1. 使程序变得更简短而清晰。

  2. 有利于程序维护。

  3. 可以提高程序开发的效率。

  4. 提高了代码的重用性。

方法的命名规则

方法的名字的第一个单词应以小写字母作为开头,后面的单词则用大写字母开头写,不使用连接符。例如:addPerson

方法的定义:

 修饰符 返回值类型 方法名(参数类型 参数名){
    ...
    方法体
    ...
    return 返回值;
} 

方法的调用:

1、 当方法由返回值时,方法调用通常被当作一个值赋给变量,如:

`int large=max(30,40);`

2、 当方法没有返回值时,方法调用是一条语句

`System.out.println(“Hello world”);`
  • 案例
public class HelloJimmy {
    public static void main(String[] args) {
      int maxNumber;
      int a=30;
      int b=40;
      maxNumber=max(a,b);
      System.out.printf("The max number is %d" ,maxNumber);
    }
    public static int max(int num1, int num2) {
      int result;
      if (num1>num2) {
        result=num1;
      }else {
        result=num2;
      }
      return result;
    }
}
//最终输出了The max number is 40

这个程序包含了main和max方法,max方法没有什么特别的,唯一不同地方在于main方法是被JVM调用的。

main 方法的头部是不变的,如例子所示,带修饰符 public 和 static,返回 void 类型值,方法名字是 main,此外带个一个 String[] 类型参数。String[] 表明参数是字符串数组。


修饰符:

修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。

返回值类型

方法返回值的类型,如果方法不返回任何值,则返回值类型指定为 void ;如果方法具有返回值,则需要指定返回值的类型,并且在方法体中使用 return 语句返回值

方法的参数传递方式

Java里方法的参数传递方式只有一种:值传递(pass by value), 所谓值传递,就是讲实际参数的影分身传入到方法内,而参数本身不会发生任何变化。

可以理解为你在画图工具上画了一个图,再复制一份,你对复制品的任何涂改不会影响之前原版的画。

1、 将八大基本数据类型作为传递的参数
  • 以int类型为例子:
public class HelloJimmy {
public static void main(String[] args) {
        int a = 40;
        changeInt(a);
        System.out.println(a);
      }
      public static void changeInt(int b) {
        b=30;
      }
}//输出了40,可以看到将a作为参数传入,main方法中的a值并未受到影响
2、 将引用数据类型作为传递的参数
  • 以数组类型为例子
import java.util.Arrays;
public class HelloJimmy {
public static void main(String[] args) {
int[] a = { 23, 4, 5, 142 };
        changeInt(a);
        System.out.println(Arrays. toString (a));
      }
      public static void changeInt( int [] b) {
        b[0] = 100;
      }
}//输出结果为[100, 4, 5, 142],数组的内容受到了影响

不是说值传递吗,参数本身不会发生变化吗,为什么引用数据类型的值会受到影响?


首先我们来看一下Java的内存知识:

Java虚拟机在运行的时候时要开辟内存空间的,启动时在自己的内存区域中还要进行更细致的划分。

JVM内存的划分有5片:

1、寄存器

2、本地方法区

3、方法区

4、栈内存:栈的优势是,存取速度比堆要快,仅次于寄存器

栈 存储的都是局部变量,凡是定义在方法中的都是局部变量(方法之外的是全局变量),主要存放8大基本类型的变量。变量都有自己的作用域,一旦程序离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

5、堆内存:存储的是数组和对象(其实数组就是对象 )

数组的父类也是Object, java中数组的创建使用了关键字new,凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。


因此,根据Java内存机制,我们有图,数组对象存放在了堆里:

img

在上面数组作为参数传递的例子中,在方法中传递引用的时候,引用被复制了两份,因此a引用的对象会被修改,数组a本身的值受到了影响。

img

3、 将String这一特殊引用类型作为传递的参数

String是一种特殊的引用类型,作为参数传递时,实参的值不会受到影响。如:

public class HelloJimmy {
	public static void main(String[] args) {
		String str = "Hello world";
		changeString(str);
		System.out.println(str);
	}
	public static void changeString(String s) {
		s = "Hello Krystal";
	}
}//结果输出为Hello world

此时s和str引用的对象一样,都是“hello world”,但经过s = "Hello Krystal";操作后,由于字符串的不可变性,此时s会引用一个新对象,s指向”Hello Krystal”的位置,s的hashcode值变化了,但str依旧引用着对象”Hello world”

可变参数

方法的可变参数声明如下:

typename...parametername//在指定类型后加一个省略号(...)
//一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

案例:

package test;

public class PrintMaxNumber {
    public static void main(String[] args) {
        ReturnMaxNumber a=new ReturnMaxNumber();
        System.out.println(a.findM(12.5,23,45,7.8,3));
        //结果输出了45.0
    }
}
class ReturnMaxNumber{ 
    public double findM(double...numbers){  //在类内写一个返回最大值的方法
        double maxNunber=numbers[0];//初始化最大值为第一个数字
        for (int i = 1; i < numbers.length; i++) {
            if (maxNunber<numbers[i]){
                maxNunber=numbers[i];
            }
        }
        return maxNunber; //返回最终的最大值
    }
}

posted @ 2020-08-29 07:03  Whatever_It_Takes  阅读(126)  评论(0编辑  收藏  举报