Java 复制构造函数创建垃圾对象

Java 复制构造函数创建垃圾对象,java,oop,constructor,garbage,Java,Oop,Constructor,Garbage,我的老师给了我两节课,一节是护照,另一节是日期。 日期包含3个属性(字符串日、字符串月、字符串年)、getter、setter和2个构造函数,其中一个是副本构造函数: public date(date dt) this.day=dt.getd(); this.month=dt.getm(); this.yaer=dt.gety(); passport类包含2个属性(字符串名称、日期表达式(从日期类)),有以下结构: public passport(string name, date e

我的老师给了我两节课,一节是护照,另一节是日期。
日期包含3个属性(字符串日、字符串月、字符串年)、getter、setter和2个构造函数,其中一个是副本构造函数:

 public date(date dt)
 this.day=dt.getd();
 this.month=dt.getm();
 this.yaer=dt.gety();
passport类包含2个属性(字符串名称、日期表达式(从日期类)),有以下结构:

public passport(string name, date exp)   
this.name=name;  
this.exp= new date(exp);    
现在在main类中,每次创建新日期和新passport时,每个日期都是重复的,每个passport都会得到一个垃圾对象。
我怎样才能克服这个垃圾

我怎样才能克服这个垃圾

如果
date
实例是可变的,则不允许;你做你正在做的事

如果
date
实例是不可变的(一旦创建它们,它们的状态就无法更改),那么您只需使用给定的实例,而不是创建一个新实例:

public passport(string name, date exp)   
    this.name = name;  
    this.exp = exp;
}
如果
exp
可以修改,您就不想这样做,因为这会在您的
passport
实例和传递
exp
的任何对象之间产生串扰

我怎样才能克服这个垃圾

如果
date
实例是可变的,则不允许;你做你正在做的事

如果
date
实例是不可变的(一旦创建它们,它们的状态就无法更改),那么您只需使用给定的实例,而不是创建一个新实例:

public passport(string name, date exp)   
    this.name = name;  
    this.exp = exp;
}
如果
exp
可以修改,您就不想这样做,因为这会在您的
passport
实例和传递
exp
的任何对象之间产生串扰

我怎样才能克服这个垃圾

让垃圾收集器执行其工作:由于作为参数传递给
Passport
构造函数的
Date
变量将超出执行上下文的范围,因此基础
Date
对象将有资格被收集

最直接的方法是不要将
Date
对象指定给变量
只需在
Passport
构造函数调用中内联其实例化:

Passport passport = new Passport(name, new Date(day, month, year));
我怎样才能克服这个垃圾

让垃圾收集器执行其工作:由于作为参数传递给
Passport
构造函数的
Date
变量将超出执行上下文的范围,因此基础
Date
对象将有资格被收集

最直接的方法是不要将
Date
对象指定给变量
只需在
Passport
构造函数调用中内联其实例化:

Passport passport = new Passport(name, new Date(day, month, year));
可选解决方案:

在主要类别中:

passport[] arr = new passport[100];   // we have 100 passports
date d1= new date ()                  //null date
for (int i=0,i<100,i++)               // we have 100 passports
{ d1.setd();                          //our setter asks for an input
  d1.setm();
  d1.sety();
  arr [i]=new passport (string name, d1); }
passport[]arr=新护照[100];//我们有100本护照
日期d1=新日期()//空日期
对于(int i=0,i可选解决方案:

在主要类别中:

passport[] arr = new passport[100];   // we have 100 passports
date d1= new date ()                  //null date
for (int i=0,i<100,i++)               // we have 100 passports
{ d1.setd();                          //our setter asks for an input
  d1.setm();
  d1.sety();
  arr [i]=new passport (string name, d1); }
passport[]arr=新护照[100];//我们有100本护照
日期d1=新日期()//空日期

对于(int i=0,ii如果你的老师真的给你上了
date
passport
课程,你可能会建议他/她尊重标准的Java命名约定,在这些约定中,最初的类名是大写和小写的。因此,课程应该是
date
passport
。(或者他/她可能希望为
Date
使用不同的名称,以避免与JDK中已有的两个
Date
类混淆。)使用标准命名约定可以让其他人更容易阅读您的代码。任何Java教师都不应该使用所有小写的类名,这会让人问这位教师是否真的知道他们在Java中做什么。那么“1垃圾对象”到底是什么意思?可能还值得一提的是,标准命名将在方法名称中使用全部工作,例如,
getDay
,而不是
getd
。如果您的老师真的给了您
date
passport
类,您可能希望建议他/她尊重标准Java命名约定,在这些约定中,类名称最初以因此类应该是
Date
Passport
(或者他/她可能想为
Date
使用不同的名称,以避免与JDK中已有的两个
Date
类混淆。)使用标准命名约定可以让其他人更容易阅读您的代码。任何Java教师都不应该使用所有小写的类名,这会让人问这位教师是否真的知道他们在Java中做什么。那么“1垃圾对象”到底是什么意思?可能还值得一提的是,标准命名将在方法名称中使用整个工作,例如,
getDay
,而不是
getd
。日期可以是可变的,这就是她给我们提供复制构造函数的原因。我想在主循环中使用for,每次都覆盖第一个日期对象。@3xhaust:不知道你在说什么
main
中的
循环的
(正如您没有向我们展示的
main
),但是如果
date
是可变的,你就按你现在的方式创建一个新的日期。它被称为防御副本,这在这里是正确的做法。如果一个类是不可变的,那么副本构造函数就没有意义了。@Michael:不是一个纯粹的副本构造函数,不,完全是这样。我只是想彻底了解一下。(并且考虑到老师提供的代码的明显质量,我们不能确定任何事情。:-)一个具有不可变实例的类通常会公开方法,允许您“修改”(通过复制)一个或多个属性,以获得具有修改属性的新实例,例如,
datewithdays(int days)
将返回一个月和年相同的
日期,但给定的days值.date可以是可变的,这就是她给我们提供复制构造函数的原因。我想在main中使用一个for循环,每次都覆盖第一个日期对象。@3xhaust:不知道在
main中使用
for
循环是什么意思de>(因为您没有显示u