it-swarm.com.de

Wie mache ich einen Aufruf per Referenz in Java?

Da Java keine Zeiger unterstützt. Wie ist es möglich, eine Funktion per Verweis in Java aufzurufen, wie in C und C++?

26
Shashi Bhushan

Echte Referenz-Referenz ist in Java nicht möglich. Java übergibt alles nach Wert, einschließlich Referenzen. Sie können es aber mit Containerobjekten simulieren. 

Verwenden Sie einen dieser Parameter als Methodenparameter:

  • eine Anordnung
  • eine Sammlung
  • eine AtomicXYZ-Klasse

Wenn Sie den Inhalt einer Methode ändern, stehen die geänderten Inhalte für den aufrufenden Kontext zur Verfügung.


Ups, Sie meinen anscheinend, eine Methode als Referenz aufzurufen. Dies ist auch in Java nicht möglich, da Methoden keine Bürger der ersten Ebene in Java sind. Dies kann sich in JDK 8 ändern , aber vorläufig müssen Sie Schnittstellen verwenden, um diese Einschränkung zu umgehen.

public interface Foo{
    void doSomeThing();
}

public class SomeFoo implements Foo{
    public void doSomeThing(){
       System.out.println("foo");
    }
}

public class OtherFoo implements Foo{
    public void doSomeThing(){
       System.out.println("bar");
    }
}

Verwenden Sie Foo in Ihrem Code, damit Sie SomeFoo leicht durch OtherFoo ersetzen können.

37

Wie kann man in Java per Referenz anrufen?

In Java können Sie keine Referenzaufrufe durchführen. Zeitraum. Nichts kommt auch nur in die Nähe. Das Übergeben einer Referenz als Wert ist NICHT dasselbe wie das Aufrufen als Referenz.

(Mit "Call-by-Reference" können Sie Folgendes tun:

void swap(ref int i, ref int j) { int tmp = *i; *i = *j; *j = tmp }

int a = 1;
int b = 2;
swap(a, b);

Das geht in Java einfach nicht.)


Da Java keine Zeiger unterstützt ...

Dies ist zwar technisch gesehen richtig, es würde jedoch nicht ein Hindernis für das sein, was Sie versuchen, zu tun.

Java does unterstützt Referenzen , die in den wichtigsten Punkten wie Zeiger sind. Der Unterschied besteht darin, dass Sie Referenzen nicht als Speicheradressen behandeln können, indem Sie sie arithmetisch verarbeiten, in Ganzzahltypen konvertieren und so weiter. Sie können auch keinen Verweis auf eine Variable erstellen, da das Konzept in Java oder in der JVM-Architektur nicht vorhanden ist.


Wie ist es möglich, eine Funktion als Referenz in Java aufzurufen, wie wir es in C und C++ tun?

In Java werden Funktionen (Methoden) und Verweise auf Funktionen nicht als Werte unterstützt. Sie können sie also nicht als Argumente übergeben und Variablen nicht zuweisen.

Sie können jedoch eine Klasse mit einer Instanzmethode definieren und anstelle einer Funktionsreferenz eine Instanz der Klasse verwenden. Andere Antworten geben Beispiele für diesen Ansatz.

11
Stephen C

In Java wird dies normalerweise durch die Verwendung von Schnittstellen gelöst:

Collections.sort(list, new Comparator() {

  @Override
  public int compareTo(Object o1, Object o2) {
  /// code
  }

});
2
Vladimir Ivanov

Am besten verwenden Sie eine Schnittstelle, die die Aktion ausführt.

// Pass a Runnable which calls the task() method
executor.submit(new Runnable() {
    public void run() {
        task();
    }
});

public void task() { }

Sie können Reflexionen verwenden, um eine beliebige Methode aufzurufen

Method method = MyClass.class.getMethod("methodToCall", ParameterType.class);
result = method.invoke(object, args);
1
Peter Lawrey

In Java wird, außer bei Primitiven, die Übergabe von Object an eine Methode/Funktion immer als Referenz angegeben. __ Siehe Oli Charlesworth's answer für das Beispiel.

Bei primitiven Typen können Sie es mit dem Array: .__ umschließen. Beispiel:

public void foo(int[] in){
  in[0] = 2;
}

int[] byRef = new int[1];
byRef[0] = 1;
foo(byRef);
// ==> byRef[0] == 2.
1
Trung
package jgf;

public class TestJavaParams {

 public static void main(String[] args) {
    int[] counter1 = new int[1];
    counter1[0] = 0;
    System.out.println(counter1[0]);
    doAdd1(counter1);
    System.out.println(counter1[0]);
    int counter2 = 0;
    System.out.println(counter2);
    doAdd2(counter2);
    System.out.println(counter2);   
  }

  public static void doAdd1(int[] counter1) {
    counter1[0] += 1;
  }

  public static void doAdd2(int counter2) {
    counter2 += 1;
  }
}

Ausgabe wäre:

0
1
0
0
1
JGFMK

Java erlaubt eine interne Referenz mit Objekten . Wenn man diese Zuweisung schreibt Obj o1 = new Obj (); Obj o2 = o1; Was macht es, auf das sowohl o1 als auch o2 zeigen Dieselbe Adresse . Wenn Sie den Raum eines Objekts manipulieren, wird dies auch in den anderen Objekten reflektiert.

Zu diesem Zweck können Sie, wie oben erwähnt, entweder Array, Collections verwenden

0
Yash Bansal

http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html

Java bearbeitet Objekte anhand von Verweisen und alle Objektvariablen sind Verweise. Allerdings übergibt Java keine Methodenargumente als Referenz. es übergibt sie als Wert.

0
Swetha D Murthy

Von Java The Complete Reference von Herbert Shildt, 9. Auflage: "Wenn Sie ein Objekt an eine Methode übergeben, ändert sich die Situation dramatisch, da Objekte von dem übergeben werden, was effektiv als Referenz bezeichnet wird. Denken Sie daran, wenn Sie eine Variable von erstellen Bei einem Klassentyp erstellen Sie nur einen Verweis auf ein Objekt. Wenn Sie diesen Verweis an eine Methode übergeben, verweist der Parameter, der sie empfängt, auf das gleiche Objekt wie das Objekt, auf das sich das Objekt bezieht wenn sie mit call-by-referen ce an Methoden übergeben werden. Änderungen am Objekt innerhalb der Methode wirken sich auf das als Argument verwendete Objekt aus. "

package objectpassing;

public class PassObjectTest {

    public static void main(String[] args) {
        Obj1 o1 = new Obj1(9);
        System.out.println(o1.getA());
        o1.setA(3);
        System.out.println(o1.getA());
        System.out.println(sendObj1(o1).getA());
        System.out.println(o1.getA());
    }

public static Obj1 sendObj1(Obj1 o)
{
    o.setA(2);
    return o;
}


}

class Obj1
{
    private int a;

    Obj1(int num)
    {
        a=num;
    }

    void setA(int setnum)
    {
        a=setnum;
    }

    int getA()
    {
        return a;
    }
}

OP: 9 3 2 2

Ein vollständiger Aufruf von getA () zeigt, dass das ursprüngliche Objektfeld 'a' im Aufruf der Methode public static Obj1 sendObj1 (Obj1 o) geändert wurde. 

0
Dave Black

Java erlaubt nur den Aufruf nach Wert. Verweise auf Objekte können jedoch durch Aufruf von value an die aufgerufene Funktion übergeben werden. Wenn diese Verweise verwendet werden, um die Daten des Objekts in der aufgerufenen Funktion zu bearbeiten, wird diese Änderung auch in der aufrufenden Funktion sichtbar. Wir können keine Zeigerarithmetik für die Referenzen ausführen, wie dies bei Zeigern der Fall ist. Die Referenzen können jedoch auf die Daten des Objekts mit einem Period-Operator verweisen, der in C/C++ als Operator "*" fungiert. 

0
user3449128