2014-09-20 2 views
-1

У меня есть класс, который расширяет другой класс, и я стараюсь, чтобы он получить 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 класс

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) не применимо (фактический аргумент String не может быть преобразован в int путем преобразования вызова метода) конструктор Person.Person() не применимо – Robert

+1

@Robert, если это ошибка, получить, то вы не показываете нам код, который вы компилируете. Данный код имеет 'idnum' как' String', но ваша ошибка предполагает, что это просто 'int'. –

+0

@DrewMcGowen Большое спасибо, я осознал свою ошибку, и это было то, что я менял класс Person на то, что мне было нужно, но не сохранил и не перезаписал файл, который все еще был неправильным внутри моего проекта, поэтому он читал неправильный – Robert

0

Вы не можете получить доступ к частным полям класса Person. Либо используйте его, либо измените поле на защищенное или публичное.

0

idnumname) является private полем Person, а это означает, что никакие другие классы (в том числе подклассов) могут получить доступ к полю. Используйте модификатор protected, чтобы подклассы (например, Student) могли получить доступ к полю.

+0

Изменено частный в классе Person для защиты, но все равно получая такую ​​же ошибку. – Robert

+0

Попробуйте сделать 'имя' также' protected'? – August

0

Поскольку idnum объявлен приватным в классе Person, к нему нельзя получить доступ за пределами класса, который включает в себя выведение классов. Чтобы исправить это, используйте Person конструктор внутри Student:

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

Также, обратите внимание, что методы получения и установки для name и idnum не должны быть пересмотрены в Student, потому что они точно так же, как в Person.

0

Полезно знать решение, но вы должны понимать концепции.

В Java мы имеем четыре доступа Спецификаторы

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

public specifiers :

Public спецификаторы достигает самого высокого уровня доступности. Классы, методы и поля, объявленные как общедоступные, могут быть доступны из любого класса в программе Java, независимо от того, находятся ли эти классы в одном пакете или в другом пакете.

Пример:

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

private specifiers :

Частный Спецификаторы достигает самого низкого уровня методов accessibility.private и полей могут быть доступны только в пределах того же класса, к которому относятся методы и поля. частные методы и поля не видны в подклассах и не наследуются подклассами. Таким образом, спецификатор частного доступа находится напротив спецификатора общего доступа. Используя Private Specifier, мы можем добиться инкапсуляции и скрыть данные из внешнего мира.

Пример:

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); 
    } 
} 

protected specifiers :

методы и поля объявлены как защищенные могут быть доступны только подклассы в другом пакете или любого класса в пакете класса защищаемого членов. Спецификатор защищенного доступа не может применяться к классу и интерфейсам.

Пример:

public class Person {  
    protected String name; 
    protected String idnum; 
} 

default(no specifier):

Если вы не установили спецификатор доступа для элемента, он будет следовать уровень доступности по умолчанию. Не существует ключевого слова спецификатора по умолчанию. Классы, переменные и методы могут быть доступны по умолчанию. Используя спецификатор по умолчанию, мы можем получить доступ к классу, методу или полю, принадлежащему одному и тому же пакету, но не извне этого пакета.

Пример:

class Demo 
{ 
    int i; (Default) 
} 
Смежные вопросы