2013-08-13 2 views
3

Java에서 포인터가 없다는 것을 알고 있습니다. 그러나 호출 범위에서 값을 변경하려면 어떻게해야합니까? 예를 들어, 정수 num을 취하는 함수를 작성하려고합니다. 정수가 21보다 큰 경우 정수를 0으로 설정하고, 그렇지 않으면 아무것도하지 않습니다. 기본 포인터를 구현하는 방법

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

내가 너무 매개 변수 (a)의 사본이 방법으로 전송, 0

+3

왜 그냥 함수에서 값을 반환 내에서 값을 넣어하는 것입니다? –

+0

변경할 수있는 유형에서만이 작업을 수행 할 수 있습니다. – roippi

+1

Java에 포인터가 없다는 사실은 부적합합니다. 파스칼의 의미에서는 포인터가 있습니다. 문제는 참조별로 전달이 없다는 것입니다. – EJP

답변

4

자바 pass by value이다 기대 때문에 개조에의 a에 : 주에서 , 내 코드는 다음과 같다 방법은 당신이 할 수있는 최대가 return int 방법 KillOver21(a)에서

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

원래 인수 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; 
    } 
} 

을 변경 당신은 당신이 기대할 수

다음
class AHolder { 

    public int a; 

} 

클래스가 있다고 가정 해 값에 의한 패스), 참조는이고 모두 참조 대상은 동일한 개체입니다. 따라서 실제로 killOver21 메서드 내에서 변경된 내용이 인 경우 개체가 변경됩니다.

enter image description here

+1

또는 참조로 전달 될 개체를 사용할 수 있습니다. –

+0

@Timothy Jones : 아니요, 'Object'로부터 상속받은 타입을 사용하더라도 여전히 값으로 전달됩니다. – jason

+0

기술적으로 말하면,'Object'는 참조 핸들의 값에 의해 전달됩니다. 따라서 변경 가능한 유형을 사용하고이를 전달하면 설정자를 사용하여 변경할 수 있으므로 원하는 동작이 발생합니다. –

3

는 자바 값 의해 패스를 지원 단순히 불가능하다. int a의 값이 함수에 복사됩니다.

기본 값 대신 Object을 사용할 수 있습니다. 여기서 참조 값은 실제 개체를 가져 와서 수정할 수있는 함수에 복사됩니다.

+0

알겠습니다. 고마워. – NewbieDave

+0

당신은 @NewbieDave를 환영합니다 :) –

1

Java에서는 근본적으로 불가능합니다. int은 변경할 수 없으며 값으로 전달됩니다. 자신의 정체성이 일반적으로보다는 자신의 값으로 정의되는 개념을 나타내는 가변 타입을, 그러나

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

주의 : 다음

class MutableInt { 
    private int value; 

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

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

: 당신은 필요는 변경 가능한 int 유형을 생성하는 것 매우 나쁜 생각. 그러나 이것이 달성하려는 목표를 달성하는 유일한 방법입니다. 다시 말하지만, 가장 강한 단어로주의를 기울이십시오. 당신이하려는 것은 불량 아이디어입니다. 다른 방법을 찾아야합니다.

의사, 내가 이것을 할 때 아파요.

그런 다음하지 마세요.

1

simpliest 방법은 (빠른 & 더러운) 배열

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

KillOver21(holder) 

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

void KillOver21(int holder[]) { 
    holder[0] = 0; 
} 
관련 문제