2014-04-15 3 views
3

Java의 Object classclone()finalize()과 같은 보호 된 메서드가 포함되어있는 이유는 무엇입니까? 사용하거나 작성하는 모든 클래스가 Object?Java의 Object 클래스에 보호 된 메서드가 포함되어있는 이유는 무엇입니까?

+1

그래서 파생 클래스는 공개되지 않고 상속합니다. –

+1

'protected' 멤버는 같은 패키지 또는 하위 클래스의 클래스에서만 볼 수 있습니다. 귀하의 질문을 명확히하십시오. –

+0

OOP에서 상속을 위해 설계된 경우 public 메서드보다 protected가 바람직합니다. – Braj

답변

5

클래스 C2C1 확장하고 C1public 방법, C2 (오버라이드 (override)하는 경우)도 public이어야에서 다음 방법을 포함하는 경우; Java는 재정의 할 때 메서드의 액세스에 대한 추가 제한을 두는 것을 불법으로 만듭니다. C1protected 메서드가 포함 된 경우 C2의 재정의 메서드는 protected 또는 public 일 수 있습니다.

C1Object 클래스 인 경우에도이 규칙이 적용됩니다. 그 이유는 클래스가 (Object에서 상속받은) clonefinalize 메서드를 우선하여 선언하고 public 대신에 protected을 선택할 수 있도록하는 것이라고 생각합니다.

편집 :이의 중요한 결과는 clonefinalize이 같은 자유롭게 액세스 할 수있는 공용 멤버가 될 것 같은 아니라는 것이다. C2 내에서 C2 유형의 객체에 clonefinalize을 사용할 수 있습니다. 보호 유형이므로 C2 하위 클래스에서 사용할 수 있기 때문입니다. 그러나 반드시 다른 클래스의 객체에서 사용할 수는 없습니다.

class X { } 

class Y { 
    private Y field1; 
    private X field2; 
    public void foo() throws Exception { 
     Object o1 = this.clone();  // legal 
     Object o2 = field1.clone(); // legal 
     Object o3 = field2.clone(); // illegal 
     String s1 = field2.toString(); // legal since toString() is "public" in Object 
    } 
} 

protected 방법이 서브 클래스에 접근 할 수 있지만, 그들이 얼마나 접근에 대한 몇 가지 제한 사항이 여전히 있다는 것을 증명해야한다. X@Override public Object clone() 메소드가있는 경우 o3의 선언이 합법적이됩니다.

4

일반적인 추상 Object의 경우 사용자가 clone 또는 finalize을 원할 경우 수행 할 작업이 명확하지 않기 때문에이 작업이 수행됩니다. 이것이 우리가이 방법을 무시하고 자체적으로 구현할 수있는 기회입니다.

6

Object에는 두 개의 protected 메서드가 있습니다. clone()finalize()입니다.

finalize()은 클라이언트 코드에 의해 호출되도록 의도되었지만 서브 클래스에 의해 무시 될 수 있습니다. 따라서 보호됩니다.

clone()Object은 명시 적으로 재정의되고 서브 클래스별로 public이 작성되지 않는 한 클라이언트에서 호출하지 않습니다.

0

Object 클래스에는 protected 한정자를 사용하여 finalize() 및 clone() 메서드가 포함되어 있으므로 개발자가 이러한 메서드를 protected 또는 public 한정자로 재정의 할 수 있는지 여부를 결정할 수 있습니다. 클라이언트 코드를 허용 할 것인지에 따라 완전히 달라집니다. 이 메소드를 호출할지 말지를 결정합니다.

관련 문제