如何在Java中通过引用调用?

时间:2011-05-17 09:42:38

标签: java function-calls

由于Java不支持指针,如何通过Java中的引用来调用函数,就像在C和C ++中一样?

12 个答案:

答案 0 :(得分:37)

Java中不可能实现真正的传递。 Java按值传递所有内容,包括引用。但您可以使用容器对象模拟它。

使用其中任何一个作为方法参数:

  • 一个数组
  • a Collection
  • AtomicXYZ类

如果您在方法中更改其内容,则更改的内容将可用于调用上下文。


哎呀,你显然是指通过引用调用方法。这在Java中也是不可能的,因为方法在Java中不是一级公民。 This may change in JDK 8,但目前,您必须使用接口来解决此限制。

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");
    }
}

在代码中使用Foo,这样您就可以轻松地将SomeFoo替换为OtherFoo

答案 1 :(得分:10)

  

如何在Java中通过引用调用?

您无法通过Java中的引用进行调用。期。什么都没有接近。按值引用引用与引用引用不同。

(真正的“参考电话”允许你做这样的事情:

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

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

你根本无法用Java做到这一点。)


  

由于Java不支持指针......

虽然这在技术上是正确的,但它不会阻碍你想要做的事情。

Java 支持支持引用,它们在最重要的方面就像指针一样。不同之处在于,您不能通过对引用进行算术处理,将引用转换为整数类型等等来将引用视为内存地址。并且您无法创建对变量的引用,因为Java或JVM体系结构中不存在该概念。


  

如何像在C和C ++中那样通过Java引用来调用函数?

在Java中,函数(方法)和函数引用不支持作为值。因此,您不能将它们作为参数传递,也不能将它们分配给变量。

但是,可以使用一个实例方法定义一个类,并使用该类的实例而不是函数引用。其他答案举例说明了这种方法。

答案 2 :(得分:2)

通常在java中,这可以通过使用接口来解决:

Collections.sort(list, new Comparator() {

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

});

答案 3 :(得分:1)

最好的方法是使用执行操作的界面。

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

public void task() { }

您可以使用反射来调用任何方法

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

答案 4 :(得分:1)

在Java中,除了基元之外,将Object传递给方法/函数总是通过引用。 有关示例,请参阅Oli Charlesworth's answer

对于基本类型,您可以使用数组包装它: 例如:

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

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

答案 5 :(得分:1)

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;
  }
}

输出将是:

0
1
0
0

答案 6 :(得分:0)

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

Java通过引用操作对象,所有对象变量都是引用。但是,Java不通过引用传递方法参数;它按值传递它们。

答案 7 :(得分:0)

Java只允许按值调用。但是,可以使用按值调用将对象的引用传送到被调用函数。这些引用如果用于操纵被调用函数中对象的数据,则此更改也将在调用函数中可见。我们不能像对指针那样对引用进行指针运算,但是引用可以使用句点运算符指向对象的数据,该运算符在C / C ++中用作'*'运算符。

答案 8 :(得分:0)

来自Java Herbert Shildt第9版的完整参考:“当你将一个对象传递给一个方法时,情况会发生巨大变化,因为对象是通过有效的引用调用传递的。请记住,当你创建时如果是类类型的变量,则只创建对象的引用。因此,当您将此引用传递给方法时,接收它的参数将引用与该参数引用的对象相同的对象。这实际上意味着对象的行为就像它们通过使用call-by-referen ce传递给方法一样。对方法内部对象的更改会影响用作参数的对象。“

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

对getA()的FInal调用显示在对方法public static Obj1 sendObj1(Obj1 o)的调用中更改了原始对象字段'a'。

答案 9 :(得分:0)

JAVA允许使用对象进行内部引用。 当一个人写这个作业 Obj o1 =新的Obj(); Obj o2 = o1; 它是做什么的,o1和o2都指向同一个地址。 操纵任何物体的空间,也会反映在其他物体的空间中。

为此,如上所述,您可以使用Array,Collections

答案 10 :(得分:0)

是的,您可以通过“ 通过参考传递”以另一种方式实施“通过参考传递”。

  • 您应该传递所创建类的引用对象。
  • 然后您可以通过成员函数(。)操纵对象的数据,这将反映在原始数据中。

在下面的代码中,原始数据-> x通过传递参考对象进行操作。

public class Method_Call {
static int x=50;
public void change(Method_Call obj) {
    obj.x = 100;
}

public static void main(String[] args) {

    Method_Call obj = new Method_Call();
    System.out.println(x);
    obj.change(obj);
    System.out.println(x);

}

}

输出: 50 100

答案 11 :(得分:0)

您不能使用Java进行引用调用。期。一切都近在咫尺。而且按值传递引用与按引用调用不同。

我用数组来做这件事...

    package method;


    import java.util.Scanner;

    public class InterChange {



        public static void main(String[] args) {

        Scanner sc=new Scanner(System.in);

        int a[]=new int[2];

        System.out.println("Enter two values");

        for(int i=0;i<2;i++) {

            a[i]=sc.nextInt();
        }




        hange(a);

        for(int i=0;i<2;i++) {

            System.out.println(a[i]);
        }


    }




     static int hange(int b[])
    {
        int temp;

        temp=b[0];
        b[0]=b[1];
        b[1]=temp;
        return b[0]&b[1];

    }

    }