Java: Как передать байт [] ссылкой?

Вы также можете использовать setMinClusterSize (1);

public MyIconRendered(Context context, GoogleMap map,
                      ClusterManager<AbstractMarker> clusterManager) {
    super(context, map, clusterManager);
    setMinClusterSize(1);
}
21
задан Mahendra 15 November 2016 в 18:52
поделиться

3 ответа

Что Вы делаете в своем методе? Если Вы просто заполняете существующий массив, то Вам не нужна семантика передачи ссылкой - или в.NET или в Java. В обоих случаях ссылка будет передана значением - так изменения в , объект будет видим вызывающей стороной. Это похоже на сообщение кому-то адрес Вашего дома и просьбы, чтобы они поставили что-то ему - без проблем.

, Если Вы действительно хотите семантику передачи ссылкой, т.е. вызывающую сторону, будет видеть любые изменения, внесенные в сам параметр, например, установку в NULL его или ссылку на другой массив байтов, тогда или метод должен возвратить новое значение, или необходимо передать ссылку на своего рода "держателя", который содержит ссылку на массив байтов, и который может иметь (возможно измененный) ссылка, захваченная от него позже.

, Другими словами, если Ваша внешность метода любит это:

public void doSomething(byte[] data)
{
    for (int i=0; i < data.length; i++)
    {
        data[i] = (byte) i;
    }
}

тогда Вы в порядке. Если Ваш метод похож на это:

public void createArray(byte[] data, int length)
{
    // Eek! Change to parameter won't get seen by caller
    data = new byte[length]; 
    for (int i=0; i < data.length; i++)
    {
        data[i] = (byte) i;
    }
}

тогда необходимо изменить его на также:

public byte[] createArray(int length)
{
    byte[] data = new byte[length]; 
    for (int i=0; i < data.length; i++)
    {
        data[i] = (byte) i;
    }
    return data;
}

или:

public class Holder<T>
{
    public T value; // Use a property in real code!
}

public void createArray(Holder<byte[]> holder, int length)
{
    holder.value = new byte[length]; 
    for (int i=0; i < length; i++)
    {
        holder.value[i] = (byte) i;
    }
}

для получения дополнительной информации, читайте Передача параметров в C# и Передача параметров в Java. (Первый лучше записан, чем последний, я боюсь. Однажды я вернусь к выполнению обновления.)

46
ответ дан 29 November 2019 в 06:23
поделиться

На самом деле, в Java, эти ссылки передаются значением .

В этом случае, ссылка byte[] объект. Любые изменения, которые влияют на сам объект, будут замечены из метода вызывающей стороны.

Однако, при попытке заменить ссылку, например, с помощью new byte[length], Вы только заменяете ссылку, которую Вы получили передачей значением, таким образом, Вы не изменяете ссылку в методе вызывающей стороны.

Вот интересное чтение об этой проблеме: Java является Передачей Значением Черт возьми!

<час>

Вот конкретный пример:

public class PassByValue
{
    public static void modifyArray(byte[] array)
    {
        System.out.println("Method Entry:  Length: " + array.length);
        array = new byte[16];
        System.out.println("Method Exit:   Length: " + array.length);
    }

    public static void main(String[] args)
    {
        byte[] array = new byte[8];
        System.out.println("Before Method: Length: " + array.length);
        modifyArray(array);
        System.out.println("After Method:  Length: " + array.length);
    }
}

Эта программа создаст byte массив длины 8 в main метод, который будет звонить modifyArray метод, где новое byte массив длины 16 создается.

может казаться, что путем создания нового byte массив в modifyArray метод, что длина эти byte массив после возврата main метод будет 16, однако, запуская эту программу, показывает что-то другое:

Before Method: Length: 8
Method Entry:  Length: 8
Method Exit:   Length: 16
After Method:  Length: 8

длина эти byte массив после возврата из modifyArray метод возвращается к [1 117] вместо [1 118].

, Почему это?

Поэтому main метод звонил modifyArray метод и отправил скопированная ссылка на new byte[8] при помощи [1 142] передача значением . Затем modifyArray метод выбросил скопированную ссылку путем создания new byte[16] . К тому времени, когда мы уезжаем modifyArray, ссылка на эти new byte[16] вне объема (и в конечном счете будет собран "мусор".) Однако main метод все еще имеет ссылку на new byte[8] как он только [1 144] отправили скопированную ссылку и не фактическую ссылку на ссылку.

, Который должен продемонстрировать, что Java передаст ссылку с помощью передачи значением.

18
ответ дан 29 November 2019 в 06:23
поделиться

передача использования Java значением для аргументов метода .

  • Примитивы (интервал, булевская переменная, и т.д.) являются особыми случаями в Java.. не возражает по сути. В этом случае копия примитива (аргумент) передается в функцию. Это образовывает гель хорошо с передачей теорией ценности.
  • Для Объектов, что происходит, то, что касательно к объекту передается значением (копия ссылки сделана, а не объект)..., но обе ссылки указывают на тот же объект. Таким образом, при изменении параметра объекта в методе фактический объект будет изменен.

Эта статья должна выручить Вас.. http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

Что касается вопроса OP, просто передайте в ссылке на байт [] массив к методу. Конечный результат был бы подобен для передачи ссылкой. Если Вы измените массив байтов, то вызывающая сторона будет в состоянии видеть, что изменения отправляют осуществление метода.

Обновление для подавления сопротивления:) => указывает на вывод

Земля.NET

class Counter
{
  private int m_count = 0;
  public override string  ToString()
  {
     return String.Format("Counter ID{0} : Value {1}", this.GetHashCode(), m_count);
  }
  public void Increment()
  {  m_count++;  }
}
class MakeAPass
{
   public void PassByValueAndModify(int i)
   {   i = 20;    }

   public void PassByRefAndModify(ref int i)
   {   i = 20;   }

   public void PassByValueAndModify(Counter c)
   {   c.Increment();   }

   public void PassByRefAndModify(ref Counter c)
   {   c.Increment();   }

   public void PassByRefAndReassign(ref Counter c)
   {
      c = new Counter();
      for (int i=0; i<5; ++i)
         c.Increment();
   }
}

static void Main(string[] args)
{
   MakeAPass obj = new MakeAPass();
   int intVal = 10;
   obj.PassByValueAndModify(intVal);
   Console.WriteLine(intVal);              // => 10
   obj.PassByRefAndModify(ref intVal);
   Console.WriteLine(intVal);              // => 20

   Counter obCounter = new Counter();
   obj.PassByValueAndModify(obCounter);
   Console.WriteLine(obCounter.ToString());  // => Counter ID58225482 : Value 1
   obj.PassByRefAndModify(ref obCounter);
   Console.WriteLine(obCounter.ToString());  // => Counter ID58225482 : Value 2
   obj.PassByRefAndReassign(ref obCounter);
   Console.WriteLine(obCounter.ToString());  // => Counter ID54267293 : Value 5
}

Земля Java

Незначительные модификации reqd: Используйте хэш-код () и + к строкам concat в Counter.java...

class MakeAPass
{
   public void PassByValueAndModify(int i)
   {   i = 20;   }

   // can't be done.. Use Integer class which wraps primitive
   //public void PassByRefAndModify(ref int i)

   public void PassByValueAndModify(Counter c)
   {   c.Increment();   }

   // same as above. no ref keyword though
   //public void PassByRefAndModify(ref Counter c)

   // this can't be done as in .net
   //public void PassByRefAndReassign(ref Counter c)
   public void PassAndReassign(Counter c)
   {
      c = new Counter();
      for (int i=0; i<5; ++i)
         c.Increment();
   }
}
public static void main(String args[])
{
   MakeAPass obj = new MakeAPass();
   int intVal = 10;
   obj.PassByValueAndModify(intVal);
   System.out.println(intVal);                 // => 10 
   //obj.PassByRefAndModify(ref intVal);
   //System.out.println(intVal);               // can't get it to say 20

   Counter obCounter = new Counter();
   obj.PassByValueAndModify(obCounter);
   System.out.println(obCounter.ToString());    // => Counter ID3541984 : Value 1
   //obj.PassByRefAndModify(ref obCounter);
   //Console.WriteLine(obCounter.ToString());   // no ref. but can make it 2 by repeating prev call
   obj.PassAndReassign(obCounter);
   System.out.println(obCounter.ToString());    // => Counter ID3541984 : Value 1
                                                // can't get it to say 5  
}
7
ответ дан 29 November 2019 в 06:23
поделиться
Другие вопросы по тегам:

Похожие вопросы: