zoukankan      html  css  js  c++  java
  • Java面向对象基础之可变参数

    可变参数

    JDK1.5之后,如果我们定义一个方法时,此时某个形参的类型可以确定,但是形参的个数不确定,那么我们可以使用可变参数。

    修饰符 返回值类型 方法名(【非可变参数部分的形参列表,】参数类型... 形参名){  }
    

    要求:

    (1)一个方法只能有一个可变参数

    (2)可变参数必须是形参列表的最后一个

    (3)其实这个书写“等价于”

    示例

    class Count {
    	// 完成数组 所有元素的求和
    	// 原始写法
    	public int getSum1(int[] arr) {
    		int sum = 0;
    		for (int i = 0; i < arr.length; i++) {
    			sum += arr[i];
    		}
    		return sum;
    	}
    	// 可变参数写法
    	public int getSum2(int... arr) {
    		int sum = 0;
    		for (int i = 0; i < arr.length; i++) {
    			sum += arr[i];
    		}
    		return sum;
    	}
    }
       
    // 创建对象
    Count c = new Count();
    int[] arr = { 1, 4, 62, 431, 2 };
    int sum1 = c.getSum1(arr);
    //可变参数既可以传递数组,又可以直接传递数组的元素
    int sum2 = c.getSum2(arr);
    System.out.println(sum2);
    
    int sum3 = c.getSum2(1, 4, 62, 431, 2);
    System.out.println(sum3); 

    方法重载

    • 方法重载:指在同一个类中,允许存在一个以上的同名方法,只要它们的参数列表不同即可,与修饰符和返回值类型无关。

    • 参数列表:数据类型个数不同,数据类型不同,数据类型顺序不同。

    • 重载方法调用:JVM通过方法的参数列表,调用不同的方法。

    //求两个整数的最大值
    public int max(int a,int b){
        return a>b?a:b;
    }
    	
    //求三个整数的最大值
    public int max(int a, int b, int c){
        return max(max(a,b),c);
    }
    	
    //求两个小数的最大值
    public double max(double a, double b){
        return a>b?a:b;
    }
    

    方法的参数传递机制

    - 形参:在定义方法时方法名后面括号中的变量名称称为形式参数(简称形参),即形参出现在方法定义中。
    - 实参:调用者方法中调用另一个方法时,方法名后面括号中的参数称为实际参数(简称实参),即实参出现在调用者方法中。
    - 方法的参数传递机制:实参给形参赋值
      - 方法的形参是基本数据类型时,形参值的改变不会影响实参;
      - 方法的形参是引用数据类型时,形参地址值的改变不会影响实参,但是形参地址值里面的数据的改变会影响实参,例如,修改数组元素的值,或修改对象的属性值。
        - 注意:String、Integer等特殊类型除外 

    示例

    /*
    陷阱1:在方法中,形参 = 新new对象,那么就和实参无关了
    */
    class Test{
        public static void change(MyData my){
            my = new MyData();//形参指向了新对象
            my.num *= 2;
        }
        
        public static void main(String[] args){
            MyData m = new MyData();
            m.num = 1;
            
            change(m);//调用完之后,m对象的num属性值仍然为1
        }
    }
    
    class MyData{
        int num;
    }
    

    递归方法(recursion)

    • 递归:指在当前方法内调用自己的这种现象。

    • 递归的分类:

      • 递归分为两种,直接递归和间接递归。

      • 直接递归称为方法自身调用自己。

      • 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。

    • 注意事项

      • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。

      • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。

      

    后续补充示例

    对象数组

    数组是用来存储一组数据的容器,一组基本数据类型的数据可以用数组装,那么一组对象也可以使用数组来装。

    即数组的元素可以是基本数据类型,也可以是引用数据类型。当元素是引用数据类型是,我们称为对象数组。

    注意:对象数组,首先要创建数组对象本身,即确定数组的长度,然后再创建每一个元素对象,如果不创建,数组的元素的默认值就是null,所以很容易出现空指针异常NullPointerException。

    示例

    class MyDate{
    	int year;
    	int month;
    	int day;
    }
    class Test{
        public static void main(String[] args){
            MyDate[] arr = new MyDate[3];//创建数组对象本身,指定数组的长度
            
            for(int i=0; i<arr.length; i++){
                arr[i] = new MyDate();//每一个元素要创建对象
                arr[i].year = 1990 + i;
                arr[i].month = 1 + i;
                arr[i].day = 1 + i;
            }
        }
    }
    

      

      

    public static void main(String[] args) {
            Test test=new Test();
            test.hello(0);
    
    
    public void hello(int a){
            System.out.println("hello world"+a);
            if(a<2){
                a++;
                hello(a);
    
    
    实例调用函数的时候 直接传递实参,和函数在同一个作用域,函数内声明了类型,在栈内存中开启空间,所以不用在调用的时候在声明类型

      

    本文为原创文章,转载请标明出处
  • 相关阅读:
    iptables关键学习总结
    iptables关键学习总结
    .net中操作Visual SourceSafe
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/harden13/p/14502709.html
Copyright © 2011-2022 走看看