昨天在写数组问题的时候,遇到一个问题,就是数组作为函数参数传入时,数组本身值也改变了(详见Java复习二)。于是请教了一下Java老师,发掘了自己以前没有意识道德问题。
只要参数是复合类型,即对象,接口,数组,那么传递的值都是地址。
1.对象package com.object;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Num num1=new Num(1,1);
Num num2=new Num(2,2);
num1.display();
num2.display();
num1.add(num2);
num1.display();
num2.display();
}
}
class Num{
int num;
int value;
public Num(int num,int value){
this.num=num;
this.value=value;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public void display(){
System.out.println("\nnum="+num+" value="+value);
}
public void add(Num num){
num.setValue(3);
}
}
运行结果:
2.数组
详见Java复习二
3.对象数组
package com.object;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
Num[] nums={new Num(1,1),new Num(2,2)};
new Num(0,0).add(nums);
for(int i=0;i<nums.length;i++){
nums[i].display();
}
}
}
class Num{
int num;
int value;
public Num(int num,int value){
this.num=num;
this.value=value;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public void display(){
System.out.println("\nnum="+num+" value="+value);
}
public void add(Num num){
num.setValue(3);
}
public void add(Num[] num){
for(int i=0;i<num.length;i++){
num[i].value=3;
}
}
}
运行结果
4.接口
package com.interfaceDemo;
public class Demo {
public static void main(String[] args) {
// TODO Auto-generated method stub
People p1=new People();
p1.add(p1);
p1.display();
}
}
interface Animal{
int n=0;
void display();
}
class People implements Animal{
int num=1;
@Override
public void display() {
// TODO Auto-generated method stub
System.out.println("n="+n+" num="+num);
}
void add(Animal animal){
//animal.n=3;//报错
((People)animal).num=3;
}
}
运行结果:
例子可能不太好,但是可以说明问题吧,原理和对象作参数差不多。好的,这个问题先处理到这里吧。