【问题标题】:Understanding Interfaces, classes and constructors in java了解java中的接口、类和构造函数
【发布时间】:2011-04-08 08:51:41
【问题描述】:

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

我知道我不应该实现to string();,但假设我需要。

这是我到目前为止写的:

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 是如何工作的,而整个语句却不是?不应该一样吗?我会得到我想要的吗?

谢谢。

【问题讨论】:

  • 很高兴看到您既有幽默感又有常识。 :-) 希望你能得到满意的解决方案。

标签: java class interface


【解决方案1】:

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

你不能直接在ipAddress上调用toString的原因是int是一个原始类型,你不能在原始类型上调用方法。

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

虽然不太清楚为什么首先要转换为二进制字符串……但对我来说这不是一个好主意。您不使用的任何原因

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

(假设每个值都在 0-255 范围内)。

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

【讨论】:

  • @Jon:谢谢你的评论。你能解释一下你做了什么创建这种 ipAddress 吗?以我的方式实施它是错误的吗?我猜它不会是整数,因为左边的零不会出现,对吧?
  • @Nir:不清楚你的意思。一般来说,使用字符串转换将一种数字形式(在本例中为 4 个单独的整数)转换为另一种数字形式(在本例中为 1 个整数)几乎不是一个好主意。
  • @Jon:我想了解这个表达式:ipAddress = (num1 &lt;&lt; 24) | (num2 &lt;&lt; 16) | (num3 &lt;&lt; 8) | num4; 的含义。使用此位运算符,您可以将数字自动转换为二进制表示?
  • @Nir:数字已经以二进制形式存储。我假设您将传入类似 192、168、0、1 的内容来表示 IP 地址“192.168.0.1”。左移和 OR 将创建四个 8 位值的单个 32 位表示。
  • @Jon:谢谢。我怎样才能使用这种表示?假设我现在想找到第三个原始号码,我该怎么做?我试图在维基百科中阅读,但这种表示覆盖得很少。
【解决方案2】:

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

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

[编辑补充:在写完这篇文章后,我看到在另一个答案中 Jon Skeet 更喜欢 String.valueOf 而不是 Integer.toString 。他是一个非常聪明的小伙子,可能有充分的理由。如果您更改ipAddress 的类型,这将意味着更少的更改——呃,我的意思是ipAdress,例如。]

【讨论】:

    【解决方案3】:

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

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

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

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

    【讨论】:

      【解决方案4】:

      您的 toString 方法正在递归调用自身,最终会导致堆栈溢出异常。

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

      公共字符串 toString() { return Integer.toString(ipAdress); }

      仅供参考,您的变量 ipAdress 有错字,应该是 ipAddress。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-13
        • 2010-11-11
        相关资源
        最近更新 更多