问题描述
大家好,有2个编码,现在是第一个:publicinterfaceFractionInterface{}
publicclassFractionimplementsFractionInterface{privateintdenominator;privateintnumerator;privateinti=0;privateintdenominatorArr[]=newint[2];privateintnumeratorArr[]=newint[2];publicFraction(){}publicFraction(intdenominator,intnumerator){this.denominator=denominator;this.numerator=numerator;denominatorArr[i]=denominator;numeratorArr[i]=numerator;System.out.println("Thevalueofiis"+i);//用来检查i的数值i++;}}
importjava.util.Scanner;publicclassTestFraction{publicTestFraction(){}publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);System.out.println("Pleaseenterthefirstfraction:");//要求使用者输入第一个分数Stringa=scanner.nextLine();intdenominator=Integer.parseInt(String.valueOf(a.charAt(2)));//例子:如果输入1/3,那么3将会被分配给denominatorintnumerator=Integer.parseInt(String.valueOf(a.charAt(0)));//例子:如果输入1/3,那么1将会被分配给numeratorFractionf1=newFraction(denominator,numerator);System.out.println("");System.out.println("Pleaseenterthesecondfraction:");//要求使用者输入第二个分数Stringb=scanner.nextLine();intdenominator1=Integer.parseInt(String.valueOf(b.charAt(2)));//例子:如果输入1/3,那么3将会被分配给denominatorintnumerator1=Integer.parseInt(String.valueOf(b.charAt(0)));//例子:如果输入1/3,那么1将会被分配给numeratorFractionf2=newFraction(denominator1,numerator1);}}
关于这个编码的问题是为什么i的值在i++之后还是0?增加之后不是应该变成1吗?++i和i++都试过了结果还是一样==以下是第一个编码的结果:第2个编码:publicinterfaceListInterface<T>{/**Task:Seeswhetherthelistcontainsagivenentry.*@paramanEntrytheobjectthatisthedesiredentry*@returntrueifthelistcontainsanEntry,orfalseifnot*/publicbooleancontains(TanEntry);//P2Q2publicvoidanotherToString();//P2Q3publicintgetPositionOf(TtargetObject);}
publicclassArrList<T>implementsListInterface<T>{privateT[]list;privateintcounter=0;privateintlength;privatestaticfinalintDEFAULT_INITIAL_CAPACITY=25;publicArrList(T[]arr){length=0;list=(T[])newObject[DEFAULT_INITIAL_CAPACITY];for(inti=0;i<arr.length;i++){list[i]=arr[i];counter++;}}publicArrList(){this(DEFAULT_INITIAL_CAPACITY);}publicArrList(intinitialCapacity){length=0;list=(T[])newObject[initialCapacity];}//checkwhetheranEntryiscontainedinthelistornot,ifcontained,returntrue,otherwisefalsepublicbooleancontains(TanEntry){booleanfound=false;for(intindex=0;!found&&(index<counter);index++){if(anEntry.equals(list[index])){found=true;}}returnfound;}//toStringforP2Q2-->TodisplaythelistpublicvoidanotherToString(){for(inti=0;i<counter;i++){System.out.println(list[i]+"n");}}//P2Q3-->ifcontains(targetObject)==true,return1,otherwise0publicintgetPositionOf(TtargetObject){intintOfBoolean=(contains(targetObject))?1:0;returnintOfBoolean;}}
这个没什么特别的,可以无视publicclassName{privateStringfirst;privateStringlast;publicName(){}publicName(StringfirstName,StringlastName){first=firstName;last=lastName;}publicvoidsetName(StringfirstName,StringlastName){setFirst(firstName);setLast(lastName);}publicStringgetName(){returntoString();}publicvoidsetFirst(StringfirstName){first=firstName;}publicStringgetFirst(){returnfirst;}publicvoidsetLast(StringlastName){last=lastName;}publicStringgetLast(){returnlast;}publicvoidgiveLastNameTo(NameaName){aName.setLast(last);}publicStringtoString(){returnfirst+""+last;}}
publicclassListGUI{publicstaticvoidmain(String[]args){//P2Q2Name[]nameArr={newName("Chris","Lim"),newName("Jenny","Chia"),newName("Kenny","Cheong")};ListInterface<Name>nameList=newArrList<Name>(nameArr);System.out.println("NameList");System.out.println("=========");nameList.anotherToString();//P2Q3NamesearchName=newName("Jenny","Chia");System.out.println("Thesearchresultis"+nameList.getPositionOf(searchName));}}
以下是结果:这个编码奇怪的地方是返回值竟然是0虽然JennyChia(NamesearchName=newName("Jenny","Chia");)和JennyChia(list里面的)是同一个东西==望老手能赐教
解决方案
本帖最后由 icebreath 于 2014-10-10 13:04:43 编辑
解决方案二:
第一个是因为没输入一个分数都会new一个Fraction对象,i是新生成的实例的属性,你第两次new的对象的i是新生成的当然为0.想实现你想的功能可以用静态变量,这个就是类所公有的属性了
解决方案三:
引用1楼s715575807的回复:
第一个是因为没输入一个分数都会new一个Fraction对象,i是新生成的实例的属性,你第两次new的对象的i是新生成的当然为0.想实现你想的功能可以用静态变量,这个就是类所公有的属性了
原来如此,那第一个我明白了可是第二个是什么一回事呢?
解决方案四:
NamesearchName=newName("Jenny","Chia");NamesearchName1=newName("Jenny","Chia");System.out.println(searchName.equals(searchName1));//false
因为你调用的是object的equals,你可以看下源码publicbooleanequals(Objectobj){return(this==obj);}
这里是用的==实质上是指内存是否相等,不同对象内存不同返回false;想实现该功能可以覆盖Name类的equals方法,具体比较Name里面各个属性是否相等
解决方案五:
引用3楼s715575807的回复:
NamesearchName=newName("Jenny","Chia");NamesearchName1=newName("Jenny","Chia");System.out.println(searchName.equals(searchName1));//false因为你调用的是object的equals,你可以看下源码publicbooleanequals(Objectobj){return(this==obj);}
这里是用的==实质上是指内存是否相等,不同对象内存不同返回false;想实现该功能可以覆盖Name类的equals方法,具体比较Name里面各个属性是否相等
equals源码里的this是指什么东西?能解释下吗?0.0其实我写了这个方法,可是却有错误呢==publicbooleanequals(Objectobj){return((this.getName()&&((Name)obj).getName())&&(this.getName()&&((Name)obj).getName()));}
解决方案六:
引用3楼s715575807的回复:
NamesearchName=newName("Jenny","Chia");NamesearchName1=newName("Jenny","Chia");System.out.println(searchName.equals(searchName1));//false因为你调用的是object的equals,你可以看下源码publicbooleanequals(Objectobj){return(this==obj);}
这里是用的==实质上是指内存是否相等,不同对象内存不同返回false;想实现该功能可以覆盖Name类的equals方法,具体比较Name里面各个属性是否相等
请看这个,别看4楼的==请问equals源码里的this是指什么东西?能解释下吗?0.0还有我写了这个方法,可是却有错误==@Overridepublicbooleanequals(Objectobj){return(this.getName()&&(((Name)obj).getName()));}
解决方案七:
都说了是,覆盖Name类的equals方法,你要比较的是Name对象要调用的是Name的方法,类似于@Overridepublicbooleanequals(Objectobj){if(objinstanceofName&&this.first.equeals(((Name)obj)).first){returntrue;}returnfalse;}}
没写完整,意会下