class Empolyee{
    private String name;
    private int salary;
    public Empolyee(String name,int salary){
        this.name = name;
        this.salary = salary;
    }
    public String getDetails(){
        return "Name:"+name+"\nsalary:"+salary;
    }
}
class Manager extends Empolyee{
    private String department;
    public Manager(String name,int salary,String department){
        super(name,salary);
        this.department = department;
    }
    public String getDetails(){
        return super.getDetails()+"\ndepartment:"+department;
    }        
}
public class TestSuper{
    public static void main(String args[]){
        Manager m = new Manager("Tom",2000,"Finace");
        System.out.println(m.getDetails());
    }
}
manager是不能继承Empolyee中name和salary的,也就是说manager中的属性只有一个:department。但结果为什么却显示了name和salary属性 ?另外,程序中的this指的是Manager还是Empolyee呢? 

解决方案 »

  1.   

    Manager继承了name和salary的。只是不能在Manager里面访问到它们而已。经理没有名字和薪水?说得通吗?
      

  2.   

    是不能继承Empolyee的name和salary,你在代码中并没有继承过来,而是用调用了父类的构造函数,最后又调用了父类的getDetails(),相当于在父类中显示了name和salary属性,如果你把super.getDetails()换成"Name:"+name+"\nsalary:"+salary就报错了!
      

  3.   

    你的manager 中的 构造方法调用了 super(name,salary); 也就是把 父类Empolyee中的 name和salary初始化了。 而manager中的 getDetails方法调用了 父类中的 getDetails 方法, 也就获得了父类中的name和salary 的值, 最后打印出来。super(name,salary) 很显然 this 是 super也就是 Empolyee。虽然manager中没有 name和salary 属性, 但是 你通过super.getDetails 获取了父类中的name和salary的值, 所以结果显示了。
      

  4.   

    看来lz是没有明白this,和super的用法的含义:
    this:是当前对象,即是Manager
    super:是父类对象,当使用super.xx();是调用父类的方法!
    再者private属性和方法不能被子类访问的,它其实是继承下来了的,但是是不能访问的!
      

  5.   

    继承时会自动得到基类所有的域和方法。---摘自《java编程思想》
    private权限限制只有在当前类内部能访问。
    protected是包内能访问。
    public是所有的都能访问。
    默认的是包访问权限。这里只是访问权限问题,并不是没有继承。