首页 文章

将超类的属性传递给子类

提问于
浏览
0

我有员工,经理班 .

employee具有私有String名称,int age,double salary . 他们必须放在一个方法中 . 我把它们放在String细节中

public void details(String name,int age, double salary)
{
    this.name=name;
    this.age=age;
    this.salary=salary;
  }

然后他们必须传递给班长,但是要添加一个新属性,即部门 .

class Manager extends Employee{
    private string department;
}

多数民众赞成我的问题,我不能与属性部门一起输出属性 .


UPDATE #1

我之前尝试过使用此代码:

public void details(String name, int age, double salary, String dept) 
{
   super(name, age, salary);
   this.dept = dept;
}

但是它给出了一个错误,即对super的调用必须是构造函数中的第一个语句 .

这就是我的经理如何扩展员工类的样子 .

class Manager extends Employee 
{
    private String department;
    public Manager(String name,int age,double salary,String department)
    {
        super(name,age,salary);
        this.department=department;
     }

     public String getDetails()
     {
         return super.details;
     }

     public void details(String name, int age, double salary, String department) 
     {
         super(name, age, salary);
         this.department = department;
     }
}

UPDATE #2

属性名称,年龄和薪水必须是私有的 . 我已经尝试将其更改为公开并使用 super.details(name age salary) 并且它有效 . 我've tried the same codes but with private attribute but it didn'工作 .

4 回答

  • 0

    您需要包含子类继承的值作为属性 .

    class Employee
    {
        private String name;
    
        //constructor
        public Employee(String name)
        {
            this.name = name;
        }
    
        public String getName() 
        {
            return name;
        }
    
        public void setName(String name)
        {
             this.name = name;
        }
    }
    
  • -1

    私有意味着私有,因为没有其他类可以访问它们 . 您的两个选项是:在父类中创建getter / setter方法或使变量受到保护,以便“Manager”可以看到它们 . 我会说明哪个更好,但是你没有告诉我们你问题的“原因”......

  • 2

    您的错误是您尝试使用关键字 superdetails(String name, int age, double salary, String dept) 调用 details(String name, int age, double salary) . 这些方法有不同的签名 . 因此,您无法在子类方法详细信息中调用 super .

    方法的签名(构造函数除外)由三个元素组成 . 方法的可见性,名称,返回值和参数 .

    在这种情况下,Manager方法 public void details(String name, int age, double salary, String department) 是public,返回void,其名称是详细信息,并且有四个参数,String,int,double和String,但Employee方法 public void details(String name, int age, double salary, String department) 在参数中是不同的 . 这个方法只有三个参数,一个是String,int和double .

    在这种情况下,您可以直接调用详细信息或覆盖该方法(第二个解决方案无法为详细信息分配 department . 因此,我建议您直接调用) .

    class Employee
    {
        private String name;
        private int age;
        private double salary;
    
        public Employee (String name, int age, double salary, String department)
        {
            this.name = name;
            this.age = age;
            this.salary = salary;
        }
    
        public void details(String name, int age, double salary)
        {
            this.name = name;
            this.age = age;
            this.salary = salary;
        }
    
        public String getName() 
        {
            return name;
        }
    
        public void setName(String name)
        {
             this.name = name;
        }
        ...
    }
    
    class Manager extends Employee 
    {
        private String department;
    
        public Manager(String name, int age, double salary, String department)
        {
            // Here is correct to call super() because the constructors have the same signature.
            // This is, the method visibility and name. The parameters are optional.
            super(name, age, salary);
            this.department = department;
        }
    
        // Direct call.
        public void details(String name, int age, double salary, String department) 
        {
            // Here you CANNOT use super because in Employee there no method with the same signature.
            // So, just call the method details(name, age, salary) that is public.
            details(name, age, salary);
            this.department = department;
        }
    
        // Overriding the method
        @Override
        public void details(String name,int age, double salary)
        {
            // Here is correct to call super() because you are overriding the super class method.
            // The problem is that this method doesn't have the parameter deparment.
            super(name, age, salary);
            // Do something else
        }
        ...
    }
    
  • 0

    处理此问题的最佳方法可能是Manager类覆盖details()方法,添加新参数:

    经理班

    public void details(String name, int age, double salary, String dept) {
       super.details(name, age, salary);
       this.dept = dept;
    }
    

相关问题