关于多态和覆盖的问题

ttt 2002-01-23 10:43:58
看看下面这段程序:

public class TestOverride
{
public static void main(String[] args)
{
Employee e = new Manager();
e.getName();
e.getJob();
}
}
class Employee
{
String name = "Employee1";
public void getName()
{
System.out.println("The name is: " + name);
}
}
class Manager extends Employee
{
String name = "Manager";
String jobTitle = "General Manager";
public void getName()
{
System.out.println("The name is: " + name);
}
public void getJob()
{
System.out.println("The job title is: " + jobTitle);
}
}
现在编译不能通过。
如果把 e.getJob(); 这句话去掉,是可以运行的,结果是:
The name is Manager
既然这样,那为什么 e.getJob() 会出错呢? e 这个对象不是已经是 Manager 类了吗?
...全文
176 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zha1977 2002-01-23
  • 打赏
  • 举报
回复
这样就可以

public class TestOverride
{
public static void main(String[] args)
{
Employee e = new Manager();
e.getName();
//e.getJob();
}
}
class Employee
{
String name = "Employee1";
public void getName()
{
System.out.println("The name is: " + name);
}

}
class Manager extends Employee
{
String name = "Manager";
String jobTitle = "General Manager";
public void getName()
{
getJob();
}
public void getJob()
{
System.out.println("The job title is: " + jobTitle);
}
}
zha1977 2002-01-23
  • 打赏
  • 举报
回复
上溯造型之后把getJob丢了
getName能行是因为他是覆盖的方法,java可以判断他是来自父类或者子类
lxf9501 2002-01-23
  • 打赏
  • 举报
回复
动态绑定,
这时的e 等价于 manager

e 只有 Employee 所定义的方法,
但方法的代码已经绑定到manager
dejiang 2002-01-23
  • 打赏
  • 举报
回复
你在Employee中必须定义方法getJob,在Manager中覆盖或实现(如果你定义是抽象方法的话)
ttt 2002-01-23
  • 打赏
  • 举报
回复
既然将对象e上溯造型为Employee

那为什么 e.getName() 的结果为:
The name is Manager

???????
ggyy 2002-01-23
  • 打赏
  • 举报
回复
nod!
flyinmysky 2002-01-23
  • 打赏
  • 举报
回复
你将对象e上溯造型为Employee
所以你在 Manager中定义的方法getJob被丢失了
qqvc 2002-01-23
  • 打赏
  • 举报
回复
完全同意楼上的意见
benediction 2002-01-23
  • 打赏
  • 举报
回复
第一、因为Manager继承Employee,Manager中的方法getName()覆盖Employee中的方法getName(),所以,一旦定义了一个Manager的对象e,则e.getName()调用的是Manager中的方法getName()。
第二、由Employee e = new Manager();e由被上溯为Employee类,而Employee类,没有方法getJob(),所以,对象e也就失去了方法getJob();
因此e.getJob()必然会出错,而e.getName()调用Manager中的方法getName()得到结果The name is Manager。

23,407

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧