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

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

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

使用以下任何方法作为方法参数:

  • 数组
  • 一个集合
  • 一个AtomicXYZ类

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


哎呀,你显然是指通过引用调用方法。 这在Java中也是不可能的,因为方法在Java中不是一级公民。 这可能会在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

如何在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中,函数(方法)和函数引用不支持作为值。 因此,您不能将它们作为参数传递,也不能将它们分配给变量。

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

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

 Collections.sort(list, new Comparator() { @Override public int compareTo(Object o1, Object o2) { /// code } }); 

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

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

您可以使用reflection来调用任何方法

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

在Java中,除了基元之外,将Object传递给方法/函数总是通过引用。 请参阅Oli Charlesworth的答案 。

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

 public void foo(int[] in){ in[0] = 2; } int[] byRef = new int[1]; byRef[0] = 1; foo(byRef); // ==> byRef[0] == 2. 
 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 

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

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

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

来自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()的最终调用显示在调用方法public static Obj1 sendObj1(Obj1 o)时更改了原始对象字段’a’。

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

所以要做到这一点,如上所述,您可以使用Array,Collections