java 小程序中的toString问题,javatostring
java 小程序中的toString问题,javatostring
翻出之前的程序回味时,发现还是有新问题的,早该弄懂的知识。还是的好好总结一下。
自定义了一个类
class FastaR {
private String name;
private HashSet<Integer> positionSet;
private String sequence;
FastaR(String name, HashSet<Integer> positionSet, String sequence) {
this.name = name;
this.positionSet = positionSet;
this.sequence = sequence;
}
String getName() {
return name;
}
String getPureName() {
return name.substring(1);
}
void setName(String name) {
this.name = name;
}
HashSet<Integer> getPositionSet() {
return positionSet;
}
void setPositionSet(HashSet<Integer> positionSet) {
this.positionSet = positionSet;
}
void addPosition(int position) {
positionSet.add(position);
}
String getSequence() {
return sequence;
}
void setSequence(String sequence) {
this.sequence = sequence;
}
public String toString(){
ArrayList<Integer> positionList = new ArrayList<Integer>();
for (Iterator<Integer> it = positionSet.iterator(); it.hasNext();) {
Integer position = it.next();
positionList.add(position);
}
Collections.sort(positionList);
StringBuffer sb = new StringBuffer();
for (Iterator<Integer> it = positionList.iterator(); it.hasNext();) {
Integer position = it.next();
sb.append(";" + position);
}
return name + "@" + sb.substring(1) + "\n" + sequence;
}
}
在另一个类中调用的时候有个问题出现了:
class ELM2FastaR {
HashMap<String, FastaR> fastarMap;
ELM2FastaR(String codes, String filePath) {
this.fastarMap = new HashMap<String, FastaR>();
ArrayList<ELM> elmList = new ElmReader(codes, filePath).getElmList();
for (Iterator<ELM> it = elmList.iterator(); it.hasNext();) {
ELM elm = it.next();
String name = elm.getName();
String code = elm.getCode();
if (codes.contains(code)) {
if (!fastarMap.containsKey(name)) {
HashSet<Integer> positionSet = new HashSet<Integer>();
positionSet.add(elm.getPosition());
fastarMap.put(name, new FastaR(name, positionSet, elm.getSequence()));
} else {
fastarMap.get(name).addPosition(elm.getPosition());
}
} else {
System.out.println("Code Error: " + elm);
}
}
}
HashMap<String, FastaR> getFastaRMap() {
return fastarMap;
}
void output(String outputFile) {
try {
FileWriter fw = new FileWriter(outputFile);
for (Iterator<FastaR> it = fastarMap.values().iterator(); it.hasNext();) {
FastaR fastaR = it.next();
fw.append(fastaR + "\n");
}
fw.flush();
fw.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
public static void main(String[] args) {
new ELM2FastaR("K", "E:/example.elm").output("E:/example.fr");
}
}
在output 方法中,是如何调用FastaR中的toString()方法的呢??
原因如下:Java中的toString方法在Object中已经存在。由于Java中所有的类都继承自Object类,所以此方法存在于所有对象中,其作用是为了方便所有类的字符串操作。在Java的API文档中指出“建议所有子类都重写此方法”
几个例子:
class TestA {
public String toString() {
return "A feedback from TestA.";
}
}
class TestB {
public String getString() {
return "A feedback from TestB.";
}
}
class TestC {
public String getString() {
return "A feedback from TestC.";
}
}
class TestD{}
public class SimpleTest {
public static void main(String[] args) {
TestA ta = new TestA();
TestB tb = new TestB();
TestC tc = new TestC();
TestD td = new TestD();
System.out.println("From TestA: " + ta);
System.out.println("From TestB: " + tb);
System.out.println("From TestC: " + tc.getString());
System.out.println("From TestD: " + td);
}
}
此程序段的输出如下:
From TestA: A feedback from TestA.
From TestB: TestB@14318bb
From TestC: A feedback from TestC.
From TestD: TestD@ca0b6
其中TestA类重写了toString方法,返回字符串,因此可在println中直接输出。TestB和TestC类尝试用另一种方法名重新设置相同的功能,而事实上没有对toString方法进行重写,因此在对TestB的输出中仍然调用原来继承的toString方法,输出“类名+at标记符@+ 此对象哈希码的无符号十六进制表示”;而在TestC中调用了getString方法,返回自定义的字符串。TestD类中未对toString做任何操作,在主函数中调用时与TestB相同,使用的继承的toString方法,输出与TestB类似。
所以,当运行到fw.append(fastaR + "\n");时,就会调用toString 函数。
JAVA中@Override的作用
想重写父类的方法,比如toString()方法的话,在方法前面加上@Override系统可以帮你检查方法的正确性,
@Override
public String toString(){...}这是正确的
一旦写错写成这样
@Override
public String tostring(){...}
编译器可以检测出这种写法是错误的这样能保证你的确重写的方法正确
而如果不加@Override
public String tostring(){...}这样编译器是不会报错的它只会认为这是你自己新加的一个方法而已
相关文章
- 暂无相关文章
用户点评