以下内容引用自http://wiki.jikexueyuan.com/project/java/methods.html

一个Java方法是为了执行某个操作的一些语句的组合。举个例子来说,当调用System.out.println方法时,系统实际上会执行很多语句才能在控制台上输出信息。

下面开始创建方法,可以有返回值也可以没有返回值,可以有参数,也可以没有参数,重载方法要使用相同的方法名称,并在程序设计中利用抽象的方法。

一、创建方法

用下面的例子来解释方法的语法:

  1. public static int funcName(int a, int b) {
  2. // body
  3. }

在这里

  • public static:修饰符(描述符)
  • int:返回值类型
  • funcName:函数名称
  • a,b:形式参数
  • int a,int b:参数列

方法也包含过程或函数。

  • 过程:他们不返回值
  • 函数:他们返回值

方法的定义包含方法头和方法体。如下所示:

  1. modifier returnType nameOfMethod (Parameter List) {
  2. // method body
  3. }

以上的语法包括

  • modifier:他定义了方法的访问类型,它是可选的。
  • returnType:方法是可能返回一个值的。
  • nameOfMethod:这是方法的名称。方法签名包括方法名称和参数列表。
  • Parameter List:参数列表,它是参数的次序,类型,以及参数个数的集合。这些都是可选的,当然方法也可以没有参数。
  • method body:方法体定义了这个方法是用来做什么的。

示例:

这是上面定义的方法minFunction(),该方法接受两个参数n1和n2返回两者之间的最大值。

  1. /** the snippet returns the minimum between two numbers */
  2. public static int minFunction(int n1, int n2) {
  3. int min;
  4. if (n1 > n2)
  5. min = n2;
  6. else
  7. min = n1;
  8.  
  9. return min;
  10. }

二、方法调用

要想使用一个方法,该方法必须要被调用。方法调用有两种方式,一种是有返回值的,一种是没有返回值的。

调用方法很简单,当程序需要调用一个方法时,控制程序转移到被调用的方法,方法将会返回两个条件给调用者:

  • 返回一条执行语句
  • 执行到方法结束

将返回void的方法作为一个调用语句,看下面的例子:

  1. System.out.println("wiki.jikexueyuan.com!");

而该方法的返回值可以通过下面的例子被理解:

  1. int result = sum(6, 9);

示例:

下面的例子表明了怎么定义方法和怎么调用它:

  1. public class ExampleMinNumber{
  2.  
  3. public static void main(String[] args) {
  4. int a = 11;
  5. int b = 6;
  6. int c = minFunction(a, b);
  7. System.out.println("Minimum Value = " + c);
  8. }
  9.  
  10. /** returns the minimum of two numbers */
  11. public static int minFunction(int n1, int n2) {
  12. int min;
  13. if (n1 > n2)
  14. min = n2;
  15. else
  16. min = n1;
  17.  
  18. return min;
  19. }
  20. }
  21. //将会产生如下的结果
  22. Minimum value = 6

三、关键字void

关键字void允许创建一个没有返回值的方法。这个例子中创建一个void方法methodRankPoints。这个方法是没有返回值类型的。调用void方法必须声明methodRankPoints(255.7);Java语句以分号结束,如下所示:

  1. public class ExampleVoid {
  2.  
  3. public static void main(String[] args) {
  4. methodRankPoints(255.7);
  5. }
  6.  
  7. public static void methodRankPoints(double points) {
  8. if (points >= 202.5) {
  9. System.out.println("Rank:A1");
  10. }
  11. else if (points >= 122.4) {
  12. System.out.println("Rank:A2");
  13. }
  14. else {
  15. System.out.println("Rank:A3");
  16. }
  17. }
  18. }
  19. //这将产生如下的结果:
  20. Rank:A1

四、通过值来传递参数

在调用函数时参数是必须被传递的。并且他们的次序必须和他们创建时的参数次序是一样的。参数可以通过值或引用来传递。

通过值传递参数意味着调用方法的参数,通过参数值来传递给参数。

示例:

下面的程序给出了一个例子来显示通过值来传递参数。在调用方法后参数值是不会发生变化的。

  1. public class SwappingExample {
  2.  
  3. public static void main(String[] args) {
  4. int a = 30;
  5. int b = 45;
  6.  
  7. System.out.println("Before swapping, a = " + a + " and b = " + b);
  8.  
  9. // Invoke the swap method
  10. swapFunction(a, b);
  11. System.out.println("\n**Now, Before and After swapping values will be same here**:");
  12. System.out.println("After swapping, a = " + a + " and b is " + b);
  13. }
  14.  
  15. public static void swapFunction(int a, int b) {
  16.  
  17. System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
  18. // Swap n1 with n2
  19. int c = a;
  20. a = b;
  21. b = c;
  22.  
  23. System.out.println("After swapping(Inside), a = " + a + " b = " + b);
  24. }
  25. }
  26. //这将产生如下的结果:
  27. Before swapping, a = 30 and b = 45
  28. Before swapping(Inside), a = 30 b = 45
  29. After swapping(Inside), a = 45 b = 30
  30.  
  31. **Now, Before and After swapping values will be same here**:
  32. After swapping, a = 30 and b is 45

五、通过引用传递参数

示例:

  1. package com.jsoft.testjavabasics.test1;
  2.  
  3. public class SwappingExample1 {
  4.  
  5. public static void main(String[] args) {
  6. int[] ab={30,45};
  7.  
  8. System.out.println("Before swapping, a = " + ab[0] + " and b = " + ab[1]);
  9.  
  10. // Invoke the swap method
  11. swapFunction(ab);
  12. System.out.println("\n**Now, Before and After swapping values will be same here**:");
  13. System.out.println("After swapping, a = " + ab[0] + " and b is " + ab[1]);
  14. }
  15.  
  16. public static void swapFunction(int[] ab) {
  17.  
  18. System.out.println("Before swapping(Inside), a = " + ab[0] + " b = " + ab[1]);
  19. // Swap n1 with n2
  20. ab[0] = 45;
  21. ab[1] = 30;
  22.  
  23. System.out.println("After swapping(Inside), a = " + ab[0] + " b = " + ab[1]);
  24. }
  25. }
  26. //这将产生如下的结果:
  27. Before swapping, a = 30 and b = 45
  28. Before swapping(Inside), a = 30 b = 45
  29. After swapping(Inside), a = 45 b = 30
  30.  
  31. **Now, Before and After swapping values will be same here**:
  32. After swapping, a = 45 and b is 30

说明:

引用类型的示例可以说明,在原始数据类型和引用数据类型中,原始数据类型的内存空间是不可以改变的,声明是存在与栈中;而引用数据类型则是开辟的内存空间在堆中,堆中传递的是内存地址的引用,所以可以改变;而对于上面的例子,类对象和数组变量就是这种引用数据类型,所以值是可以改变的。

但是,有一个特别注意的地方,String类比较特殊,String类定义为final,所以,这个String创建之后也是不可变的。

那还有一些是这样理解的,比如:

  1. int a = 1;
  2. System.out.println(a);//输出1
  3. a = 3;
  4. System.out.println(a);//输出3

其实对于上面的的理解不能用值转换来理解,应该这么说,当定义了int a = 1之后,是在栈中开辟了一块内存空间,然后a = 3时,又在栈中开辟了另一块内存空间,内存地址上已经改变了。所以只会改变;那么对于int a = 1这块内存空间其实还存在于内存上,只是地址头改变成了a = 3的了,a = 1的就变成没用的内存空间,等待JVM虚拟机回收。

六、方法的重载

当一个方法有两个或者更多的方法,他们的名字一样但是参数不同时,就叫做方法的重载。它与覆盖是不同的。覆盖是指方法具有相同的名字,类型以及参数的个数。

考虑之前的找最小整型数的例子。如果要求寻找浮点型中最小的数时,就需要利用方法的重载来去创建函数名相同,但参数不一样的两个或更多的方法。

下面的例子给予解释:

  1. public class ExampleOverloading{
  2.  
  3. public static void main(String[] args) {
  4. int a = 11;
  5. int b = 6;
  6. double c = 7.3;
  7. double d = 9.4;
  8. int result1 = minFunction(a, b);
  9. // same function name with different parameters
  10. double result2 = minFunction(c, d);
  11. System.out.println("Minimum Value = " + result1);
  12. System.out.println("Minimum Value = " + result2);
  13. }
  14.  
  15. // for integer
  16. public static int minFunction(int n1, int n2) {
  17. int min;
  18. if (n1 > n2)
  19. min = n2;
  20. else
  21. min = n1;
  22.  
  23. return min;
  24. }
  25. // for double
  26. public static double minFunction(double n1, double n2) {
  27. double min;
  28. if (n1 > n2)
  29. min = n2;
  30. else
  31. min = n1;
  32.  
  33. return min;
  34. }
  35. }
  36. //这将产生如下结果:
  37. Minimum Value = 6
  38. Minimum Value = 7.3

重载方法使程序易读。在这里,两种方法名称相同但参数不同。产生整型和浮点类型的最小数作为程序运行结果。

七、使用命令行参数

有时想要在程序运行之前传递参数。这可以通过给main函数传递命令行参数来实现。

在命令行中,当要执行程序文件时,一个命令行参数是紧接着文件名字后面的出现的。要接受命令行参数在Java程序中是十分容易的。它们传递到main函数字符数组内。

示例:

下面的例子展示了将所有命令行参数输出的程序:

  1. public class CommandLine {
  2.  
  3. public static void main(String args[]){
  4. for(int i=0; i<args.length; i++){
  5. System.out.println("args[" + i + "]: " + args[i]);
  6. }
  7. }
  8. }
  9. //通过以下方法来执行该程序:
  10. java CommandLine this is a command line 200 -100
  11. //这将产生如下的结果:
  12. args[0]: this
  13. args[1]: is
  14. args[2]: a
  15. args[3]: command
  16. args[4]: line
  17. args[5]: 200
  18. args[6]: -100

八、构造函数

这是一个简单的使用构造函数的例子:

  1. // A simple constructor.
  2. class MyClass {
  3. int x;
  4.  
  5. // Following is the constructor
  6. MyClass() {
  7. x = 10;
  8. }
  9. }

可以通过以下方法来调用构造函数来实例化一个对象:

  1. public class ConsDemo {
  2.  
  3. public static void main(String args[]) {
  4. MyClass t1 = new MyClass();
  5. MyClass t2 = new MyClass();
  6. System.out.println(t1.x + " " + t2.x);
  7. }
  8. }

通常,将需要用构造函数来接受一个或多个参数。参数的传递和以上介绍的普通方法的参数传递是一样的,就是在构造函数的名字后面列出参数列表。

示例:

这是一个简单的使用构造函数的例子:

  1. // A simple constructor.
  2. class MyClass {
  3. int x;
  4.  
  5. // Following is the constructor
  6. MyClass(int i ) {
  7. x = i;
  8. }
  9. }
  10. //可以通过以下方法来调用构造函数来实例化一个对象:
  11. public class ConsDemo {
  12.  
  13. public static void main(String args[]) {
  14. MyClass t1 = new MyClass( 10 );
  15. MyClass t2 = new MyClass( 20 );
  16. System.out.println(t1.x + " " + t2.x);
  17. }
  18. }
  19. //这将产生如下的结果:
  20. 10 20

九、可变长参数

JDK1.5能够允许传递可变长的同一类型的参数。用如下方法进行声明:

  1. typeName... parameterName

方法声明时,要在省略号前明确参数类型,并且只能有一个可变长参数,并且可变长参数必须是所有参数的最后一个。

示例:

  1. public class VarargsDemo {
  2.  
  3. public static void main(String args[]) {
  4. // Call method with variable args
  5. printMax(34, 3, 3, 2, 56.5);
  6. printMax(new double[]{1, 2, 3});
  7. }
  8.  
  9. public static void printMax( double... numbers) {
  10. if (numbers.length == 0) {
  11. System.out.println("No argument passed");
  12. return;
  13. }
  14.  
  15. double result = numbers[0];
  16.  
  17. for (int i = 1; i < numbers.length; i++)
  18. if (numbers[i] > result)
  19. result = numbers[i];
  20. System.out.println("The max value is " + result);
  21. }
  22. }
  23. //这将产生如下的结果:
  24. The max value is 56.5
  25. The max value is 3.0

十、finalize()方法

定义一个方法,仅在被垃圾收集器销毁之前才会被调用。这个方法叫做finalize()方法,它也可以用来确保一个对象被干净清除了。

举个例子,也许用finalize()来确保被一个对象打开的文件已经关闭了。

为了给类添加一个终结器,只需定义finalize()方法。Java要回收该类的一个对象时,会调用该方法。

在finalize()方法中,将指定一些必须在对象销毁之前要做的行为。

finalize()方法一般是如下形似:

  1. protected void finalize( )
  2. {
  3. // finalization code here
  4. }

这里,关键字protected是为了保证在类外的代码不能访问finalize()方法。

这意味着不能知道finalize()什么时候执行。举个例子,如果程序在垃圾收集器发生之前就结束了,finalize()方法将不会被执行。

测试工程:https://github.com/easonjim/5_java_example/tree/master/javabasicstest/test13

Java的方法的更多相关文章

  1. Java:方法的参数是传值还是传引用

    Java中方法的参数总是采用传值的方式. 下列方法欲实现对象的交换,但实际上是不能实现的. public void swap(simpleClass a,simpleClass b){ simpleC ...

  2. Java之方法重载篇(我重载了,你要如何来调用我。。)

      一.课前引言 请看一下代码,你发现什么特殊之处了吗? public class MethodOverload { public static void main(String[] args) { ...

  3. effective java —— 终结方法守卫者

    目录: effective java —— 终结方法守卫者 effective java 第2章:创建和销毁对象.第7条 : 避免使用终结方法.最后的“终结方法守卫者 (finalizer guard ...

  4. Java parseInt()方法

    1.Java parseInt()方法 使用此方法得到的原始数据类型的一个特定的字符串. parseXxx()是一个静态方法,可以有一个参数或两个. java parseInt() 语法:   sta ...

  5. 几种任务调度的 Java 实现方法与比较

    综观目前的 Web 应用,多数应用都具备任务调度的功能.本文由浅入深介绍了几种任务调度的 Java 实现方法,包括 Timer,Scheduler, Quartz 以及 JCron Tab,并对其优缺 ...

  6. JNI系列——C文件中的方法调用Java中方法

    1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...

  7. java中方法参数的一些总结(1)

    1.问题说明        在C++中,函数调用时有传值调用和传址调用两种方式,但在Java中只有传值调用一种方式.Java中的方法参数为那几种基本数据类型的情况跟C++中一样,传入的只是变量的拷贝. ...

  8. 新手容易混乱的String+和StringBuffer,以及Java的方法参数传递方式。

    之前在交流群里和猿友们讨论string+和stringbuffer哪个速度快以及Java的方法参数传递的问题,引起了群里猿友的小讨论.最终LZ得出的结果是string+没有stringbuffer快, ...

  9. JAVA本地方法详解,什么是JAVA本地方法?

    一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个java的方法:该方法的实现由非j ...

  10. Java replace() 方法

    Java replace() 方法 Java String类 replace() 方法通过用 newChar 字符替换字符串中出现的所有 oldChar 字符,并返回替换后的新字符串. 语法 publ ...

随机推荐

  1. easybcd 支持 windows 10 和 ubuntu 14.04 双系统启动

    家里计算机系统 windows 10 全新安装. 原本是双系统的,还有一个ubuntu. windows 10 安装以后,恢复ubuntu就是问题了. (事后经验:请不要立刻安装bcd修改工具) 最初 ...

  2. org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'needDao' defined in URL

    这个是我修改过后的mapper,是我的mapper中的空间地址写错了呢

  3. css广告弹窗满屏跑

    window.onload=function(){ //广告滚动 var oneInner = $('#divid')[0]; //定时器 var a1a = setInterval(moves,10 ...

  4. 为什么要使用spl_autoload_unregister

    最近学习 laravel 源码,发现他的 autoload_real.php 里面有一段: spl_autoload_register(array('ComposerAutoloaderInit290 ...

  5. web测试需要注意点

  6. java生成随机字符

    1.生成的字符串每个位置都有可能是str中的一个字母或数字,需要导入的包是import java.util.Random; //length用户要求产生字符串的长度 public static Str ...

  7. Echarts 异步数据加载遇到的问题

    看了Echarts官网异步加载数据的Demo var myChart = echarts.init(document.getElementById('main')); // 显示标题,图例和空的坐标轴 ...

  8. nginx发布web网站

    修改/conf/nginx.conf配置文件 server { listen *:; # Listen server_name ""; # Don't worry if " ...

  9. 性能优化 java 24 次阅读 · 读完需要 15 分钟 0

    摘要: 技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也会体现在优秀程序员在工作效率提升.产品性能优化和用户体验改善等小技巧方面的分享,以提高我们的 ...

  10. 杭电 1856 More is better (并查集求最大集合)

    Description Mr Wang wants some boys to help him with a project. Because the project is rather comple ...