2014-09-20 6 views
-1

I가 다른 클래스를 확장하고 내가 그것을에서 IDNUM을 얻을하지만 컴파일 할 때마다 나는이 컴파일 테스트를 위해 내 수업 코드입니다컴파일러는 기호 찾을 수 없습니다

Student.java:11: error: cannot find symbol 
     this.idnum = idnum; 
     ^
    symbol: variable idnum 

오류를 얻을 수있는 노력하고 있어요 클래스 , 내가 호출 할 수있는 이름을 얻을 수 있지만 idnum 내 코드에 문제가 있습니까?

public class Student extends Person { 
    private int credits; 
    private double gradePoints; 

    public Student(String name, String idnum, int credits, double gradePoints){ 
     this.name = name; 
     this.idnum = idnum; 
     this.credits = credits; 
     this.gradePoints = gradePoints; 
     } 

    public void setName(String name) { 
     this.name = name; 
     } 
    public void setId(String idnum){ 
     this.idnum = idnum; 
     } 
    public void setCredits(int credits){ 
     this.credits = credits; 
     } 
    public void setGradePoints(double gradePoints){ 
     this.gradePoints = gradePoints; 
     } 

    public String getName(){ 
     return name; 
     } 
    public String getId(){ 
     return idnum; 
     } 
    public int getCredits(){ 
     return credits; 
     } 
    public double getGradePoints(){ 
     return gradePoints; 
     } 
} 

당신은 Person 클래스 private 필드에 액세스 할 수 없습니다

public class Person {  
    private String name; 
    private String idnum; 

    public Person(String name,String idnum){ 
     this.name = name; 
     this.idnum = idnum; 
     } 

    public void setId(String idnum){ 
     this.idnum = idnum;  
     } 

    public String getId() { 
     return idnum; 
     } 
    public void setName(String name) { 
     this.name = name; 
     } 

    public String getName() { 
     return name; 
     } 

    @Override public String toString() 
     { 
     return name + " " + idnum; 
     } 
} 
+0

이 읽기 ​​: http://stackoverflow.com/questions/25706216/what-does-a-cannot-find-symbol-compilation-error-mean –

답변

1

수퍼 클래스의 생성자를 호출하여 수퍼 클래스 비공개 필드를 초기화하면됩니다. 사적인 멤버는 하위 클래스 라 할지라도 바깥 세상에 접근 할 수 없습니다.

public Student(String name, String idnum, int credits, double gradePoints) { 
     super(name, idnum); 
     this.credits = credits; 
     this.gradePoints = gradePoints; 
} 
+0

이렇게하면 에러가 발생합니다. Student.java:10 : error : Person (String, String)에 적합한 생성자가 없습니다. super (name, idnum); ^ 생성자 Person.Person (String, int)을 적용 할 수 없습니다. (실제 인수 문자열은 메서드 호출 변환으로 int로 변환 할 수 없습니다.) 생성자 Person.Person()을 적용 할 수 없습니다. – Robert

+1

@Robert 오류 인 경우 점점, 당신은 우리가 컴파일하는 코드를 보여주지 못하고 있습니다. 주어진 코드는'idnum'을'String'으로 가지고 있습니다. 그러나 여러분의 에러는 그것이 단지'int'라고 제안합니다. –

+0

@DrewMcGowen 대단히 고마워요. 제 실수를 깨달았습니다. 필자는 Person 클래스를 필자가 필요로하는 것으로 바꾸었지만, 프로젝트 내에서 여전히 틀린 파일을 덮어 쓰지 않고 덮어 쓰지 않기 때문에 잘못된 것을 읽었습니다. – Robert

0

Person 클래스. getter를 사용하거나 필드를 protected 또는 public으로 변경하십시오.

0

idnum (및 name)는 하위 클래스가 다른 클래스 필드를 액세스 할 수 없다는 것을 의미 Personprivate 필드이다. 서브 클래스 (예 : Student)가 필드에 액세스 할 수 있도록 protected 수정자를 사용하십시오.

+0

Person 클래스에 개인 변경 보호 받고 있지만 여전히 같은 오류가 발생합니다. – Robert

+0

'name'도'protected'로 만드십시오. – August

0

idnumPerson 클래스에서 비공개로 선언되었으므로 클래스 외부에서 액세스 할 수 없습니다.이 클래스에는 파생 클래스가 포함됩니다. 이 문제를 해결하려면, Student 내에서 Person 생성자를 사용

public Student(String name, String idnum, int credits, double gradePoints) 
{ 
    super(name, idnum); 
    this.credits = credits; 
    this.gradePoints = gradePoints; 
} 

을 또한, 그들은 정확히 같은이기 때문에 nameidnum에 대한 getter와 setter가 Student에서 재정의 할 필요가없는 점에 유의 않는다 Person에있는 것들.

0

해결책을 알고있는 것이 좋지만 개념을 이해해야합니다.

자바에서

우리는 네 개의 액세스 지정자

1. public 
2. private 
3. protected 
4. default(no specifier) 

public specifiers :

공공 지정자 접근성의 가장 높은 수준을 달성해야합니다. 공용으로 선언 된 클래스, 메소드 및 필드는 Java 프로그램의 모든 클래스에서 액세스 할 수 있습니다. 이러한 클래스가 동일한 패키지 또는 다른 패키지에 있는지 여부에 관계 없습니다.

예 :

public class Demo { // public class 
    public x, y, size; // public instance variables 
} 

private specifiers :

개인 지정자 accessibility.private 방법과 필드의 낮은 수준을 달성은 방법 및 필드 속하는 동일한 클래스 내에서 액세스 될 수있다. 개인 메서드 및 필드는 하위 클래스 내에서 볼 수 없으며 하위 클래스에 상속되지 않습니다. 따라서 개인 액세스 지정자는 공용 액세스 지정자의 반대입니다. Private Specifier를 사용하여 캡슐화를 구현하고 외부 세계로부터 데이터를 숨길 수 있습니다.

예 : 보호로 선언

protected specifiers :

방법 및 필드

public class Demo { // public class 
    private double x, y; // private (encapsulated) instance variables 

    public set(int x, int y) { // setting values of private fields 
     this.x = x; 
     this.y = y; 
    } 

    public get() { // setting values of private fields 
     return Point(x, y); 
    } 
} 
은 다른 패키지 또는 보호 된 멤버 '클래스의 패키지 내의 모든 클래스의 서브 클래스에서 액세스 할 수 있습니다. 보호 된 액세스 지정자는 클래스 및 인터페이스에 적용 할 수 없습니다.

예 :

public class Person {  
    protected String name; 
    protected String idnum; 
} 
당신이 요소에 대한 액세스 지정을 설정하지

default(no specifier):

, 그것은 기본 접근성 수준을 따릅니다. 기본 지정자 키워드가 없습니다. 클래스, 변수 및 메소드는 기본적으로 액세스 할 수 있습니다. 기본 지정자를 사용하여 동일한 패키지에 속하지만이 패키지 외부가 아닌 클래스, 메소드 또는 필드에 액세스 할 수 있습니다.

예 :

class Demo 
{ 
    int i; (Default) 
} 
관련 문제