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