记下自己一直比较模糊的东西(1)

来源:互联网 发布:org.apache.tools下载 编辑:程序博客网 时间:2024/05/17 03:06

  返回值问题

,如果返回值类型不是void时,需要保证有值返回,例如下面的方法就有语法错误:

           public int test(int a){
                    if(a < 0){
                             return 0;
                    }
           }
则该方法的声明代码中,当a的值大于等于零时,则没有返回值,这语法上称作返回值丢失,这个也是在书写return语句时需要特别注意的问题。
 
一个类内部方法调用语法
         在前面的代码框架中,以下代码就是声明类的结构:
                   public class 文件名{
         在该声明后续大括号内部的代码,称作一个类的内部。
         在进行方法调用时,调用的语法格式和static修饰符有关,所以按照一个方法在声明时是否有static修饰分为两类:
有static修饰的称作静态方法
没有static修饰的称作非静态方法
这样一个类内部的方法调用就存在四种情况:
在非静态方法内部调用非静态方法
在非静态方法内部调用静态方法
在静态方法内部调用静态方法
在静态方法内部调用非静态方法
其中前三种情况的调用都是直接调用,直接调用的语法格式为:
         方法名(参数1值,……);
这里方法名为被调用的方法名称,后续紧跟一对小括号,括号内部依次书写调用该方法时传入参数的值,语法上要求传入参数的个数、每个参数的类型都必须和方法声明时保持一致。而这里调用的表达式就代表方法的返回值,可以根据需要使用返回值进行赋值。
示例代码如下:
         public class CallMethod{
                  public static void main(String[] args){
                            int a = 10;
                            int b = 2;
                            int c = 3;
                            int d = 32;
                            max(a,b); //只比较,比较以后返回值丢失
                            int n = max(5,a); //比较,并把返回值赋值给变量n
                            int m = max(c,d); //比较,并把返回值赋值给变量m
                            //比较a、b、c、d四个数字的最大值
                            int maxNumber = max(max(a,b),max(c,d)); 
                  }
 
                  public static int max(int a,int b){
                            if(a > b){
                                     return a;
                            }else{
                                     return b;
                            }
                  }
}
         该示例在静态的main方法内部调用静态的max方法,因为max方法在声明时参数列表为2个int的参数,则调用的时候必须传入2个int值,可以是int的变量也可以是int数值。则调用的基本格式为:
                   max(参数值1,参数值2)
         调用的表达式可以在代码中单独成行,当方法的返回值类型不是void时,可以接收方法的返回值,也可以不接收。方法的返回值是一个确定类型的值,所以在以上比较时,方法调用之间可以进行嵌套。
                   int maxNumber = max(max(a,b),max(c,d));
         其中max(a,b)是获得a和b的最大值,max(c,d)是获得c和d的最大值,然后比较两个获得的最大值,该代码的功能和以下代码的功能相同:
                   int maxNumber = max(a,max(b,max(c,d)));
         总得来说,前三种情况的调用都是使用该种格式。
         对于最后一种情况,也就是在静态方法内部调用非静态的结构在语法上则比较复杂,以下是一个简单的示例:
                  public class CallMethod2{
                            public static void main(String[] args){
                                      CallMethod2 cm = new CallMethod2();
                                      int n = cm.max(1,2);
                            }
 
                            public int max(int a,int b){
                                      if(a > b){
                                               return a;
                                      }else{
                                               return b;
                                      }
                            }
}
         在该代码涉及的语法格式在后续的代码中将进行讲解,这里只做简单的说明。其中:
                   CallMethod2 cm = new CallMethod2();
         该行代码声明并创建了一个CallMethod2类型的对象cm。接着的代码:
                  int n = cm.max(1,2);
         在调用max方法时,则使用对象名.方法名调用对应的方法,这里参数的规则和上面介绍的相同。
 在方法调用时,需要根据方法声明传入适当的参数,通过每次调用方法时传参,极大的增强了方法的统一性,避免了方法内部功能代码的重复。但是在实际传递参数时,如果在方法内部修改了参数的值,则调用时使用的变量是否发生改变呢?

         例如如下代码:

                   /**

 * 参数传递代码示例

 */

public class TransferValueDemo {

                            public static void main(String[] args) {

                                      int m = 10;

                                      int[] a = {1,2,34};

                                      test(m,a);

                                      System.out.println(m);

                                      System.out.println(a[0]);

                            }       

                            public static void test(int n,int[] t){

                                      n = 0;

                                      t[0] = 123;

                            }

}

         则执行该程序以后,程序的输出结果是:10  123。则在调用test方法时,同样都是传入参数,为什么变量m的值未改变,而a[0]的值发生了改变呢?下面就来说明该问题。

         在参数传递时,一般存在两种参数传递的规则,在Java语言中也是这样,这两种方式依次是:

l  按值传递(by value)

按值传递指每次传递参数时,把参数的原始数值拷贝一份新的,把新拷贝出来的数值传递到方法内部,在方法内部修改时,则修改的时拷贝出来的值,而原始的值不发生改变。

说明:使用该方式传递的参数,参数原始的值不发生改变。

l  按址传递(by address)

按址传递指每次传递参数时,把参数在内存中的存储地址传递到方法内部,在方法内部通过存储地址改变对应存储区域的内容。由于在内存中固定地址的值只有一个,所以当方法内部修改了参数的值以后,参数原始的值发生改变。

说明:使用该方式传递的参数,在方法内部修改参数的值时,参数原始的值也发生改变。

         Java语言中,对于那些数据类型是按值传递,那些数据类型是按址传递都作出了硬性规定,如下所示:

l  按值传递的数据类型:八种基本数据类型和String

l  按址传递的数据类型:除String以外的所有复合数据类型,包括数组、类和接口

按照这里的语法规则,则上面的代码中变量m的类型是int,属于按值传递,所以在方法内部修改参数的值时m的值不发生改变,而a的类型是数组,属于按址传递,所以在方法内部修改参数的值时,原始的值发生了改变。

按值传递和按址传递在实际使用时,需要小心,特别是在方法内部需要修改参数的值时。有些时候,对于按值传递的参数需要修改参数的值,或者按址传递时,不想修改参数的值,下面是实现这两种方式时的示例代码。

按值传递时通过返回值修改参数的值:

         /**

 * 按值传递的类型通过返回值修改参数的值

 */

public class TransferValueDemo1 {

                  public static void main(String[] args) {

                            int m = 10;

                            m = test1(m);  //手动赋值

                            System.out.println(m);

                  }

                  public static int test1(int n){

                            n = 15;

                            return n;

                  }

}

         在该示例代码中,通过把修改以后的参数n的值返回,来为变量m赋值,强制修改按值传递参数的值,从而达到修正参数值的目的。

         按址传递时通过重新生成变量避免修改参数的值:

                  /**

 * 按址传递时通过重新生成变量避免修改参数的值

 */

public class TransferValueDemo2 {

                            public static void main(String[] args) {

                                      int[] a = {1,2,3};

                                      test2(a);

                                      System.out.println(a[0]);

                            }       

                            public static void test2(int[] m){

                                      int[] n = new int[m.length];

                                      for(int i = 0;i < m.length;i++){

                                               n[i] = m[i];

                                      }

                                      n[0] = 10; 

                            }

}

         在该示例代码中,通过在方法内部创新创建一个数组,并且把传入数组中每个参数的值都赋值给新创建的数组,从而实现复制数组内容,然后再修改复制后数组中的值时,原来的参数内容就不发生改变了。

         这里系统介绍了Java语言中参数传递的规则,深刻理解这些规则将可以更加灵活的进行程序设计。例如使用复合数据类型按址传递的特性可以很方便的实现多参数的返回,代码示例如下:

                   public int test3(int[] m,int[] n){……}

         则该方法中,实际上返回了三种值,一个int的返回值,数组m的值,数组n的值,这只是参数传递的一种基本使用,在JDK提供的API文档中也大量的存在该方法。

 
 
 
原创粉丝点击