java成员方法概念知识

java中的不能独立存在,必须定义在类里,逻辑上属于类或对象,因此必须使用类(static修饰的方法)或对象(非static修饰的方法或static修饰的方法)调用(不能独立执行)。

参数传递机制

java中只有一种参数传递机制:值传递,即将实际参数值的副本传入方法,而参数本身不受方法影响。当参数是基本数据类型时,这种机制很好理解,但是当参数是引用类型时,往往会造成误解。直接上例子:

class Data{
    public int i;
    public int j;
    public Data(int i, int j){
        this.i = i;
        this.j = j;
    }
}
public class TransferTest{
    public void swap(int i,int j){
        int temp = 0;
        temp = i;
        i = j;
        j =temp;
    }
    public void swap(Data d){
        int temp = 0;
        temp = d.i;
        d.i = d.j;
        d.j = temp;
    }
    public static void main(String[] args){
        int a = 2;
        int b = 3;
        TransferTest tt = new TransferTest();
        tt.swap(a,b);
        System.out.println("a改变之后为:" + a);
        System.out.println("b改变之后为:" + b);
        Data d = new Data(4,5);
        tt.swap(d);
        System.out.println("d的成员变量i改变之后为:" + d.i);
        System.out.println("d的成员变量j改变之后为:" + d.j);
    }
}

结果为:
误导
可以看到a和b没有变化,d.i和d.j发生了对换。a和b符合值传递,不再解释。那么为啥d的成员变量互换了?
我们知道值传递传的是副本,而对于类的对象来说也相当于副本(d是引用变量,d在栈中,指向堆中的实际对象)。那么通过值传递,传递的应该是是副本的一个副本,仍然指向堆中的实际对象,因此在方法中操作的是实际对象。上图说明(有点搓,凑合看吧):
瞎图
可以在swap()中设置d=null(方法中的d指向null),结果没变,即说明了是值传递。

形参个数可变的方法

从JDK1.5开始,java允许定义形参个数可变的方法,有两种方法定义:

  1. 在定义方法时,在最后一个参数的类型后增加三个点,则表示该方法可接受多个参数,以数组形式传入。代码如下:

    public class Var{
    public static void test(int i,int ... a){
        //a被当做数组处理
        for(int temp : a){
            System.out.println(temp);
        }
    }
    public static void main(String[] args){
        test(1,2,3,4,5);
        System.out.println("----华丽的分割线1----");
        test(1,2,3,4,5,6,7,8,9);
        System.out.println("----华丽的分割线2----");
        //直接用数组做实参
        int[] a = {2,3,4};
        test(1,a);
    }
    }

    需注意的是:这种方式的参数只能在形参列表的最后给出,因此一个方法中只能有一个可变的形参,可以用数组赋值

  2. 在定义方法时,可以在任意位置采用数组形式作为参数:

    public class Var{
        public static void test(int i,int[] a){
            for(int temp : a){
                System.out.println(temp);
            }
        }
        public static void main(String[] args){
            int[] a = {2,3,4};
            //实参只能是数组
            test(1,a);
        }
    }

重载(Overload)

重载含义:同一个类中,形参列表不同(个数,类型,顺序)的多个方法,即两同一不同:同类,同名,不同形参列表。至于返回值类型、修饰符不能作为方法重载的依据。如下代码:

public class Overload{
    public void test(){
        ;
    }
    public int test(){
        int i = 0;
        return i;
    }

}

提示错误为:
error
即例子中两个test()方法只有返回值类型不同,不能称之为重载。举个简单的例子若例子中某个方法调用test()方法:

test();

这种情况人都不能区分调用的是哪个更何况机器!
还有不怎么建议重载形参长度可变的方法,

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值