首先,先写以下程序来复习以下面向对象参数传递的内容。
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);
}
}
执行结果:【注意】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);
}
}
执行结果:【原因如下】:
上面的程序这两行语句
int result = test.method(1);
boolean result2 = test.method(2);
test.method(1);
test.method(2);
当写成这种形式时,程序无法判断是否要调用哪个method方法,尽管他们返回值也不一样,所以返回值不能做重载的依据,重载的依据是根据它的参数来定的。