由于Java不支持指针,如何通过Java中的引用来调用函数,就像在C和C ++中一样?
答案 0 :(得分:37)
Java中不可能实现真正的传递。 Java按值传递所有内容,包括引用。但您可以使用容器对象模拟它。
使用其中任何一个作为方法参数:
如果您在方法中更改其内容,则更改的内容将可用于调用上下文。
哎呀,你显然是指通过引用调用方法。这在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];
}
}