2013-08-05 4 views
1

Ivor Horton의 Java 책에서 2 차원 점이 간단한 클래스를 통해 구현되는 다음 코드를 시험해보고 있습니다.개인 액세스 한정자의 설명

public class Point 
{ 
    //x and y coordinates 
    private xVal,yVal; 
    //Constructor 
    public Point (double x, double y) 
    { 
    this.xVal = x; 
    this.yVal = y; 
    } 
    //Constructor 
    public Point (final Point aPoint) 
    { 
    this.xVal = aPoint.xVal; 
    this.yVal = aPoint.yVal; 

    } 

} 

지금, 나는 이해하지 않는 점은 인수로 Point 형의 오브젝트를 두 번째 생성자에서, 새로 만든 Point 객체를 직접 인수 Point 객체의 인스턴스 변수 x와 y에 액세스 할 수 있다는 것입니다 . 즉, 객체의 private 멤버 (메서드 및 변수)는 동일한 클래스의 메서드 외에도 같은 유형의 다른 객체의 내부 메서드에서 액세스 할 수 있습니다. 누구나 내 이해에 따르면, 그들은 private이기 때문에 arugment 객체의 변수는 getter와 setter를 통해 액세스해야하기 때문에 문제를 분명히 할 수 있습니까?

+0

http://stackoverflow.com/questions/215497/in-java-whats-the-difference-between-public-default-protected-and-private – Sikorski

+1

보통 'Point'의 다른 인스턴스는 수정하지 않아야합니다. 아마도 당신의 인스턴스의 책임은 아니지만 어떤 액세스가 어떤 '포인트'안에서 발생하기 때문에 각 인스턴스는 캡슐화를 깨지 않고 다른 인스턴스를 처리하는 방법을 알고 있다고 가정합니다. 결국 수업을 썼기 때문에 자신이하는 일을 알아야합니다. – zapl

답변

3

이는 개인 필드가 동일한 인스턴스에서만 액세스 할 수 있다는 일반적인 오해입니다.

사실, 비공개 필드는 해당 클래스 내에서 비공개이며 인스턴스가 아닙니다. 따라서 해당 클래스의 인스턴스는 해당 클래스에있을 때 개인 필드에 액세스 할 수 있습니다. JLS - Section 6.6.1에서

: 회원 또는 생성자 개인 선언 된 경우

그렇지 않으면, 다음 액세스하고 최상위 클래스의 신체 내에서 발생하는 경우에만 (§7.6) 즉 둘러싸는 경우에 허용된다 멤버 또는 생성자의 선언.

강조 광산.

+0

이것은 정확히 코드가 오류없이 컴파일되었을 때 추론 한 것입니다. 해명 해줘서 고마워. – user1107888

+0

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

1

개체에 비공개가 아닌 클래스 전용입니다.

이는 클래스의 다른 인스턴스가 동일한 클래스의 개체 내에서 개인 변수에 액세스 할 수 있음을 의미합니다.

워드 프로세서이 즉시 명확하지 않습니다 -하지만 그들은 오히려 객체보다는, 클래스에 따라 액세스에 대해 이야기 않습니다 : 모든

http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html

0

먼저 코드에 오류가 있습니다. 는 같아야

public class Point 
{ 
    //x and y coordinates 
    private xVal,yVal; 
    //Constructor 
    public Point (double x, double y) 
    { 
    this.xVal = x; 
    this.yVal = y; 
    } 
    //Constructor 
    public Point (final Point aPoint) 
    { 
    this.xVal = aPoint.xVal; 
    this.yVal = aPoint.yVal; 
    } 
} 

참고 제 C'tor의 aPoint 변수.

둘째, private은 클래스에 대해 비공개를 의미합니다. 인스턴스가 아닙니다. 그래서 클래스의 다른 인스턴스는 private 멤버/메소드에 액세스 할 수 있습니다. javadocs에서

+0

나는 실수를 바로 잡았습니다. – user1107888

0

:

개인 수정은 회원 만 자신의 클래스에 액세스 할 수 있도록 지정

당신은 항상 어디 생성자를 포함하는 클래스 내에서 클래스의 private 멤버에 액세스 .

0

이 개체 개인 부재 (방법 및 변수)가 동일한 유형

예,이 정확한지의 다른 목적은 내부의 방법에서 접근 할 수 있다는 것을 의미한다. "개인"액세스 한정자는 파일 수준에서 작동합니다.

즉, 한 클래스가 다른 클래스의 중첩 (정적 또는 비 정적), 로컬 또는 익명 클래스이고 유효한 클래스가있는 경우 다른 클래스의 private 멤버에 액세스 할 수 없다는 것을 의미합니다. 다른 클래스의 객체 참조 (명시 적 또는 암시 적). 두 방향으로 모두 작동합니다 (외곽 < -> 내부).

0

액세스 제한의 목적은 코드 부분 간의 연결 범위와 범위를 명시 적으로 지정하는 것입니다.

클래스/인스턴스의 비공개 멤버는 해당 클래스의 선언으로 묶인 모든 코드에 액세스 할 수 있어야합니다. — 실제로 그렇습니다.