当前位置: 首页 > 面试题库 >

如何使toString()方法还返回超类私有字段及其实例字段?

夏昊
2023-03-14
问题内容

有没有一种方法可以toString()包含超级的私有字段class?我尝试添加super.toString(),但是没有用。

请看下面的代码

Employee.java

package test;

public class Employee {

private  String name;
private int id;
private double salary;

public Employee(String name, int id, double salary) {
    super();
    this.name = name;
    this.id = id;
    this.salary = salary;
}

public double getSalary() {
    return salary;
}

@Override
public String toString() {
    return "Employee [name=" + name + ", id=" + id + ", salary=" + salary
            + "]";
}

public static void main(String[] args) {

    Employee e=new Employee("Joe", 14, 5000);
    System.out.println(e);
    Manager m=new Manager("Bill", 23, 5000, 10);
    System.out.println(m);
    System.out.println("Employee Salary is "+e.getSalary()+"\nManager salary is "+m.getSalary());
}
}

管理器

package test;

public class Manager extends Employee{

private double bonus;
public Manager(String name, int id, double salary,int bonus) {
    super(name, id, salary);
    this.bonus=bonus;
}

public double getSalary()
{
    double baseSalary=super.getSalary();

    return (baseSalary+baseSalary*(bonus/100));

}

@Override
public String toString() {
    return(this.getClass().getName()+" ["+super.toString().substring((this.getClass().getSuperclass().getName().length()-3
            ), (super.toString().length())-1)+", bonus="+bonus+"]");
    //didn't work
    //super.toString();
    //return "Manager [bonus=" + bonus + "]";
}



}

输出量

Employee [name=Joe, id=14, salary=5000.0]
test.Manager [name=Bill, id=23, salary=5000.0, bonus=10.0]
Employee Salary is 5000.0
Manager salary is 5500.0

那是我能做的最好的,连接super.toString()+一组字符串,这肯定是一团糟,还有其他方法,即使语言规范不允许它确实有蚀的能力, 注意
:使用 eclipse 生成 toString 方法,通过任何方式,我可以告诉eclipse也包括超类字段,

换句话说,我可以取代这个凌乱的代码

return(this.getClass().getName()+" ["+super.toString().substring((this.getClass().getSuperclass().getName().length()-3
            ), (super.toString().length())-1)+", bonus="+bonus+"]");

通过让 Eclipse 自动执行该过程并生成合适的方法来做到这一点?


问题答案:

如果您在超类中创建getter和setter,则可以通过这些方法访问变量。另一种可能性是将可见性从私有更改为受保护

第一个解决方案看起来像这样

雇员

public class Employee {

    private String name;
    private int id;
    private double salary;

    public Employee(String name, int id, double salary) {
        super();
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }

    public String getName() {
        return name;
    }

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

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public void setSalary(double salary) {
        this.salary = salary;
    }

    @Override
    public String toString() {
        return "Employee [name=" + name + ", id=" + id + ", salary=" + salary + "]";
    }
}

经理

public class Manager extends Employee {

    private double bonus;

    public Manager(String name, int id, double salary, int bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    public double getSalary() {
        double baseSalary = super.getSalary();

        return (baseSalary + baseSalary * (bonus / 100));

    }

    @Override
    public String toString() {
        return "Manager [name=" + getName() + ", id=" + getId() + ", salary=" + getSalary() + ", bonus=" + bonus + "]";
    }

}

第二个(使用保护)

雇员

public class Employee {

    protected String name;
    protected int id;
    protected double salary;

    public Employee(String name, int id, double salary) {
        super();
        this.name = name;
        this.id = id;
        this.salary = salary;
    }

    public double getSalary() {
        return salary;
    }



    @Override
    public String toString() {
        return "Employee [name=" + name + ", id=" + id + ", salary=" + salary + "]";
    }
}

经理

public class Manager extends Employee {

    protected double bonus;

    public Manager(String name, int id, double salary, int bonus) {
        super(name, id, salary);
        this.bonus = bonus;
    }

    public double getSalary() {
        double baseSalary = super.getSalary();

        return (baseSalary + baseSalary * (bonus / 100));

    }

    @Override
    public String toString() {
        return "Manager [name=" + name + ", id=" + id + ", salary=" + salary + ", bonus=" + bonus + "]";
    }

}

我个人会使用getter / setter方法,但这取决于您。

编辑:toString()在日食的日蚀的补充。您似乎无法使用getters和setter生成它(只是快速浏览,您可以在此处看到一些文档。我所做的工作是弄清楚如何编辑生成代码模板时使用的代码模板,toString()因此它包括toString()超类中的。

当您进入generate toString()对话框时,<Default Template>旁边有一个字段“ String Format”
。当您单击编辑按钮时,您可以创建一个新的代码模板。该模板会自动保存<Default Template>和,看起来应该像这样:

${object.className} [${member.name()}=${member.value}, ${otherMembers}]

最后,您只需要添加以下内容

[super: ${object.superToString}]

这样,它将显示toString()超类的形式



 类似资料:
  • 问题内容: 众所周知,私有字段不会在类之间继承。令我着迷的是它如何用于内部静态类。考虑以下代码: 您能否解释一下如何访问其他内部类的私有字段?如果合法,为什么只能通过“ super.XXX”构造实现? 问题答案: 内部类是Java的较晚入门。添加它们时,它们仅作为编译器扩展添加,对JVM不变。 语言规范指出,内部类被允许访问在其内声明的类的私有成员。包括其他内部类。 为了使其工作,编译器会生成桥接

  • 问题内容: 我已经看过两种方法都使用过,但从未听说由于某种特殊原因,一种方法比另一种方法更可取。 与 我在示例中使用String串联来保持代码简短。 问题答案: 如果有吸气剂,请使用它们! 也许有一天,您需要更改代码,以便获取程序不仅可以返回字段值,还可以执行其他操作或以其他方式创建结果。这样一来,您会更高兴地发现,始终如一地使用吸气剂。 但是像往常一样,我的建议中有一些例外情况-如果允许覆盖ge

  • 以下SpringBean声明似乎“按预期”运行和行为: 其中“如预期”表示“没有明显的错误”。 假设有一些复杂的生命周期(例如,使用管理外部资源),这是的有效且合理的声明吗?我能找到的所有示例(官方和非官方)都表明实例应该在中实例化,而不是存储在字段中或从字段中检索。然而,我在任何文件中都找不到任何确定的信息,说明这应该或不应该是安全的。 例如,我能找到的最相关的文档是关于SpringIoCbea

  • 问题内容: 如何对具有内部私有方法,字段或嵌套类的类进行单元测试(使用xUnit)?还是通过内部链接(static在C / C ++中)或在私有(匿名)名称空间中使其私有化的函数? 仅仅为了能够运行测试而更改方法或函数的访问修饰符似乎很糟糕。 问题答案: 更新: 大约十年后,测试私有方法或任何无法访问的成员的最佳方法可能是来自Manifold框架。 这样,您的代码将保持类型安全和可读性。没有设计折

  • 在我的Java项目中,我有一个Java响应对象,它有几个私有字段及其getter和setter。 我想将成员分组到他们自己的类中,并在我的响应对象中使用Intellij重构如下所示。响应对象在几个地方被使用,我无法手动重构它。我试图使用intellj重构/提取类来实现它,但无法按照我想要的方式进行。如果我使用提取委托,它会以我不想要的方式出现。感谢任何帮助。

  • 问题内容: 我有一个类,该类具有一个命名的字段(它与我的类具有相同的类型并具有修饰符): 在该类中,我定义了一个名为的方法,该方法具有一个类型为type的参数。我想知道为什么我可以直接访问实例字段?我的意思是该字段是,不是通过实例受害者无法访问的吗? 问题答案: 隐私不是针对每个实例的,而是针对每个班级的。 该类可以访问所有实例的私有字段。 例如,该方法可以将o(如果适用)转换为相同类型,并将其私