InputStream.read(byte)方法怎么可能工作呢



我对InputStream类的一个方法有疑问,因为在我看来它永远都不可能工作。

让我们有这样的东西:

InputStream is;
byte[] b = new byte[64];
is.read(b);
// and now the byte array b contains data comming through InputStream???

如果.read()方法的使用看起来像这样,我会理解:

b = is.read();

因为读取方法将返回字节数组。

但是,真正的方法如何在其论点中写入一些内容,并使其在自身之外可见

就像我会有这个:

String myString = "myText";
public void myMethod(String s) {
  s = "abc123";
}
myMethod(myString);
// and now is the content of myString equal to "abc123" instead of "myText" ???
// ANSWER: no!

谢谢你的回复。

除基元类型外的所有类型都是java中的对象(包括数组)对象通过引用的副本从一个方法传递到另一个方法因此,如果被调用的方法对传递给它的对象进行了更改,则方法最终会对传递给该方法的同一对象进行更改。因此,更改也会反映到调用方法中。

您需要了解对象以及它们如何在方法调用之间传递,才能详细理解这一点。请参阅此链接以更好地理解。

因为读取方法将返回字节数组。

呃?你在哪里读到的?InputStream.read()方法返回一个整数。

真正的方法如何在其论点中写入一些内容,并使其在自身之外可见?

因为您传入了对.read(byte[])将写入的数组的引用。此方法的返回值是实际写入作为参数传递的字节数组的字节数。

此代码有效:

public void writeOneToFirstElement(final int[] array)
{
    array[0] = 1;
}
final int[] foo = { 0 };
writeOneToFirstElement(foo);
System.out.println(foo[0]); // prints 1

数组只是对对象的引用,导致数据所在的地址在修改时不会发生变化,它可以这样工作此处解释:http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html
编辑:键入

byte arrayString都是引用类型。。当您将它们作为参数传递时,将复制引用,并且它们都引用同一对象。。


例如,remote类似于对TV的引用。当您将遥控器传递给另一个人时,他仍然可以访问TV

对象是通过引用的副本从一个方法传递到另一个方法的。因此,如果被调用的方法对传递给它的对象进行了更改,那么方法最终会对传递给该方法的同一对象进行更改。因此,更改也会反映到调用方法中。例如,将参数中的String替换为String[]并检查输出。

public static void main(String[] args) 
{
 String[] myString =  {"myText"};
 myMethod(myString);
 System.out.println(myString[0]);
}
public void myMethod(String[] s) {
  s[0] = "abc123";
}

最新更新