• Java——Java方法


      一般情况下,定义一个方法包含以下语法:

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

      方法包含一个方法头和一个方法体。下面是一个方法的所有部分:

    • 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
    • 返回值类型 :方法可能会返回值。returnValueType是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType是关键字void
    • 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
    • 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
    • 方法体:方法体包含具体的语句,定义该方法的功能。

    注意: 在一些其它语言中方法指过程和函数。一个返回非void类型返回值的方法称为函数;一个返回void类型返回值的方法叫做过程。

    方法调用

      Java支持两种调用方法的方式,根据方法是否返回值来选择。

      1.当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。

      2.当方法返回一个值的时候,方法调用通常被当做一个值。

    int larger = max(30, 40);
    //max会返回一个值

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

    System.out.println("Welcome to Java!");
    //println()返回值为void类型,所以上述调用println()是一条语句

    示例

    public class TestMax {
       /** 主方法 */
       public static void main(String[] args) {
          int i = 5;
          int j = 2;
          int k = max(i, j);
          System.out.println("The maximum between " + i +
                        " and " + j + " is " + k);
       }
    
       /** 返回两个整数变量较大的值 */
       public static int max(int num1, int num2) {
          int result;
          if (num1 > num2)
             result = num1;
          else
             result = num2;
    
          return result; 
       }
    }
    /*
    这个程序包含main方法和max方法。Main方法是被JVM调用的,除此之外,main方法和其它方法没什么区别。 
    main方法的头部是不变的,如例子所示,带修饰符public和static,返回void类型值,方法名字是main,此外带个一个String[]类型参数。String[]表明参数是字符串数组。 
    */

    void 关键字

      下面的例子声明了一个名为printGrade的方法,并且调用它来打印给定的分数。

     1 public class TestVoidMethod {
     2 
     3    public static void main(String[] args) {
     4       printGrade(78.5);
     5    }
     6 
     7    public static void printGrade(double score) {
     8       if (score >= 90.0) {
     9          System.out.println('A');
    10       }
    11       else if (score >= 80.0) {
    12          System.out.println('B');
    13       }
    14       else if (score >= 70.0) {
    15          System.out.println('C');
    16       }
    17       else if (score >= 60.0) {
    18          System.out.println('D');
    19       }
    20       else {
    21          System.out.println('F');
    22       }
    23    }
    24 }
    25 /*
    26 这里printGrade方法是一个void类型方法,它不返回值。 
    27 一个void方法的调用一定是一个语句。 所以,它被在main方法第三行以语句形式调用。就像任何以分号结束的语句一样。 
    28 */

    通过值传递参数

    • 形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
    • 实参出现在主调函数中,进入被调函数后,实参变量也不能使用。 
    • 形参和实参的功能是作数据传送。发生函数调用时,主调函数把实参的值传送给被调函数的形参从而实现主调函数向被调函数的数据传送
    1. 形参变量只有在被调用时才分配内存单元,在调用结束时, 即刻释放所分配的内存单元。因此,形参只有在函数内部有效。 函数调用结束返回主调函数后则不能再使用该形参变量。
    2. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。 因此应预先用赋值,输入等办法使实参获得确定值。
    3. 实参和形参在数量上,类型上,顺序上应严格一致, 否则会发生“类型不匹配”的错误。
    4. 函数调用中发生的数据传送是单向的。 即只能把实参的值传送给形参,而不能把形参的值反向地传送给实参。 因此在函数调用过程中,形参的值发生改变,而实参中的值不会变化。
    5. 当形参和实参不是指针类型时,在该函数运行时,形参和实参是不同的变量,他们在内存中位于不同的位置,形参将实参的内容复制一份,在该函数运行结束的时候形参被释放,而实参内容不会改变。
      如果函数的参数是指针类型变量,在调用该函数的过程中,传给函数的是实参的地址,在函数体内部使用的也是实参的地址,即使用的就是实参本身。所以在函数体内部可以改变实参的值。

    方法的重载

      上面使用的max方法仅仅适用于int型数据。但如果你想得到两个浮点类型数据的最大值呢?

      解决方法是创建另一个有相同名字但参数不同的方法,如下面代码所示:

    //int型数据
    public static int max(int num1, int num2) {
       int result;
       if (num1 > num2)
          result = num1;
       else
          result = num2;
    
       return result; 
    }
    
    //浮点类型数据
    public static double max(double num1, double num2) {
      if (num1 > num2)
        return num1;
      else
        return num2;
    }

      如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用;如果传递的事double型参数,则double类型的max方法体会被调用,这叫做方法重载;就是说一个类的两个方法拥有相同的名字,但是有不同的参数列表。Java编译器根据方法签名判断哪个方法应该被调用。

      方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。

    变量作用域

    • 变量的范围是程序中该变量可以被引用的部分。
    • 方法内定义的变量被称为局部变量。局部变量的作用范围从声明开始,直到包含它的块结束。局部变量必须声明才可以使用。
    • 方法的参数范围涵盖整个方法。参数实际上是一个局部变量。

      for循环的初始化部分声明的变量,其作用范围在整个循环。但循环体内声明的变量其适用范围是从它声明到循环体结束。它包含如下所示的变量声明:

      可以在一个方法里,不同的非嵌套块中多次声明一个具有相同的名称局部变量,但你不能在嵌套块内两次声明局部变量。

    命令行参数的使用

      有时候你希望运行一个程序时候再传递给它消息。这要靠传递命令行参数给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]);
          }
       }
    }
    
    /*运行输出:
    args[0]: this
    args[1]: is
    args[2]: a
    args[3]: command
    args[4]: line
    args[5]: 200
    args[6]: -100
    */

    构造方法

    •   当一个对象被创建时候,构造方法用来初始化该对象
    •   构造方法和它所在类的名字相同,但构造方法没有返回值
    •   通常会使用构造方法给一个类的实例变量赋初值,或者执行其它必要的步骤来创建一个完整的对象。不管你与否自定义构造方法,所有的类都有构造方法,因为Java自动提供了一个默认构造方法,它把所有成员初始化为0。
    •   一旦你定义了自己的构造方法,默认构造方法就会失效。

    可变参数

      JDK 1.5 开始,Java支持传递同类型的可变参数给一个方法。

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

    typeName... parameterName

      在方法声明中,在指定参数类型后加一个省略号(...) 。

      一个方法中只能指定一个可变参数,它必须是方法的最后一个参数。任何普通的参数必须在它之前声明。

    实例

    public class VarargsDemo {
    
       public static void main(String 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() 方法

    •   Java允许定义这样的方法,它在对象被垃圾收集器析构(回收)之前调用,这个方法叫做finalize( ),它用来清除回收对象。
    •   例如,你可以使用finalize()来确保一个对象打开的文件被关闭了。
    •   在finalize()方法里,你必须指定在对象销毁时候要执行的操作。

    finalize()一般格式是:

    protected void finalize()
    {
       // 在这里终结代码
    }
    
    /*关键字protected是一个限定符,它确保finalize() 方法不会被该类以外的代码调用。
    当然,Java的内存回收可以由JVM来自动完成。如果你手动使用,则可以使用上面的方法。*/

    实例:

    public class FinalizationDemo {  
        public static void main(String[] args) {  
            Cake c1 = new Cake(1);  
            Cake c2 = new Cake(2);  
            Cake c3 = new Cake(3);  
              
            c2 = c3 = null;  
            System.gc(); //调用Java垃圾收集器
        }  
    }  
      
    class Cake extends Object {  
        private int id;  
        public Cake(int id) {  
            this.id = id;  
            System.out.println("Cake Object " + id + "is created");  
        }  
          
        protected void finalize() throws java.lang.Throwable {  
            super.finalize();  
            System.out.println("Cake Object " + id + "is disposed");  
        }  
    }  
    /*输出结果
    C:1>java FinalizationDemo  
    Cake Object 1is created  
    Cake Object 2is created  
    Cake Object 3is created  
    Cake Object 3is disposed  
    Cake Object 2is disposed 
    */
  • 相关阅读:
    面试8:找二叉树的下个结点
    面试8:找二叉树的下个结点
    面试题7:重建二叉树
    面试题7:重建二叉树
    Kenneth A.Lambert著的数据结构(用python语言描述)的第一章课后编程答案
    基础的Mapgis三维二次开发-插件式
    面试题6:从尾到头打印链表
    C语言中声明和定义详解(待看。。
    面试题5:替换空格
    面试题5:替换空格
  • 原文地址:https://www.cnblogs.com/sheropan/p/5102418.html
Copyright © 2020-2023  润新知