2010-01-24 2 views
4

대학에서 공부할 때, 캡슐화없이 작업하는 것과 같은 수업 등의 기본 방법 (자바 스타일 가이드에 대한 토론을 열고 싶지 않습니다. 내가 내 자신을 설명 할 수 내가 행동을 우연히 발견 한 대학이 외부)비공개 필드에 대한 액세스가 금지되지 않은 이유는 무엇입니까?

과 같이 쓸 것이라는 점을 명확히 :

public class Person { 
    // fields 
    private int age; 

    public static void main(String[] args) { 
    Person foo1 = new Person(); 
    foo1.age = 40; 
    System.out.println(foo1.age); 
    } 
} 

을하는 이유는 무엇입니까 코드 컴파일이 조각 오류없이 실행합니까? 사적인 영역에 어떻게 접근 할 수 있습니까? 동일한 클래스에서 main 메서드를 사용하기 때문에 이상한 동작이 발생합니까?

답변

17

정적 메서드 mainPerson 클래스의 멤버이므로 Person의 모든 개인 필드 또는 메서드에 액세스 할 수 있습니다.

당신은 무엇에 대해 걱정하고 있습니까? 누군가가 수업을 작성한 다음 자신의 수업에서 그 수업에 접근 할 수 있습니까?

만약 당신이 무엇이든 염려하게된다면, 개인 필드에 액세스 할 수 있다는 것을 염두에 두십시오. 리플렉션을 사용하여 클래스를 사용하면 많은 유용한 것들이 필요합니다.

+0

개인 수정자가 필드 내부에서 액세스 가능하도록 인스턴스를 만들 것을 기대했기 때문에 궁금합니다. C#에서 익숙해 진 것 같습니다. – citronas

+0

@citronas - C#은 정확히 동일한 방식으로 작동합니다. private 한정자는 클래스가 아니라 인스턴스에 적용됩니다. http://msdn.microsoft.com/en-us/library/st6sy9xe.aspx – Nate

+0

+1을 사용하여 클래스의 모든 값을 얻습니다. –

15

예 — Java에서 개인용은 개인용 개인용이 아닙니다.

다른 많은 언어에서는 인스턴스 private (예 : Ruby 및 Smalltalk)를 사용합니다.

+0

아, 저에게 새로운 것. 인스턴스 private 수정 자의 방법은 무엇입니까? – citronas

+0

Ruby에서 모든 인스턴스 변수는 인스턴스에 대해 비공개입니다 (선택 사항이 없으므로 수정자가 아님). 스몰 토크에서도 마찬가지입니다. – akuhn

+0

... 자바의 경우 아무 것도 없습니다. – akuhn

1

클래스 내부에서 비공개 필드에 액세스 할 수 있습니다. 그것이 클래스별로 정의되는 지점입니다.

2

기본 메소드가 동일한 클래스에 있고 인스턴스 변수가 개인 액세스를 가지고 있기 때문에 동일한 클래스의 메소드에서만 사용할 수 있습니다. 동일한 클래스의 메소드를 제한하여 해당 구성원 변수에 액세스 할 수있는 액세스 수정 자 (access modifier)가 없습니다. 그것은 여기서 일어나는 일입니다. 같은 패키지에 있지만 다른 클래스에 main 메소드가 있다면 컴파일하지 않았을 것입니다.

0

Person 클래스에 다른 정적 메서드를 작성하고 해당 메서드에서 개인 변수에 액세스 할 수 있습니다. 메인은 단지 이름 일뿐입니다. 그런 삶입니다.

0

main(String[] args) 메서드가 Person 클래스 내부에 정의되어 있기 때문입니다. 메서드가 Person 클래스 외부에서 정의 된 경우 그렇게 할 수 없었을 것입니다.

관련 문제