如何保护从超类类型对象访问的子类方法

时间:2014-07-07 07:09:28

标签: java inheritance

class Employee{
   public int getSalary(){
      return 500;
   }
}

class Manager extends Employee{
   public int getSalary(){
      return 1000;
   }
   public int getBonus(){
      return 200;
   }
}  

main()方法中的代码

Employee e = new Employee();
Manager m = new Manager();

System.out.println(m.getBonus());
//Below will throw error as Employee does not have a method getBonus()
//System.out.println(e.getBonus());

Employee test = new Manager();
System.out.println(test.getSalary());

以下作品。它应该工作,只需通过施法,我就可以获得经理的奖金方法。但是,测试类型是Employee。我是否可以保护Manager的getBonus方法,使得Employee类型的对象即使在转换后也无法访问它而不更改accessidentifier

System.out.println(((Manager)test).getBonus());

输出

200
1000
200

1 个答案:

答案 0 :(得分:0)

在您的示例test中指向Manager对象(或是对其的引用)。 每个Manager对象也是Employee对象 并非每个Employee对象都需要Manager个对象。

Employee test = new Manager();

您只是说测试(可以指向任何Employee对象,因此它也可以指向管理器对象)指向创建的new Manager()对象。

因此当你使用new Manager()时,它正在创建一个管理器对象,并且对它的引用存储在test(属于Employee类型)中,它的有效性因为Manager也是Employee

通过强制转换,您说test指向的对象不是普通的Employee而是Manager,因此强制转换返回管理器引用,您可以调用适合于该管理器的方法对象

因此,如果您使用new Manager()创建对象,那么您的引用类型是什么,它可以访问其所有公共方法。