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

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对象。

扫描二维码关注公众号,回复: 2478085 查看本文章

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不可能通过直接传入一个字符串参数来调用,如果只传入一个字符串参数,则可以采用传入字符串的形式,

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

猜你喜欢

转载自blog.csdn.net/xiao_chainiao/article/details/75095922