【发布时间】:2015-01-24 11:22:38
【问题描述】:
有没有办法让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());
}
}
Manager.java
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 有一些设施这样做,注意:我使用 eclipse 来生成 toString 方法,我可以通过任何方式告诉 eclipse 也包含超类字段,
换句话说,我可以替换这个乱码
return(this.getClass().getName()+" ["+super.toString().substring((this.getClass().getSuperclass().getName().length()-3
), (super.toString().length())-1)+", bonus="+bonus+"]");
通过让 eclipse 自动化该过程并生成合适的方式来完成它?
【问题讨论】:
-
唯一的办法就是调用私有变量的getter。您不能直接访问私有变量。
-
您可以将它们的范围更改为受保护,这样它们将在 Manager 类中可见,但对其他类不可见。
-
或者(不推荐)使用反射来访问字段。
-
你需要做一些类似于 Guava 的
ToStringHelper的事情。 IE。有一个protected方法,它返回某种“构建器”,可以从子类调用,添加到然后返回。你想要做的不仅丑陋而且非常缓慢。
标签: java eclipse inheritance tostring auto-generate