class Person {
........
}
public class Main {
        public static void main(String[] args)
        {
                Person p1 = new Person();
                p1 = func(p1);
        }
        static Person func(Person p)
        {
                Person newp = new Person(); 
                if(满足某一条件)
                        p = newp;
                return p;
        }
}上面的可以在func里改变函数外面的p1的指向,我知道这是可以的。疑问:假如main里面有 Person p1和 Person p2,有没有办法调用func,改变这两个分别指向func里新new出来的两个不同的Person: newP1 和 newP2 ?例如:
func(Person p1, Person p2)
{
Person newP1 = new Person();
Person newP2 = new Person();
if(满足条件)
{
p1 = newP1;
p2 = newP2
}
}
注:我是想到C语言里面可以用“指针的指针“来为结构体分配内存而想到这个问题的。
在C语言里:
void func(struct person ** p1, struct person ** p2)
{
        *p1 = (struct person*)malloc(sizeof(struct person));
        *p2 = (struct person*)malloc(sizeof(struct person));
}  //这样不需要返回值,就算返回,也返回不了两个。java里怎么操作?

解决方案 »

  1.   

    不错的问题。有个办法,就是前提是lz的方法里不能有
    Person newP1 = new Person();
        Person newP2 = new Person();
        p1 = newP1;
        p2 = newP2
    这种声明和赋值的办法而是用p1.setName(...);
    p1.setAge(...);
    //...p1 settersp2.setName(...);
    p2.setAge(...);
    //...p2 setters去给p1,p2改变内容。简单来说就是你不能改变p1和p2所引用的对象但是如果你这个person类很大,依现在电脑硬件的条件,其实方法返回对象的拷贝也没什么负荷
    那这样就有两个解决办法,
    一个是
    List<Person> func(Person p1, Person p2){
        ......
        List<Person> persons = new ArrayList<Person>();
        persons.add(p1);
        persons.add(p2);
        
        return persons;
    }
    要么是你建一个TwoPerson的类,里面两个Person成员,然后你这个方法就返回一个TwoPerson成员就好。一切都取决于你现实中的实际情况(比这个例子要复杂)。 但是想靠传址给方法传递参数,让方法里面修改的东西在方法外也有效,还真不是Java的专长,但这却让Java更规范,更系统。
      

  2.   

    总之最好的实践还是你的方法能返回点什么东西. 这设计Java的传值方式。Java从来都是传引用的,但和C++的传地址又不尽相同。
      

  3.   

    一楼说的已经不错了,c和java都有类似的问题,因为它们的参数传递都是按照值传递的方式进行的,只传递一个指针或者引用到函数中,得到的都是拷贝,改变这份拷贝的指向不会影响原来的指向,只有改变”内容“才会影响到原来参数的内容。c里面用指针的指针来解决,那么java可以用引用的引用来解决,当然引用的引用在语言层次没有支持,只有通过"持有引用"这种方式来实现了,一楼的返回一个List引用也就是这个意思。还有,根据java中的编程原则,你的方法不应声明为func(Person p1, Person p2),应该类似这样设计:
    Person getPerson1(){}
    Person getPerson2(){}