JavaSE第十六讲:方法重载剖析

首先,先写以下程序来复习以下面向对象参数传递的内容。

public class ParamTest3
{
	public void change(Person person, Person person2)
	{
		person.name = "lisi";
		person2.name = "wangwu";
	}

	public static void main(String[] args)
	{
		Person person = new Person();
		person.name = "zhangsan";
		Person person2 = person;
		ParamTest3 test = new ParamTest3();
		test.change(person, person2);
		System.out.println(person.name);
	}
}
class Person
{
	String name;
}
执行结果:

D:\src\Lesson 1>java ParamTest3
wangwu

【原因如下:程序执行Person person = new Person();时候在内存开辟一个内存空间,内容为空Null,执行person.name = "zhangsan";时将其赋值为zhangsan,程序执行Person person2 = person;讲引用地址传给person2,所以person2也指向同样的对象,程序执行test.change(person, person2);时将这两个引用作为参数传给方法change,再还没执行方法体时候,便在生成了两个引用分别是person和person2,这两个引用是在change方法中生成的,同样指向main方法中的引用所指向的对象,此时又四个引用指向同一个对象,然后执行方法体中的内容 person.name = "lisi";将对象内容zhangsan改为lisi,执行person2.name = "wangwu";语句时将lisi改为wangwu,所以这个时候对象的内容即被修改为wangwu,方法执行完后,change中的引用销毁,执行main方法中的输出,输出的是main方法中的person所指向的这个已经被修改为wangwu的对象内容了,所以输出为wangwu,结合图15-1理解执行过程。


图16-1


对以上程序进行修改如下:

public class ParamTest3
{
	public void change(Person person, Person person2)
	{
		person.name = "lisi";
		person2.name = "wangwu";
	}

	public static void main(String[] args)
	{
		Person person = new Person();
		person.name = "zhangsan";

	//	Person person2 = person;
		Person person2 = new Person();

		ParamTest3 test = new ParamTest3();
		test.change(person, person2);
		System.out.println(person.name);
		System.out.println(person2.name);
	}
}
class Person
{
	String name;
}
执行结果:

D:\src\Lesson 1>java ParamTest3
lisi
wangwu

【原因如下】:main方法中执行Person person = new Person();person.name = "zhangsan";这两条语句时与上一个程序执行情况一样,当程序执行Person person2 = new Person();时则其在内存中又生成了一个对象,开辟了一个内存空间同时返回person2,其引用指向这个对象,当程序执行test.change(person, person2);时调用方法同时生成两个change中的引用,根据参数传递不同分别修改这两对象的内容,方法执行完后销毁,执行main方法中输出的person和person2所指向的已经被修改后的对象内容。结合如下图16-2理解执行过程。


图16-2


继续看以下三个程序程序:

public class People
{
	int age;
	public void change(int i)
	{
		i++;
	}
	public void change2(People p)
	{
		p = new People();
		p.age++;
	}
	public void change3(People p, int i)
	{
		p.age++;
		i++;
	}

	public static void main(String[] args)
	{
		
		People people = new People();

		int a = 0;

		people.change(people.age);

		System.out.println(people.age);
	}
}
执行结果:
D:\src\Lesson 1>java People
0

【注意】people.change(people.age);程序传的people.age传的People的age属性,默认值是0.


修改程序如下:

public class People
{
	int age;
	public void change(int i)
	{
		i++;
	}
	public void change2(People p)
	{
		p = new People();
		p.age++;
	}
	public void change3(People p, int i)
	{
		p.age++;
		i++;
	}

	public static void main(String[] args)
	{
		
		People people = new People();

		people.change2(people);

		System.out.println(people.age);
	}
}
执行结果:

D:\src\Lesson 1>java People
0


继续修改程序如下:

public class People
{
	int age;
	public void change(int i)
	{
		i++;
	}
	public void change2(People p)
	{
		p = new People();
		p.age++;
	}
	public void change3(People p, int i)
	{
		p.age++;
		i++;
	}

	public static void main(String[] args)
	{
		
		People people = new People();
		
		people.change3(people, people.age);

		System.out.println(people.age);

	}
}
执行结果:

D:\src\Lesson 1>java People
1


构造方法举例:

public class ConstructorTest
{
	public ConstructorTest()
	{
		//default constructor	

		System.out.println("test");
	}
			
	public static void main(String[] args)
	{
		ConstructorTest test = new ConstructorTest();

	}
}
执行结果:

D:\src\Lesson 1>java ConstructorTest
test

【注意】:构造方法不能用 “a.构造方法名”a.ConstructorTest()】这种形式来调用,应该用ConstructorTest test = new ConstructorTest();种方式来使用构造函数。


1、方法重载(Overload)。表示两个或多个方法名字相同,但方法参数不同。方法参数不同有两层含义:1)参数个数不同。2)参数类型不同。 【注意】:方法的返回值对重载没有任何影响。

为什么说方法的返回值对重载没有任何影响?对比如下两个程序:

【程序1】:

public class OverloadTest
{
	public int add(int a ,int b)
	{
		return a + b;
	}

	public int add(int a, int b, int c)
	{
		return a + b + c;
	}

	public static void main(String[] args)
	{
		OverloadTest test = new OverloadTest();

		int result = test.add(1, 2);
		int result2 = test.add(1, 2, 3);

		System.out.println(result);
		System.out.println(result2);
	}
}
执行结果:

D:\src\Lesson 1>java OverloadTest
3
6


【程序二】:

public class OverloadTest2
{
	public int method(int a)
	{
		System.out.println(a);
		return 1;
	}

	public boolean method(int a)
	{
		System.out.println(a);
		return false;
	}
	
	public static void main(String[] args)
	{
		OverloadTest2 test = new OverloadTest2();

		int result = test.method(1);
		boolean result2 = test.method(2);
	}	
}
执行结果:
D:\src\Lesson 1>javac OverloadTest2.java
OverloadTest2.java:9: 错误: 已在OverloadTest2中定义method(int)
        public boolean method(int a)
                       ^
OverloadTest2.java:20: 错误: 不兼容的类型
                boolean result2 = test.method(2);
                                             ^
  需要: boolean
  找到:    int
2 个错误

【原因如下】:

面的程序这两行语句

		int result = test.method(1);
		boolean result2 = test.method(2);

也可以写成

		test.method(1);
	        test.method(2);
当写成这种形式时,程序无法判断是否要调用哪个method方法,尽管他们返回值也不一样,所以返回值不能做重载的依据,重载的依据是根据它的参数来定的。


你可能感兴趣的:(JavaSE)