【问题标题】:Why I can't use this program in a second way为什么我不能以第二种方式使用这个程序
【发布时间】:2016-07-31 08:26:51
【问题描述】:
String word = "coding";

/*first way*/
byte[] code = word.getBytes();

/*second way*/
byte[] code2 = String.getBytes(word);

谁能解释一下为什么我不能用第二种方式声明我的字节数组。 他们两个有什么区别?

【问题讨论】:

  • 可能是因为String类没有静态getBytes方法?
  • 为什么需要另一种方式?
  • 所以我只能使用第二种方法,如果 getBytes 方法是静态的?
  • @ŁukaszKrzyżakFranczyk,不,如果它是静态的,也可以在实例上使用此方法
  • @DavidWallace,究竟什么是正确的?

标签: java static byte non-static


【解决方案1】:

有人能解释一下为什么我不能用第二种方式声明我的字节数组吗?

您不能使用第二种方式,因为在 String 类中没有名称为 getBytes 的静态方法。

但如果需要第二种方式,你可以编写自己的变体:

public static byte[] getBytes(String s) {
    return s.getBytes();
}

他们两个有什么区别?

  • instance.getBytes() 存在,是一个非静态方法,不带任何参数
  • String.getBytes(String s) 是一个static 方法,接受1 个String 参数,不存在。

您似乎不了解静态方法和非静态方法之间的区别。非静态方法只能通过对实例的引用来调用。它们不能被类名使用。例如(getBytes() 是非静态的):

byte[] bytes = instance.getBytes();
byte[] bytes = ClassName.getBytess();

静态方法可以与名称类以及实例引用一起使用。最后一个在概念上是错误的,你应该避免这种情况。 例如(getBytes()static):

byte[] bytes = instance.getBytes(); // think twice before use
byte[] bytes = ClassName.getBytess();

但是静态getBytes() 的调用看起来很奇怪,不是吗?静态上下文对实例变量一无所知,也没有关于源获取字节的信息。

【讨论】:

    【解决方案2】:

    概念:你只能使用类名直接调用类的静态成员。但如果它是类的非静态成员,则必须使用引用变量来调用它。

    Info: getBytes() 不是 String 类的静态函数。因此,它只能使用引用变量来调用。你可以找到它here

    解释:你的第一种方法是正确的,第二种方法是不正确的,因为这里你直接使用类名来调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多