문제

개인 회원은 클래스 수준 또는 객체 수준에서 액세스 할 수 있습니다. 객체 레벨에있는 경우 다음 코드가 컴파일되지 않아야합니다.

    class PrivateMember {
   private int i;
   public PrivateMember() {
      i = 2;
   }
   public void printI() {
      System.out.println("i is: "+i);
   }
   public void messWithI(PrivateMember t) {
      t.i *= 2;
   }
   public static void main (String args[]) {
      PrivateMember sub = new PrivateMember();
      PrivateMember obj = new PrivateMember();
      obj.printI();
      sub.messWithI(obj);
      obj.printI();
   }
}

messwithi () sub의 메소드 내에서 OBJ의 멤버 I에 액세스하는 것이 유효한지 명확히하십시오.

도움이 되었습니까?

해결책

Devsolar가 말했듯이, 그것은 (최상위) 클래스 레벨에 있습니다.

에서 Java 언어 사양의 6.6 절:

그렇지 않으면, 멤버 또는 생성자가 개인으로 선언 된 경우, 멤버 또는 생성자의 선언을 동봉하는 최상위 클래스 (§7.6)의 본문 내에서 발생하는 경우에만 액세스가 허용됩니다.

특정 객체에 대해 멤버로 제한되어 있다는 표시는 없습니다.

Java 7, 컴파일러는 더 이상 유형 변수의 개인 구성원에게 액세스 할 수 없습니다.. 따라서 메소드에 서명이있는 경우 public <T extends PrivateMember> void messWithI(T t) 그러면 컴파일러 오류가됩니다 t.i. 그러나 특정 시나리오는 변경되지 않습니다.

다른 팁

개인 필드와의 혼란에 대한 소스 레벨 액세스가 필요하지 않습니다. 사용하여 java.lang.reflect.AccessibleObject.setAccessibe(), 모든 코드는 해당 보안 정책을 지정하지 않는 한 다른 모든 코드의 모든 개인 구성원에 액세스 할 수 있습니다.

private 그 자체로 보안 기능이 아닙니다! 코드의 다른 부분이 의존해서는 안되는 내부 구현 세부 사항이라는 것은 다른 개발자에게 강력한 힌트 일뿐입니다.

어느 것도 아니다. Private Access는 상위 레벨 클래스를 둘러싸고 있으므로 동일한 최상위 클래스에서 다른 클래스의 개인 구성원에 액세스 할 수 있습니다.

class PrivateAccess {
    static class InnerOne {
        private int value;
    }

    static class InnerTwo {
        int getOne ( InnerOne other ) {
            return other.value;
        }
    }
}

클래스 액세스의 일반적인 의미는 동일한 유형의 다른 사례의 개인에게 액세스 할 수 있음을 의미합니다. Java에서는 개인 액세스가 유형이 아닌 어휘로 결정됩니다.

수업 수준. 아이디어는 클래스 코드 (그러나 다른 것은 없음)가 해당 클래스의 객체를 처리하는 방법을 알고 있다는 것입니다.

어쨌든 클래스 소스 코드에 액세스 할 수 있다면, "숨기기"에 대한 의미는 거의 없습니다.

다른 사람들이 언급 한 바와 같이, 개인, 기본 액세스 ( "패키지 개인"), 보호 및 JDK 7 모듈에서는 클래스 기반입니다 (중첩 클래스에는 매우 이상한 규칙이 있습니다. 계승 내가 기억할 수 없다는 것). 하지만 왜?

주로 바이너리 (또는 그 이상) 연산자 역할을하는 방법에 따라 다릅니다. 효율적인 구현을 위해 공개 API를 사용하거나 수정하지 않고도 종종 쓰기가 필요하거나 쉽게 작성해야합니다. 구현을 살펴보십시오 equals - 좋은 코드로 메소드 호출이 거의없는 필드에 직접 액세스 할 수 있습니다. this. (이것의 성능 측면은 이제 대부분 공통 통화를 초래하는 현대식 JVMS와 관련이 없지만 코드 품질 문제는 여전히 존재합니다.)

Devsolar의 답변에 추가하기 위해 Messwithi가 정적으로 선언 될 것으로 기대합니다.

public static void messWithI(PrivateMember t) {
  t.i *= 2;

} 나는 '정적'힌트없이 당신이하려고했던 일을 읽는 것조차도 힘들었습니다. 문제의 인스턴스입니다.

같은 페이지에 6.6.8 하위 섹션에서 다음과 같은 진술도 찾을 수 있습니다.

개인 클래스 멤버 또는 생성자는 멤버 또는 생성자의 선언을 동봉하는 최상층 클래스의 본문 내에서만 액세스 할 수 있습니다. 서브 클래스에 의해 상속되지 않습니다.

우리가 여기에서 평가하는 개인 계급 회원은 .

공개 void messwithi () 최상위 클래스의 본문 내에 존재하는 방법입니다. 정확하게 선언되었습니다. 민영자.

귀하의 구성은 위의 진술을 충족 시키므로 문제없이 실행되는 이유입니다.

Thas는 Jon 및 Devsolar와 같은 다른 방법입니다.

클래스 멤버의 액세스 수정자는 액세스가 부여되는 부재의 종류에 관계없이 코드가 작성되는 위치 (어떤 패키지 및 클래스)와 관련이 있습니다 : 클래스 멤버 또는 인스턴스 멤버.

논리적으로, 클래스 인스턴스가 없다면 클래스의 인스턴스 멤버를 사용할 수는 없지만 회원의 수명주기와 관련된 다른 문제입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top