zoukankan      html  css  js  c++  java
  • Java的方法

    以下内容引用自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("
    **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("
    **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

  • 相关阅读:
    Golang Json文件解析为结构体工具-json2go
    沉浸式状态栏的简易实现
    高级数据结构及应用 —— 使用 bitmap 进行字符串去重
    机器学习:Kullback-Leibler Divergence (KL 散度)
    机器学习: 共轭梯度算法(PCG)
    二进制比特位运算
    C 语言经典面试题 —— 宏
    python base64 编解码,转换成Opencv,PIL.Image图片格式
    Kaggle:House Prices: Advanced Regression Techniques 数据预处理
    maven 细节 —— scope、坐标
  • 原文地址:https://www.cnblogs.com/EasonJim/p/6930212.html
Copyright © 2011-2022 走看看