2013-03-25 3 views
1

Я изучаю, чтобы выполнить мой тест Java OCA, используя книгу «Java SE7 Programming Essentials» Майкла Эрнеста. Это мой код для одного из ответов на вопрос ниже:Пользовательский toString() в java

public class Point3D { 
    int x, y, z; 

    public void setX(int x) { 
     this.x = x; 
    } 

    public int getX() { 
     return this.x; 
    } 

    public void setY(int y) { 
     this.y = y; 
    } 

    public int getY() { 
     return this.y; 
    } 

    public void setZ(int z) { 
     this.z = z; 
    } 

    public int getZ() { 
     return this.z; 
    } 

    public String toString(Point3D p) { 
     String result = p.getX() + "," + p.getY() + "," + p.getZ(); 
     return result; 
    } 

    public static void main(String args[]) { 
     Point3D point = new Point3D(); 
     point.setX(5); 
     point.setY(12); 
     point.setZ(13); 
     System.out.println(point.toString(point)); 
    } 
} 

Мой код работает, но в последней строке, я думаю, что я сделал свой код странным образом, не должно ли быть способ сделать только point.toString(), а не point.toString(point) вернуть строковое представление точки? Может ли кто-нибудь объяснить мне, как это исправить?

Я уверен, что это простой ответ, просто попытка понять это, потому что я подозреваю, что это указывает на дыру в моем знании java.

+2

Вы можете использовать это ключевое слово, чтобы получить доступ к свойствам объекта в методе toString() и тем самым сделать метод беспроблемным. – guruprasath

+0

Ничего себе !! Я думаю, что это было 10 ответов за 4 минуты. Всем спасибо!! – localhost

ответ

5

Вашего метод public String toString(Point3D p) не перекрывая Object.toString(), который является стандартным способом для получения String представления в Object.

Точка переопределения это позволить любому подклассу Object обеспечить соответствующее представление объекта как String. Java API использует этот метод в ряде обстоятельств, главным образом, при необходимости превратить Object в String (например, при выполнении System.out.println(object) или выполнения конкатенации строк:

String s = "The point is " + pointObject;

Implement как ay89 предложил:

@Override 
public String toString() { 
    String result = getX() + "," + getY() + "," + getZ(); 
    return result; 
} 

Обратите внимание на использование в @Override аннотацию. Если вы использовали его на метод, компилятор предупреждал вас, что-то не так с ее определением.

5

почему бы вам не использовать

public String toString() { 
    String result = getX() + "," + getY() + "," + getZ(); 
    return result;  
} 

, то вы можете просто использовать System.out.println(point)

1

Вы могли бы просто использовать this вместо параметра p. Поэтому измените свой метод на public String toString() и измените p на this в самой функции.

2

Вам необходимо переопределить метод toString(). Все объекты в Java имеют метод toString (это метод класса Object).

Реализация объекта по умолчанию просто возвращает хэш-код этого объекта (поэтому, если вы не переопределите его, это то, что вы получите также), но если вы переопределите, вы можете сделать что-то более значимое с данными, специфичными для вашего объект.

@Override 
public String toString() { 
    return this.getX() + "," + this.getY() + "," + this.getZ(); 
} 
0

Попробуйте

public String toString() { 
    String result = this.getX() + "," + this.getY() + "," + this.getZ(); 
    return result; 
} 
0

Это должно исправить:

public String toString() { 
String result = this.getX() + "," + this.getY() + "," + this.getZ(); 
return result;  
} 
+0

Ха-ха! Когда я подумал, что первым отвечу первым, 3 человека избили меня.:) О, жизнь. – Jops

0

сделать так

public String toString() { 
     String result = this.getX() + "," + this.getY() + "," + this.getZ(); 
     return result; 
    } 

это является внутренняя ссылка на вызывающий объект (точка в вашем случае) и, таким образом, его использование может привести к аннулированию необходимость точки аргумента

0

Этот код:

@Override 
public String toString() { 
    return "{ x: " + x + ", y: " + y + ", z: " + z + " }"; 
} 

вывод будет таким:

{ x: 13, y: 2, z: 10 } 

Как ваши методы get возвращают атрибуты, используя атрибуты, которые вы непосредственно сохраняете, вызовы метода.

Кроме того, последние компиляторы оптимизируют это объединение с помощью StringBuilder автоматически.

Для получения дополнительной информации проверьте это post.

Я надеюсь, что это помогает

0
public String toString() { 
    String result = this.x+ "," + this.y + "," + this.z; 
    return result;  
} 

Используйте код, как и выше.

0

Вашего метод toString должен быть public String toString() [без каких-либо аргументов], что означает переопределяется из класса Object

Если вы сделаете так что вы можете сделать только: System.out.println(point);

3

Я хотел бы использовать String.format вместо конкатенации для ясности:

public String toString() { 
    return String.format("(%d, %d, %d)", x, y, z);  
} 

С помощью этого метода вы можете изменить способ вывода результатов таким образом, чтобы не требовать много «умственной реконструкции» от читателей вашей трески е. Например, вы должны решить, чтобы изменить выход, скажем, {x=1, y=2, z=3} вы можете просто переписать формат строку следующим образом:

return String.format("{x=%d, y=%d, z=%d}", x, y, z); 
3

ОК, я работал это сам - проводка вопроса оказался так же, как Rubber Ducking для меня.

мне нужно добавить еще один метод:

public String toString() { 
    String result = this.getX() + "," + this.getY() + "," + this.getZ(); 
    return result;  
} 
0

Для переопределенных/реализованных методов использования @Override аннотацию, который дал бы вам ошибку на неправильно параметризованных ToString.

Кроме того, более важно не использовать геттеры в toString.

В конкатенации println или String Object.toString вызывается автоматически, не вызывайте его явно (чтобы показать, что вы знаете это).

@Override 
public String toString() { 
    StringBuilder sb = new StringBuilder(); 
    sb.append("Point3D(").append(x).append(", ") 
     .append(y).append(", ").append(z).append(")"; 
    return sb.toString(); 
}