2016-06-14 2 views
0

그래서 나는이 개 같은 클래스가있는 경우 : 속성 이름 아무튼이 경우클래스 B와 클래스 A를 확장하지만, 클래스 B의 방법으로 클래스 A의 속성에 도달 할 수

public class A extends B{ 

    public String name = "Alpha" 

} 

public class B{ 

    public void revealAName(){ 
     print(this.name); 
    } 
} 

main(){ 
A newA = new A(); 
newA.revealName(); 
} 

를 이클립스가 말한다 존재하지 않습니다. 왜 그렇게 말하는거야? 클래스 B의 메서드 안에있을 때 클래스 A 객체의 특성을 사용할 수없는 이유는 무엇입니까? 어떻게 해결할 수 있습니까?

+0

당신은 A에서 B를 파생 시켜서 고칠 수 있습니다. A에서 B – wero

+0

예 그러나 B 캔트 방법을 사용하는 객체는 사용할 수 없습니다 ... –

+0

다른 방식으로 표현하면 파생 된 클래스의 필드를 사용할 수 없습니다. 수퍼 클래스에서 – wero

답변

0

BA의 속성에 대해 아무것도 모르는 경우 두 클래스를 따로 컴파일 할 수 있습니다.

그러나, 당신은 파생 클래스 (B)에서 name에 액세스 할 수 있습니다 B extends A 있도록 당신이 그것을 변경하는 경우 :

class A { 
    String name = "Alpha"; 
} 

class B extends A { 
    public void revealAName(){ 
     print(this.name); 
    } 
} 
A a = new A(); 
a.name; // OK 
a.revealName(); // not OK 

B b = new B();  
b.name; // OK 
b.revealName(); // OK 

모두보기의도 Oracle tutorial on inheritance

1

첫째,이 main 메소드를 포함해야하는 하나의 공용 클래스 여야합니다. 둘째, 상속을 사용하고 있습니다. 따라서 하위 클래스에 액세스하려면 기본 클래스 변수의 액세스 한정자에 "protected"를 부여해야합니다. 따라서 다음과 같아야합니다.

protected String name = "Alpha";

"기본"액세스 한정자가 하위 클래스에 대한 액세스를 허용하지 않기 때문입니다. controlling access to members of class

 
Modifier  Class Package Subclass World 
public   Y  Y  Y  Y 
protected  Y  Y  Y  N 
no modifier Y  Y  N  N 
private  Y  N  N  N 

또 다른 것은에서, 당신은 'this.name은'그 '이름'이 오류를 보여주는 왜의 클래스 B의 변수를 얻기 위해 노력하고 사용.

상속을 사용하는 동안 개체 참조를 사용하지 않고 부모 클래스의 변수를 직접 사용할 수 있습니다. 또는 중복 된 변수 이름의 경우 개체 참조에 "super"를 사용할 수 있습니다. You can refer this image in case of doubt ..

희망, 지금은 분명합니다.

+0

귀하의 답변이 더 자세히 나와 있기 때문에 귀하의 답변을 통합했습니다. 승인하지 않으면 편집을 롤백 할 수 있습니다. –

+0

고마워요 ... 오스틴. 괜찮아. 그 +1 –

관련 문제