面向对象程序编程,自己之前不知道的小知识,学习笔记

来源:互联网 发布:淘宝店铺内部人员解封 编辑:程序博客网 时间:2024/06/06 15:52

1.当this作为多为对象默认引用时,程序可以像访问普通引用变量一样来访问这个this引用,甚至可以把this当成普通方法的返回值。下面有一段代码:

public class ReturnThis {public int age;public ReturnThis grow(){age++;//return this返回调用该方法的对象return this;}public static void main(String[] args){ReturnThis re=new ReturnThis();re.grow().grow().grow();System.out.println(re.age);}}
2.关于使用函数swap交换两个数的问题

首先是只在swap函数中实现交换数值,代码:

public class PrimitiveTransferTest {public static void swap(int a,int b){int tmp=a;a=b;b=tmp;System.out.println("swap方法里,a是:"+a+"b是:"+b);}public static void main(String[] args){int a=6;int b=9;swap(a,b);System.out.println("交换过之后,a是:"+a+"b是:"+b);}}
这个程序只是在swap函数中实现了两个数位置的交换,返回到main函数中两个数的值并没有交换,传递过去的只是变量的值。

要想在面函数中达到实际的交换参数的值,那么只有将变量的地址传递过去,这样才能真正意义上坐到交换两个参数的值,代码:

class DateWrap{int a;int b;}public class ReferenceTransferTest {public static void swap(DateWrap dw){int tmp=dw.a;dw.a=dw.b;dw.b=tmp;System.out.println("swap中a的值为:"+dw.a+"b的值为:"+dw.b);}public static void main(String[] args){DateWrap dw=new DateWrap();dw.a=6;dw.b=9;swap(dw);System.out.println("mian中a的值为:"+dw.a+"b的值为:"+dw.b);}}
这样就达到了交换两个数的目的。

(详细解释:

main()方法中开始调用swap()方法,main()方法并未结束,系统会分别为main()和swap()开辟出两个栈区,用于存放main()和swap()方法的局部变量。调用swap()方法时,dw变量作为实参传入swap()方法,同样采用值传递方式:把main()方法的dw变量的值赋给swap()方法里的dw形参,从而完成swap()方法的dw形参的初始化。值得指出的是,main()方法中的dw是一个引用(也就是一个指针),它保存了DateWrap对象的地址值,当把dw的值赋给swap()方法的dw形参后,即让swap()方法的dw形参也保存了这个地址,即也会引用到堆内存的DataWrap对象。

3.形参个数可变的方法

代码:

public class Varargs {public static void test(int a,String... books){for(String tmp:books){System.out.println(tmp);}System.out.println(a);}public static void main(String[] args){test(5,"疯狂Java讲义","轻量级Java EE企业应用实战");}}
从test的方法体代码来看,形参个数可变的参数本质就是一个数组参数,也就是说,下列两种方法作用相同

代码1:

public static void test(int a,String... books);
代码2:

public static void test(int a,String[] books);
但是两种方法在调用函数的时候存在差别

代码1对应调用函数的时候:

test(5,"疯狂Java讲义","轻量级Java EE企业应用开发");
代码2对应调用函数的时候:

test(23,new String[]{"疯狂Java讲义","轻量级Java EE企业应用实战"});
明显第一种形式更加简洁。实际上,即使采用形参个数可变的形式来定义方法,调用该方法时也一样可以为个数可变的形参传入一个数组。

(注意:长度可变的形参只能处于形参列表的最后。一个方法中最多只能包含一个长度可变的形参,长度可变的形参本质上就是一个数组类型的形参,因此调用包含一个长度可变形参的方法时,这个长度可变的形参既可以传入多个参数,也可以传递一个数组。)

4.方法重载和形参个数可变相结合

代码:

public class OverloadVarargs {public void test(String msg){System.out.println("只有一个字符串参数的test方法");}public void test(String...books){System.out.println("*****形参长度可变的test方法*****");}public static void main(String[] args){OverloadVarargs olv=new OverloadVarargs();//下面两次调用将执行第二个test()方法olv.test();olv.test("aa","bb");//下面调用将执行第一个test()方法olv.test("aa");//下面将调用将执行第二个test()方法olv.test(new String[]{"aa"});}}
如果一个类中定义了一个test(String...strings)方法,同时还定义了一个test(String)方法,则test(String...strings)方法的strings不可能通过直接传入一个字符串参数来调用,如果只传入一个字符串参数,则可以采用传入字符串的形式,

(大部分时候后并不推荐重载形参长度可变的方法,因为这样做确实也没有太大的意义,而且容易降低程序的可读性)

阅读全文
0 0