내가

2012-01-06 2 views
0

는 다음과 같은 불법 코드를 살펴 보자이 상속 기능을 이해 해달라고 : - 여기내가

class WrongCode{ 
    int i; 
    static int i; 
} 

를, 컴파일러는 우리가 같은 클래스에서 중복 필드가 있다고 말한다.

이제 동일한 파일에서 다음 클래스를 고려하십시오.

class Parent{ 
    int i = 10; 
} 

class Child extends Parent{ 
    static int i = 100; 
} 

public class Main{ 
    public static void main(String ... aaa){ 
     Parent ob = new Child(); 
     System.out.println(ob.i); // This prints Parent's i 
    } 
} 

실제 개체가 하위 개체이므로 하위 개체를 참조하지 않아야합니까? 그리고 그것이 부모의 "i"를 참조한다면, 어떤면에서 부모의 "i"가 자신의 정적 "i"와 함께 자신의 클래스에있는 것입니다. 허용되지 않습니다.

자식 정적 i 부모 오버플로 i. 그리고 부모는 정적이 아니므로 className이 아닌 instance를 사용하여 직접 액세스하는 방법은 무엇입니까?

+3

파생 된 'i'를 얻기 위해'Child ob = new Child();'를 시도하십시오. –

+0

Child 클래스에서 정적이 아니며 어떤 일이 발생하는지 확인 하시겠습니까? 그것은 여전히 ​​부모를 인쇄해야합니다. –

+0

@ beta_icon 아이디에서 정적이 아닌 것을 만드는 것은 같은 결과를 가져옵니다. – whitehat

답변

2

Parent 클래스에 인스턴스 필드 i이 있고이 필드는 Child 클래스의 인스턴스 필드로 유지됩니다. 에 관계없이이 (기본 클래스 또는 파생 클래스) 인스턴스화하는 방법, ob에서 Oracle Java Tutorial - Hiding Fields

0

, ob 유형의 부모 때문에 아이의 static int i 결코 볼 -

System.out.println(ob.i); // must be 10 

은 보라.

값이 이고 그 값이 인 이유입니다.

0

Java를 사용하면 클래스에 부모 변수의 변수와 동일한 이름을 가진 자체 변수를 사용할 수 있습니다. 그러나 부모 변수를 무작위로 다시 정의 할 수는 없으므로 다른 요소가 손상 될 수 있습니다. 그래서 그것은 무엇입니까 ... 부모 클래스로 선언 된 변수 obj을 가질 때, 자식 클래스의 인스턴스를 보유하고 있더라도 obj.i은 자식 클래스가 아닌 부모 클래스의 i을 참조합니다.

0

ob.i와 같은 클래스 멤버 필드 (인스턴스 변수)에 액세스 할 때. 런타임에 알려진 클래스가 아니라 컴파일 타임에 알려진 클래스의 결과를 얻을 수 있습니다. 그게 부모 가치 인 10이라는 가치를 갖는 이유입니다.

메서드 호출의 경우 런타임에 참조 점이 실제 클래스의 개체로 전달됩니다. 클래스가 특정 이름을 가진 필드를 선언

경우, 해당 필드의 선언은 같은 이름을 가진 필드의 모든 접근 선언을 숨길 수 있다고 여기 그림자에 대해서는

자바 랭 사양의 말씀입니다 슈퍼 클래스 및 클래스의 슈퍼 인터페이스에 있습니다.

숨겨진 필드

language spec

당신은 "필드 선언"절을 참조 할 수 있습니다 (이 정적 인 경우) 정규화 된 이름을 사용하여 액세스 할 수 있습니다.

0

실제로 다형성과 ob은 부모 클래스 필드와 행동에 대해서만 액세스 할 수 있습니다.

1

Childi를 인쇄 할 수 있습니다 여기 방법 System.out.println(ob.i);이 없다는 것을 깨닫는 것이 중요하다 : 그것은 단지 ob 그것이 실제 Child으로 인스턴스화하지 않는 것이, 선언 된 유형 Parent이다 것을 알고있다. 따라서 Parenti이 없으면 컴파일 오류가 발생합니다. 상위 항목에 i이 있으면이 내용이 인쇄됩니다.

인스턴스를 통한 클래스 변수 액세스 (예 : ob.iParent.i과 동일)는 Java의 심각한 디자인 결함으로 간주되어야합니다. 나는 그것이 때때로 혼란 스러울 수 있다는 데 동의한다. 어쨌든 부모님과 자녀 모두 비 정적 인 i을 가질 수 있으며 반드시 같을 필요는 없습니다. 위의 논의는 어떤 상황에서 인쇄 될 추론에 적용되어야한다.