2013-08-13 2 views
3

Я знаю, что здесь нет указателя на Java. Но как изменить значение в области вызова? Например, я хочу написать функцию, которая принимает целое число num, установить целое число в 0, если оно больше 21, иначе ничего не делать. В основном мой код выглядит следующим образом:Как реализовать базовый указатель

int a=34; 
KillOver21(a); 
System.out.print(a); 

Я ожидаю 0.

+3

Почему бы не просто вернуть значение из функции? –

+0

Вы можете сделать это только с изменяемыми типами. – roippi

+1

Тот факт, что Java не имеет указателей, не имеет значения. В смысле Паскаля он * имеет * указатели. Важно то, что у него нет пропусков. – EJP

ответ

4

Java является pass by value, поэтому копия параметра а передается методу, поэтому изменения в a в метод не влияет на исходный аргумент a в main

максимально вы можете сделать, это return int от KillOver21(a) метод

int z = KillOver21(a); // This will return 0 
System.out.print(z); 

Но вы можете достичь что-то подобное с пользовательскими объектами, скажем, у вас есть класс

class AHolder { 

    public int a; 

} 

, то вы можете ожидать AHolder экземпляр для изменения

public static void main(String [] args) { 
    AHolder a = new AHolder(); 
    a.a = 34; 
    killOver21(a); 
    System.out.println(a.a); 
} 

public static void killOver21(AHolder b) { 
    if(b.a > 21) { 
     b.a = 0; 
    } 
} 

Поскольку в последнем случае (даже если его Pass by Value), ссылка копируется и оба контрольная точка к тому же объекту. Таким образом, изменения, сделанные внутри метода killOver21, фактически изменяет объект.

enter image description here

+1

Или вы можете использовать объект, который будет проходить по ссылке. –

+0

@Timothy Jones: Нет, будьте осторожны, даже если вы используете тип, который наследует от 'Object', он * все еще * передается по значению. – jason

+0

Ну, технически говоря, «Объект» передается значением его ссылочного дескриптора. Итак, если вы используете изменяемый тип и передаете его, вы можете изменить его с помощью сеттера, что приведет к желаемому поведению. –

3

Это просто невозможно, Java поддерживает передачу по значению. Значение int a будет скопировано в функцию.

Вместо примитива вы можете использовать Object, где ссылочное значение будет скопировано в вашу функцию, с помощью которой вы можете получить фактический объект и изменить его.

+0

Я вижу. Большое спасибо. – NewbieDave

+0

вы приветствуете @NewbieDave :) –

1

В принципе невозможно на Java, период. int являются неизменяемыми и передаются по значению. Вы бы потребность создать изменяемую int типа:

class MutableInt { 
    private int value; 

    public MutableInt(int value) { this.value = value; } 

    public getValue() { return this.value; } 
    public setValue(int value) { this.value = value; } 
} 

Тогда:

void KillOver21(MutableInt m) { 
    if(m.getValue() > 21) { m.setValue(0); } 
} 

Однако следует помнить, изменяемые типы, которые представляют собой понятия, которые определяются их стоимости, а не их идентичность, как правило, очень плохая идея. Но это единственный способ добиться того, чего вы пытаетесь достичь. Опять же, я предупреждаю вас самыми сильными словами: что вы делаете, это идея bad. Вы должны найти другой путь.

Doc, мне больно, когда я это делаю.

Тогда не делайте этого!

1

Самый простой способ (быстрый & грязный), чтобы поместить значение в массиве

int holder[] = new int[]{ a}; 

KillOver21(holder) 

System.out.printf("value=[%d]", holder[0] ); 

void KillOver21(int holder[]) { 
    holder[0] = 0; 
} 
Смежные вопросы