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

suqianc 2015-07-14 06:23:25
定义两个类
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数组的初始化??
}
}
...全文
368 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
suqianc 2015-07-16
  • 打赏
  • 举报
回复
谢谢!!!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变化而变化!
youshu2011 2015-07-15
  • 打赏
  • 举报
回复
引用 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()克隆对象。
丶初号鸡 2015-07-15
  • 打赏
  • 举报
回复
你的类前后定义都变了。 你尝试这样吧 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(); } }
fudapeng7 2015-07-15
  • 打赏
  • 举报
回复
引用 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这个能点出来么?
f772972950 2015-07-15
  • 打赏
  • 举报
回复
this.cars = cars.clone();
suqianc 2015-07-15
  • 打赏
  • 举报
回复
如果用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改变而改变?
飏飏一蝶 2015-07-15
  • 打赏
  • 举报
回复
实现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;  
    } 
suqianc 2015-07-15
  • 打赏
  • 举报
回复
不好意思,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()会报错!!!




飏飏一蝶 2015-07-14
  • 打赏
  • 举报
回复
数组 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)};
oh_Maxy 版主 2015-07-14
  • 打赏
  • 举报
回复
this.cars = cars;
该课程由付强老师主讲,系统的、全面的、具体的讲解了java入门的知识。可以使初级的学员入门。Java入门Java的历史、Java的版本、Java的优势、软件行业前景Java开发环境搭建、编Java入门练习虚拟机的运行机制、Java的平台无关性、虚拟机垃圾回收机制基础语法关键字、标识符、Java数据型分、基础数据型、取值范围变量、常量、三种注释、生成doc文档、运算符、表达式if语句、switch语句、嵌套判断for语句、while语句、do-while语句、嵌套循环和对象面向过程和面向对象的区别的构成、访问修饰符、对象的内存分配this关键字、按值传递与按引用传递、对象的初始化顺序高级特性的继承、父子的初始化顺序、单继承性方法的覆盖、重载、super关键字、多态、instanceof关键字、强制型转换、static关键字、final关键字数组和枚举一维数组的应用及内存分配多维数组的应用及内存分配数组的复制、数组的按引用传递排序算法:冒泡、直接选择、插入选择、希尔、快速、归并、堆排序Arrays工具的应用枚举型的应用常见的使用Object的底层及应用、ObjectsString的底层及应用、正则表达式StringBuffer和StringBuilder的底层及应用Math的应用、包装的应用日期的应用:Date、DateFormat、Calendar、LocalDateTime、Instant、LocalDate、MonthDay、ZonedDateTime、YearMonth、新旧日期转换BigInteger和BingDecimal、DecimalFormatSystem、Scanner抽象和接口抽象的规则及应用接口的规则及应用默认方法、静态方法、函数式接口、Lambda表达式异常异常的定义异常的处理:抓(try-catch-finally)、抛(throws)异常的分、自定义异常的应用、throw关键字集合框架集合框架结构:接口、实现Collection接口的方法、Set接口的方法、List接口的方法、Map接口的方法Array、Linked、Hash、Tree底层实现原理泛型的作用、Collections工具、历史集合I/O流Path的原理及应用、Files的原理及应用文件字节流FileInputStream的原理及应用对象、缓冲流、数据流的原理及应用字符流的原理及应用多线程进程与线程的概念、查看线程对象Java内存模型线程的创建与启动:扩展Thread、实现Runnable接口、实现Callable接口、线程池线程状态的转换:新建、就绪、运行、阻塞、死亡线程的调度:sleep、yield、join、interrupt、wait后台线程、定时任务线程的并发与同步、同步锁、同步块、线程安全的Lock接口、CAS、volatile修饰符内部成员内部、本地内部的应用匿名内部的原理及引用、Lambda表达式设计模式基础设计模式概念、框架概念7大设计原则:开闭原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特原则、里氏替换原则、合成复用原则单例模式、工厂模式、模板模式、代理模式、装饰模式、适配器模式、外观模式、策略模式、观察者模式、命令模式、备忘录模式、观察者模式反射反射包Class的使用反射获取属性、方法、构造器通过反射创建对象/通过反射调用方法反射的应用

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧