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

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

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

一、创建方法

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

public static int funcName(int a, int b) {
// body
}

在这里

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

方法也包含过程或函数。

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

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

modifier returnType nameOfMethod (Parameter List) {
// method body
}

以上的语法包括

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

示例:

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

/** the snippet returns the minimum between two numbers */
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1; return min;
}

二、方法调用

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

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

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

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

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

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

int result = sum(6, 9);

示例:

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

public class ExampleMinNumber{

   public static void main(String[] args) {
int a = 11;
int b = 6;
int c = minFunction(a, b);
System.out.println("Minimum Value = " + c);
} /** returns the minimum of two numbers */
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1; return min;
}
}
//将会产生如下的结果
Minimum value = 6

三、关键字void

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

public class ExampleVoid {

   public static void main(String[] args) {
methodRankPoints(255.7);
} public static void methodRankPoints(double points) {
if (points >= 202.5) {
System.out.println("Rank:A1");
}
else if (points >= 122.4) {
System.out.println("Rank:A2");
}
else {
System.out.println("Rank:A3");
}
}
}
//这将产生如下的结果:
Rank:A1

四、通过值来传递参数

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

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

示例:

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

public class SwappingExample {

   public static void main(String[] args) {
int a = 30;
int b = 45; System.out.println("Before swapping, a = " + a + " and b = " + b); // Invoke the swap method
swapFunction(a, b);
System.out.println("\n**Now, Before and After swapping values will be same here**:");
System.out.println("After swapping, a = " + a + " and b is " + b);
} public static void swapFunction(int a, int b) { System.out.println("Before swapping(Inside), a = " + a + " b = " + b);
// Swap n1 with n2
int c = a;
a = b;
b = c; System.out.println("After swapping(Inside), a = " + a + " b = " + b);
}
}
//这将产生如下的结果:
Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30 **Now, Before and After swapping values will be same here**:
After swapping, a = 30 and b is 45

五、通过引用传递参数

示例:

package com.jsoft.testjavabasics.test1;

public class SwappingExample1 {

    public static void main(String[] args) {
int[] ab={30,45}; System.out.println("Before swapping, a = " + ab[0] + " and b = " + ab[1]); // Invoke the swap method
swapFunction(ab);
System.out.println("\n**Now, Before and After swapping values will be same here**:");
System.out.println("After swapping, a = " + ab[0] + " and b is " + ab[1]);
} public static void swapFunction(int[] ab) { System.out.println("Before swapping(Inside), a = " + ab[0] + " b = " + ab[1]);
// Swap n1 with n2
ab[0] = 45;
ab[1] = 30; System.out.println("After swapping(Inside), a = " + ab[0] + " b = " + ab[1]);
}
}
//这将产生如下的结果:
Before swapping, a = 30 and b = 45
Before swapping(Inside), a = 30 b = 45
After swapping(Inside), a = 45 b = 30 **Now, Before and After swapping values will be same here**:
After swapping, a = 45 and b is 30

说明:

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

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

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

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

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

六、方法的重载

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

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

下面的例子给予解释:

public class ExampleOverloading{

   public static void main(String[] args) {
int a = 11;
int b = 6;
double c = 7.3;
double d = 9.4;
int result1 = minFunction(a, b);
// same function name with different parameters
double result2 = minFunction(c, d);
System.out.println("Minimum Value = " + result1);
System.out.println("Minimum Value = " + result2);
} // for integer
public static int minFunction(int n1, int n2) {
int min;
if (n1 > n2)
min = n2;
else
min = n1; return min;
}
// for double
public static double minFunction(double n1, double n2) {
double min;
if (n1 > n2)
min = n2;
else
min = n1; return min;
}
}
//这将产生如下结果:
Minimum Value = 6
Minimum Value = 7.3

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

七、使用命令行参数

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

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

示例:

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

public class CommandLine {

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

八、构造函数

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

// A simple constructor.
class MyClass {
int x; // Following is the constructor
MyClass() {
x = 10;
}
}

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

public class ConsDemo {

   public static void main(String args[]) {
MyClass t1 = new MyClass();
MyClass t2 = new MyClass();
System.out.println(t1.x + " " + t2.x);
}
}

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

示例:

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

// A simple constructor.
class MyClass {
int x; // Following is the constructor
MyClass(int i ) {
x = i;
}
}
//可以通过以下方法来调用构造函数来实例化一个对象:
public class ConsDemo { public static void main(String args[]) {
MyClass t1 = new MyClass( 10 );
MyClass t2 = new MyClass( 20 );
System.out.println(t1.x + " " + t2.x);
}
}
//这将产生如下的结果:
10 20

九、可变长参数

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

typeName... parameterName

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

示例:

public class VarargsDemo {

   public static void main(String args[]) {
// Call method with variable args
printMax(34, 3, 3, 2, 56.5);
printMax(new double[]{1, 2, 3});
} public static void printMax( double... numbers) {
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
} double result = numbers[0]; for (int i = 1; i < numbers.length; i++)
if (numbers[i] > result)
result = numbers[i];
System.out.println("The max value is " + result);
}
}
//这将产生如下的结果:
The max value is 56.5
The max value is 3.0

十、finalize()方法

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

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

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

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

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

protected void finalize( )
{
// finalization code here
}

这里,关键字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. MyEclipse 2015 安装到配置一站式备忘

    目录 h1 2121 h1 2121

  2. 联玛客(W 笔试)

    纸质算法题 1. 输入数据:1.3.2.4.8... 输出数据:3.1.4.2.8... 找出规律,写出一个程序求解,并附上时间复杂度和空间复杂度 我的答案: 规律一:奇偶位互换 假设输入数据长度为5 ...

  3. android打包需要的图标

    ldpi:mdpi:hdpi:xhdpi:xxhdpi=3:4:6:8:12 大小: 32x32.png 48 72 96 144

  4. python基础一 day4 字典

    增加:   结果 删:  结果: 结果:   返回值是一个元组形式的键值   改: 结果: 结果:                                      代码: info=inpu ...

  5. linux_2

    mac和linux上默认安装着SSH客户端,Windows上需要自己安装个软件. Windows下SSH客户端的安装:建议从官方网站下载正式程序安装(免费) Putty:https://www.chi ...

  6. 用Jenkins构建项目实战

    登录Jenkins,新建任务 输入一个任务名称,选择一个项目类型 使用自定义工作空间:使该项目独立于系统的工作空间 自动从Git下载源码,点击添加可以增加凭证 日程表的参数: 第一个参数代表的是分钟 ...

  7. GIT的简介

    本文来自:https://www.breakyizhan.com/git/32.html 这篇GIT教程提供了GIT的基本和高级概念,主要是面向GIT的初学者和专业人士来编写的. 什么是GIT呢? G ...

  8. 将树莓派3B+变成WiFi热点

    我有一个树莓派3B+,安装的是官方的Raspbian Stretch操作系统,该系统和Debian 9很类似,很多命令都是通用的. 接下来我将演示如何利用树莓派搭建WiFi热点,此热点就和家里的无线路 ...

  9. (转)]PYTHON Tkinter GUI

    import Tkinterroot=Tkinter.Tk()label=Tkinter.Label(root,text='hello ,python')label.pack()      #将LAB ...

  10. ssm依赖

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...