编译器找不到符号

时间:2014-09-20 02:20:38

标签: java class

我有一个扩展另一个类的类,我试图让它从中获取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;
      }
}

人类

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

5 个答案:

答案 0 :(得分:1)

只需调用超类的构造函数来初始化超类私有字段。私人成员无法访问外部世界,即使是它的子类。

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

答案 1 :(得分:0)

您无法访问Person类私有字段。使用它的吸气剂或将字段更改为受保护或公开。

答案 2 :(得分:0)

idnum(和name)是private Person 字段,这意味着没有其他类(包括子类)可以访问领域。使用protected修饰符,以便子类(例如Student)可以访问该字段。

答案 3 :(得分:0)

因为idnum在类Person中被声明为私有,所以不能在类外部访问它 - 包括派生类。要解决此问题,请使用Person中的Student构造函数:

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

此外,请注意nameidnum的getter和setter不需要在Student中重新定义,因为它们与{Person中的完全相同1}}。

答案 4 :(得分:0)

了解解决方案很有用,但你应该理解这些概念。

在java中,我们有四个访问说明符

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

公开说明者:

公共说明符实现了最高级别的可访问性。声明为public的类,方法和字段可以从Java程序中的任何类访问,无论这些类是在同一个包还是在另一个包中。

示例:

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

私人说明人:

私有说明符实现了最低级别的可访问性。私有方法和字段只能在方法和字段所属的同一个类中访问。 私有方法和字段在子类中不可见,并且不由子类继承。因此,私有访问说明符与公共访问说明符相反。使用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);  
    }  
}  
  

受保护的说明符:

声明为受保护的方法和字段只能由其他包中的子类或受保护成员的包中的任何类访问。类。受保护的访问说明符不能应用于类和接口。

示例:

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

默认(无说明符):

如果您没有为元素设置访问说明符,它将遵循默认的辅助功能级别。没有默认说明符关键字。可以默认访问类,变量和方法。使用默认说明符,我们可以访问属于同一个包但不在此包外的类,方法或字段。

示例:

class Demo  
{  
    int i; (Default)  
}  
相关问题