当类的成员变量为另一个类时,这个类的构造函数该怎么写?


定义两个类
public class Cars {
    private String carId;
    private String coordinate;
         public Cars(String carId, String coordinate)
        {
             this.carId=carId;
           this.coordinate=coordinate;
        }
}

public class Departments {
    String name;
    Cars cars;
    public Departments( String name,Cars cars){
           this.name=name;
           ???????????
          cars该怎么来写呢?    //如果成员变量为Cars类数组时,怎么来实现cars数组的初始化??
    }
}

10 个解决方案

#1


this.cars = cars;

#2


数组

public class Departments {
    String name;
    Cars[ ] carsArray;
    public Departments( String name,Cars[ ] carsArray){
           this.name = name;
           this.carsArray = carsArray
     }
}

实例化 Departments时传入carsArray即可,比如
将下面传入
Cars[ ] carsArray = { new Cars(xx,xx),new Cars(xx,xx)};

#3


如果用this.cars=cars;的话,只是将cars的地址赋给了Departments里的cars,Department里的cars并没有申请内存。
当传入参数cars被系统销毁时,Departments里面的cars岂不是什么都没有了?怎么让Departments里的cars自己申请内存,并长久保留cars的信息?昨天试了用这种方法:
public class Departments {
    String name;
    Cars[ ] carsArray;
    public Departments( String name,Cars[ ] carsArray){
           this.name = name;
           this.cars=new Cars;
     }
}

编写了测试程序:如下
Cars cars=new Cars("AAAA","0000")
Departments dapertment=new Departments("AliBABA",cars);
cars.SetCarsname("BBBB");
将Departments中的cars.name输出,结果是BBBB!!!
这是为什么???
怎么让Departments里的cars长久保留cars的信息,不随传入的cars改变而改变?

#4


this.cars = cars.clone();

#5


引用 3 楼 suqianc 的回复:
如果用this.cars=cars;的话,只是将cars的地址赋给了Departments里的cars,Department里的cars并没有申请内存。
当传入参数cars被系统销毁时,Departments里面的cars岂不是什么都没有了?怎么让Departments里的cars自己申请内存,并长久保留cars的信息?昨天试了用这种方法:
public class Departments {
    String name;
    Cars[ ] carsArray;
    public Departments( String name,Cars[ ] carsArray){
           this.name = name;
           this.cars=new Cars;
     }
}

编写了测试程序:如下
Cars cars=new Cars("AAAA","0000")
Departments dapertment=new Departments("AliBABA",cars);
cars.SetCarsname("BBBB");
将Departments中的cars.name输出,结果是BBBB!!!
这是为什么???
怎么让Departments里的cars长久保留cars的信息,不随传入的cars改变而改变?

弱弱的问一句:cars.name这个能点出来么?

#6


你的类前后定义都变了。 
你尝试这样吧
public class Cars {
    private String carId;
    private String coordinate;
         public Cars(String carId, String coordinate)
        {
             this.carId=carId;
           this.coordinate=coordinate;
        }
}

public class Departments {
    String name;
    Cars cars;
    public Departments( String name,Cars cars){
           this.name=name;
           this.cars = cars.clone();
    }
}

#7


引用 3 楼 suqianc 的回复:
如果用this.cars=cars;的话,只是将cars的地址赋给了Departments里的cars,Department里的cars并没有申请内存。
当传入参数cars被系统销毁时,Departments里面的cars岂不是什么都没有了?怎么让Departments里的cars自己申请内存,并长久保留cars的信息?昨天试了用这种方法:
public class Departments {
    String name;
    Cars[ ] carsArray;
    public Departments( String name,Cars[ ] carsArray){
           this.name = name;
           this.cars=new Cars;
     }
}

编写了测试程序:如下
Cars cars=new Cars("AAAA","0000")
Departments dapertment=new Departments("AliBABA",cars);
cars.SetCarsname("BBBB");
将Departments中的cars.name输出,结果是BBBB!!!
这是为什么???
怎么让Departments里的cars长久保留cars的信息,不随传入的cars改变而改变?

对象参数是引用传递,指向堆中的值,cars.SetCarsname("BBBB")时候把值改变了,下面输出的结果当然就是最新的值。
不想被改变的的话调用cars.clone()克隆对象。

#8


不好意思,cars类弄错了。
有一个问题来了!!!!!
你的类前后定义都变了。 
你尝试这样吧
public class Cars {
    private String carId;
    private String coordinate;
         public Cars(String carId, String coordinate)
        {
             this.carId=carId;
           this.coordinate=coordinate;
        }
}

public class Departments {
    String name;
    Cars cars;
    public Departments( String name,Cars cars){
           this.name=name;
           this.cars=new Cars();//给cars分配存储空间!!!!!!!!这里明明给分配了存储空间呀!!!!
           this.cars = cars;
    }
}
Cars cars=new Cars("AAAA","0000")
Departments dapertment=new Departments("AliBABA",cars);
cars.SetCarsId("BBBB");
将Departments中的cars.name输出,结果是BBBB!!!
这是为什么???
怎么让Departments里的cars长久保留cars的信息,不随传入的cars改变而改变?
PS:在Androidstudio下用了您说的方法,cars.clone()会报错!!!




#9


实现Cloneable接口,直接浅克隆

this.cars = cars.clone();



public class Cars implements Cloneable {
    private String carId;
    private String coordinate;
         public Cars(String carId, String coordinate)
        {
           this.carId=carId;
           this.coordinate=coordinate;
        }
}

 @Override  //协变
    public Cars clone(){  
      Cars cars  = null;  
        try {  
            cars = (Cars) super.clone();    
              } catch (CloneNotSupportedException e) {  
            e.printStackTrace();  
        }  
        return cars;  
    } 

#10


谢谢!!!clone方法亲测有用!!!!!
还有一个疑问!!!!
public class Departments {
    String name;
    Cars cars;
    public Departments( String name,Cars cars){
           this.name=name;
            this.cars=new Cars();//给cars分配存储空间!!!!!!!!这里明明给分配了存储空间呀!!!!
           this.cars = cars;
    }
}
我最初用的是上面这种方法来写构造器,但是在执行测试代码
                             Cars cars=new Cars("AAAA","0000");
                             Departments dapertment=new Departments("AliBABA",cars);
                             cars.SetCarsId("BBBB");
                            将Departments中的cars.carId输出,结果还是BBBB!!!
                           这表明 
                            this.cars=new Cars();
                           这行代码没啥用啊!!!
                 问题:为什么这种方法不行,明明分配了新内存,
                            deparment里面的成员cars.carsId还是随着传入参数cars变化而变化!
                            

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com