Java에서 포인터가 없다는 것을 알고 있습니다. 그러나 호출 범위에서 값을 변경하려면 어떻게해야합니까? 예를 들어, 정수 num을 취하는 함수를 작성하려고합니다. 정수가 21보다 큰 경우 정수를 0으로 설정하고, 그렇지 않으면 아무것도하지 않습니다. 기본 포인터를 구현하는 방법
int a=34;
KillOver21(a);
System.out.print(a);
내가 너무 매개 변수 (a)의 사본이 방법으로 전송, 0
Java에서 포인터가 없다는 것을 알고 있습니다. 그러나 호출 범위에서 값을 변경하려면 어떻게해야합니까? 예를 들어, 정수 num을 취하는 함수를 작성하려고합니다. 정수가 21보다 큰 경우 정수를 0으로 설정하고, 그렇지 않으면 아무것도하지 않습니다. 기본 포인터를 구현하는 방법
int a=34;
KillOver21(a);
System.out.print(a);
내가 너무 매개 변수 (a)의 사본이 방법으로 전송, 0
자바 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
메서드 내에서 변경된 내용이 인 경우 개체가 변경됩니다.
또는 참조로 전달 될 개체를 사용할 수 있습니다. –
@Timothy Jones : 아니요, 'Object'로부터 상속받은 타입을 사용하더라도 여전히 값으로 전달됩니다. – jason
기술적으로 말하면,'Object'는 참조 핸들의 값에 의해 전달됩니다. 따라서 변경 가능한 유형을 사용하고이를 전달하면 설정자를 사용하여 변경할 수 있으므로 원하는 동작이 발생합니다. –
는 자바 값 의해 패스를 지원 단순히 불가능하다. int a
의 값이 함수에 복사됩니다.
기본 값 대신 Object
을 사용할 수 있습니다. 여기서 참조 값은 실제 개체를 가져 와서 수정할 수있는 함수에 복사됩니다.
알겠습니다. 고마워. – NewbieDave
당신은 @NewbieDave를 환영합니다 :) –
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
유형을 생성하는 것 매우 나쁜 생각. 그러나 이것이 달성하려는 목표를 달성하는 유일한 방법입니다. 다시 말하지만, 가장 강한 단어로주의를 기울이십시오. 당신이하려는 것은 불량 아이디어입니다. 다른 방법을 찾아야합니다.
의사, 내가 이것을 할 때 아파요.
그런 다음하지 마세요.
simpliest 방법은 (빠른 & 더러운) 배열
int holder[] = new int[]{ a};
KillOver21(holder)
System.out.printf("value=[%d]", holder[0] );
void KillOver21(int holder[]) {
holder[0] = 0;
}
왜 그냥 함수에서 값을 반환 내에서 값을 넣어하는 것입니다? –
변경할 수있는 유형에서만이 작업을 수행 할 수 있습니다. – roippi
Java에 포인터가 없다는 사실은 부적합합니다. 파스칼의 의미에서는 포인터가 있습니다. 문제는 참조별로 전달이 없다는 것입니다. – EJP