有没有一种方法可以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()
在eclipse中的eclipse的补充。您似乎无法使用getters和setter生成它(只是快速浏览,您可以在此处看到一些文档。我所做的工作是弄清楚如何编辑生成代码模板时使用的代码模板,toString()
因此它包括toString()
超类中的。
当您进入generate toString()对话框时,<Default Template>
旁边有一个字段“ String Format” 。当您单击编辑按钮时,您可以创建一个新的代码模板。该模板会自动保存<Default Template>
和,看起来应该像这样:
${object.className} [${member.name()}=${member.value}, ${otherMembers}]
最后,您只需要添加以下内容
[super: ${object.superToString}]
这样它将显示toString()
超类的形式
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句