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
答案 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()
创建对象,那么您的引用类型是什么,它可以访问其所有公共方法。