2014-11-07 7 views
0

자바로 2 차원 게임을 만들려고합니다.자바에서 매개 변수로 객체를 전달합니다.

프로세스에서 나는 많은 객체가 경계 (x1, x2, y1, y2)를 필요로한다는 것을 곧 알게되었고 결과적으로 많은 메소드에 매개 변수 (int x1, int x2, int y1, int y2)가있었습니다.

그래서 저는 도대체 왜 getWidth(), getHeight()와 같은 유용한 메소드와 함께 속성 x1, x2, y1, y2 (퍼포먼스 향상을 위해 public으로 설정 한)을 가진 IntRectangle 객체를 만들지 않을까요?() 등등.

내 코드는 훨씬 더 깨끗하며 변수가 공개되어 있으므로 많은 성능을 잃지 않았습니다.

메소드에 원시 값을 전달하는 것과 달리, 전달 된 객체의 값이 메소드에서 변경되었을 때 변경되었습니다. 이 코드 라인 (10)을 인쇄하지만 목적으로 유용한 프리미티브 값

`int x = 10;` 

subtract5(x); 
    print(x); 

    void subtract5(int i){ 
     i -= 5; 
    } 

으로 예컨대

...

class XY{ 
public int X; 
public int Y; 
} 

main { 
XY xy = new XY(); 

xy.X = 5; 
xy.Y = 10; 

changeX (xy); 

print xy.X 

} 

changeX (XY xy2){ 
xy2.X = 7; 
} 

그것은 7 인쇄;

제가 개발 한 이론은 int가 int에 대한 포인터가 아니라 레지스터에 저장된 int입니다. 메서드가 호출 될 때 푸시되고 리턴 될 때 되돌릴 수 있습니다. 객체는 객체에 대한 참조입니다. 객체 자체는 스택에 푸시되지 않고 포인터만으로 푸시됩니다.

하지만이 문자열에 피곤했습니다 (내가 아는 것은 객체라는 것을 알고 있습니다). 그리고 나는이 문제의 int처럼 행동합니다. 이것은 혼란 스럽습니다. 어쩌면 그들은 어쨌든 스스로 사본을 만들 수 있을까요?

글쎄, 누군가가이 문제에 대해 밝히고 내 추론이 잘못된 방향으로 돌아가고 내 코드를 정리하고 성능을 유지하는 방법에 대해 조언을 해주길 바란다.

+0

귀하의 이론은 정확합니다. 그러나 문자열은 일반적인 객체입니다. int와 같이 동작하는 문자열의 예를 하나 제시하십시오. – immibis

+0

문자열은 객체이지만 또한 불변이므로 문자열을 변경할 수 없습니다. –

+1

BTW, 퍼포먼스에 문제가 있다는 것을 안다면 * 깨끗한 코드를 희생하지 마십시오. getter/setter를 사용하지 않으면 성능면에서 아무런 이득도 얻지 못하지만 많은 유연성을 잃게됩니다. –

답변

2

java의 오브젝트는 힙 공간의 메모리 블록입니다. 당신이 지나가는 모든 것은이 객체/메모리 영역에 대한 참조입니다. (참조 자체는 값에 의해 전달됩니다.) 따라서 4 개의 int를 가진 Object Rectangle을 가지고 있다면, 메소드는 전달 된 객체 참조에 의한 참조 인 heap ara의 메모리를 변경합니다.

문자열은 변경할 수 없으므로 개체를 변경할 수 없으며 모든 수정 자 메서드가 새 인스턴스를 반환합니다.

자세한 내용은 http://javadude.com/articles/passbyvalue.htm을 참조하십시오.

0

사실 Java는 항상 값으로 전달됩니다. 특히 Java는 객체를 참조로 전달하며 이러한 참조는 값으로 전달됩니다. 프리미티브 유형의 경우 값으로 직접 전달됩니다. 다음과 같은 질문에

더 자세한 사항 :

Is Java "pass-by-reference" or "pass-by-value"?

+0

"Java는 객체를 통과한다" "객체"는 Java의 값이 아니다. ")"통과 "할 수 없습니다. – newacct

0

문자열이 일정; 그 값은 생성 된 후에는 변경할 수 없습니다. 문자열의 값을 변경하면 새 String 객체가 만들어지고 새 String 객체에 대한 참조가 반환됩니다. 즉, 새 인스턴스가 만들어집니다.g

String str="abc"; 
str=str+"d"; 

이 경우 새 String 개체가 String 풀에서 만들어지고 이제 str.The에서 참조됩니다. 이전 문자열은 가비지 수집됩니다.

0

괜찮 았을 지 모르지만 질문은 자바가 변수를 전달하는 방식이 아니 었습니다. 나는 그 스레드에서 왔습니다. 나는 그것을 알아 냈다. 그것은 나를 혼란스럽게 만들고있는 String 클래스 일 뿐이었다. 그리고 공개 특성을 갖는 결과적인 성능 향상. 나는 당신의 모든 답변을 주셔서 감사합니다!

관련 문제