关于Set接口的对象作为私有属性,这段代码运行结果不明白请讲解?

关于Set接口的对象作为私有属性,这段代码运行结果不明白请讲解?

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class GoodsManage {
 // 属性:存放商品的容器(goodsSet):Set类型
 private Set<Goods> goodsSet;
 // 构造方法
 public GoodsManage() {
 }
 public GoodsManage(Set<Goods> goodsSet) {
  super();
  this.goodsSet = goodsSet;
 }
 // getter和setter方法
 public Set<Goods> getGoodsSet() {
  return goodsSet;
 }
 public void setGoodsSet(Set<Goods> goodsSet) {
  this.goodsSet = goodsSet;
 }
 // 商品信息导入:
 public void importGoods() {
   Goods goods0 = new Goods("goods001", "水杯", 56.0, "不锈钢水杯");
   Goods goods1 = new Goods("goods002", "饮水机", 229.0, "带净化功能的饮水机");
   Goods goods2 = new Goods("goods003", "笔记本电脑", 4999.0, "15寸笔记本电脑");
   Goods goods3 = new Goods("goods004", "手机", 2300.0, "android手机");
   goodsSet.add(goods0);
   goodsSet.add(goods1);
   goodsSet.add(goods2);
   goodsSet.add(goods3);
 }
 // 显示所有商品信息:
  public void displayAllGoods() {
   Iterator<Goods> it = goodsSet.iterator();
   while (it.hasNext()) {
    System.out.println(it.next());
   }
  }
  public static void main(String[] args) {
   GoodsManage gm = new GoodsManage();
   System.out.println("gm:"+gm.getGoodsSet());   
   
   Set<Goods> set1 = new HashSet<Goods>();
   GoodsManage gm1 = new GoodsManage(set1);
   System.out.println("ste1:"+set1);
   System.out.println("gm1:"+gm1.getGoodsSet());
   Set<Goods> set2 = new HashSet<Goods>();
   GoodsManage gm2 = new GoodsManage(set2);   
   gm2.importGoods(); 
   System.out.println("ste2:"+set2);
   System.out.println("gm2:"+gm2.getGoodsSet());
   //为什么GoodsManage类的实例化对象gm2执行importGoods成员方法对GoodsManage类私有属性Set<Goods> goodsSet进行修改,Set接口的实现类对象set2会产生改变?
  }
  /*运行结果
  gm:null
  ste1:[] 
  gm1:[]
  ste2:[商品信息[编号:goods004, 名称:手机, 价格:2300.0,描述:android手机], 商品信息[编号:goods002, 名称:饮水机, 价格:229.0,描述:带净化功能的饮水机], 商品信息[编号:goods003, 名称:笔记本电脑, 价格:4999.0,描述:15寸笔记本电脑], 商品信息[编号:goods001, 名称:水杯, 价格:56.0,描述:不锈钢水杯]]
  gm2:[商品信息[编号:goods004, 名称:手机, 价格:2300.0,描述:android手机], 商品信息[编号:goods002, 名称:饮水机, 价格:229.0,描述:带净化功能的饮水机], 商品信息[编号:goods003, 名称:笔记本电脑, 价格:4999.0,描述:15寸笔记本电脑], 商品信息[编号:goods001, 名称:水杯, 价格:56.0,描述:不锈钢水杯]]
  */
}
package com.imooc.goods;
public class Goods {
 // 属性:商品名称 (goodsName):String类型,商品价格(price):double类型,商品描述(goodsDesp):String类型
 private String goodsId;
 private String goodsName;
 private double price;
 private String goodsDesp;
 // 构造方法
 public Goods() {
 }
 public Goods(String goodsId, String goodsName, double price, String goodsDesp) {
  this.goodsId = goodsId;
  this.goodsName = goodsName;
  this.price = price;
  this.goodsDesp = goodsDesp;
 }
 // getter和setter方法
 public String getGoodsId() {
  return goodsId;
 }
 public void setGoodsId(String goodsId) {
  this.goodsId = goodsId;
 }
 public String getGoodsName() {
  return goodsName;
 }
 public void setGoodsName(String goodsName) {
  this.goodsName = goodsName;
 }
 public double getPrice() {
  return price;
 }
 public void setPrice(double price) {
  this.price = price;
 }
 public String getGoodsDesp() {
  return goodsDesp;
 }
 public void setGoodsDesp(String goodsDesp) {
  this.goodsDesp = goodsDesp;
 }
 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + ((goodsDesp == null) ? 0 : goodsDesp.hashCode());
  result = prime * result + ((goodsId == null) ? 0 : goodsId.hashCode());
  result = prime * result + ((goodsName == null) ? 0 : goodsName.hashCode());
  long temp;
  temp = Double.doubleToLongBits(price);
  result = prime * result + (int) (temp ^ (temp >>> 32));
  return result;
 }
  
 @Override
 public boolean equals(Object obj) {
  if (obj == this)
  return true;
 if (obj.getClass()==Goods.class) {
  Goods goods = (Goods) obj;
  return goods.getGoodsDesp().equals(goodsDesp) && goods.getPrice() == price
    && goods.getGoodsId().equals(goodsId) && goods.getGoodsName().equals(goodsName);
 }
 return false;
 }
 // toString()方法
 @Override
 public String toString() {
  return "商品信息[编号:" + goodsId + ", 名称:" + goodsName + ", 价格:" + price + ",描述:" + goodsDesp + "]";
 }
}


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

如下代码,创建GoodsManage对象gm2时,set2是方法的参数,然后在GoodsManage的构造方法中,将类的私有属性Set<Goods> goodsSet设置为set2,因此执行importGoods()方法,就是将商品信息添加到set2中,所以会发现set2的值被修改了。

http://img1.sycdn.imooc.com//climg/5bff62a400011b1003420061.jpg

祝学习愉快!

  • 慕婉清9111593 提问者 #1
    执行importGoods()方法,将商品信息添加到set2中这里不太明白,我以为是添加到私有属性里。
    2018-11-29 12:10:56
  • 一叶知秋519 回复 提问者 慕婉清9111593 #2
    嗯,因为在GoodsManage的带参构造方法中将set2设置给了类的属性goodsSet,调用importGoods方法添加商品时,其实就是对set2进行了操作,祝学习愉快!
    2018-11-29 14:31:15
  • 慕婉清9111593 提问者 #3
    我的理解是类的私有属性Set<Goods> goodsSet对象要写入集合数据,先得分配一段内存空间(通过new关键字实例化),GoodsManage对象gm2的属性需要被修改同样需要分配一段内存空间(通过new关键字实例化),集合对象set2实例化先分配了一片内存空间,在GoodsManage的带参构造方法中set2作为参数,goodsSet和set2的共享该内存空间,执行importGoods()方法对同一内存空间写入集合数据,对象goodsSet和set2都引用该内存空间中的数据,所以他们的值都将变得一样。
    2018-11-29 22:48:47
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师