理解java中的接口,类和构造函数

时间:2011-04-08 08:51:41

标签: java class interface

现在我正在尝试使用表示二进制数的int来实现this interface

我知道我不应该实施to string();,但我们假设我需要。{/ p>

这是我到目前为止写的:

public class IPAddressInt implements IPAddress {
private int ipAdress;

public IPAddressInt(int num1,int num2, int num3, int num4){
    String n1=Integer.toBinaryString(num1);
    String n2=Integer.toBinaryString(num2);
    String n3=Integer.toBinaryString(num3);
    String n4=Integer.toBinaryString(num4);

    String finalString=n1+n2+n3+n4;
    this.ipAdress=Integer.parseInt(finalString);
}

public String toString() {
    return this.toString();


}

当我想要返回this.ipAdress.toString();甚至ipAdress.toString()时 编译器说它是Cannot invoke toString() on the primitive type int, 当我只写 this.toString();时,它有效。为什么?我知道int可以转换为字符串,this如何工作而整个语句不是?不应该是一样的吗?我会得到我想要的东西吗?

谢谢。

4 个答案:

答案 0 :(得分:4)

调用this.toString()只会爆炸 - 它以递归方式调用相同的方法,没有退出。

您无法直接在toString上调用ipAddress的原因是int是基本类型,您无法调用基本类型的方法。

要将任何内容转换为字符串,请使用String.valueOf(ipAddress)。特别是int,您可以使用Integer.toString(ipAddress)

为什么你首先要转换成二进制字符串并不是很清楚......虽然这对我来说不是一个好主意。你没有使用

的原因
ipAddress = (num1 << 24) | (num2 << 16) | (num3 << 8) | num4;

(假设每个值实际上在0-255范围内)。

高度怀疑二进制表示确实是你想要的,特别是考虑到缺少填充,然后你试图将其解析为十进制号。

答案 1 :(得分:0)

当你说“它有效”时,我怀疑你的意思是“它编译”。如果您实际调用toString方法,您将获得堆栈溢出,或者如果您的编译器/ JVM非常聪明,可能只是一个无限循环。

要将int转换为字符串,请致电Integer.toString(this.ipAdress)。 (但最好是拼写address正确: - )。)

[编辑补充说:写完之后我看到另一个答案,Jon Skeet为此目的更喜欢String.valueOf而不是Integer.toString。他是一个非常聪明的家伙,可能有充分的理由。如果您更改ipAddress的类型,则意味着更少必须更改 - 例如,我的意思是ipAdress。]

答案 2 :(得分:0)

你想要的可能是实现这样的toString方法:

public String toString()
{
    return Integer.toString(ipAdress);
}

编译器说的是真的,因为你不能在原始类型上调用任何方法。您必须将原语int包装到一个Integer中,该Integer实现了toString方法。上面的代码片段只是一种更有效的调用方式:

return Integer.valueOf(ipAdress).toString();

答案 3 :(得分:0)

你的toString方法以递归方式调用自身,最终会出现堆栈溢出异常。

尝试将ipAdress转换为这样的字符串:

public String toString(){   return Integer.toString(ipAdress); }

仅供参考,你的变量ipAdress有一个拼写错误,应该是ipAddress。