黑马程序员技术交流社区
标题:
关于多态和继承的一个疑问。
[打印本页]
作者:
李挺
时间:
2013-1-31 20:45
标题:
关于多态和继承的一个疑问。
本帖最后由 李挺 于 2013-2-1 09:38 编辑
class Student
{
public void study()
{
System.out.println("study");
}
public void sleep()
{
System.out.println("tangzheshui");
}
}
class AdvStudent extends Student
{
public void study()
{
System.out.println("adv study");
}
public void sleep()
{
System.out.println("zhanzheshui");
}
}
class DoStudent
{
public static void dosome(Student stu)
{
stu.study();
stu.sleep();
}
}
class Demo2
{
public static void main(String[] args)
{
DoStudent.dosome(new AdvStudent());
}
}
复制代码
我定义对象new AdvStudent() 应该是父类型Student,
为什么打印的是子类型的
adv study
zhanzheshui
而不是父类型的
study
tangzheshui
作者:
Gaara
时间:
2013-1-31 21:46
我也是新手,也刚看到这的内容 。。。。 你这问题我没太看懂
但我觉得 你的子类AdvStudent 的方法已经覆盖了父类Student 的方法 而且你建立的也是子类的对象啊 当然打印的是:
adv study
zhanzheshui
如果你想打印:
study
tangzheshui
只要把对象改了就行了啊
DoStudent.dosome(new AdvStudent());//改成:DoStudent.dosome(new Student());
不知道我说的对不对。。。。。
作者:
林其荣
时间:
2013-1-31 22:12
你创建的是子类的对象
因此子类覆盖了父类的方法...所以创建对象调用的时候会直接使用子类的方法
作者:
李阳
时间:
2013-1-31 23:05
DoStudent.dosome(new AdvStudent());你调用了DoStudent类的dosome方法,该方法接受的参数是Student类变量,而这个变量指向的又是Student子类的对象。dosome方法调用的实际上是子类的内容。所以打印的内容是子类的而不是父类。
作者:
铿锵科技
时间:
2013-2-1 00:33
你的子类覆写了父类的2个方法
public void study()
{
System.out.println("adv study");
}
public void sleep()
{
System.out.println("zhanzheshui");
}
当然调用子类的方法了
作者:
王小丑
时间:
2013-2-1 20:39
之类覆盖了父类的方法,就是这么简单
作者:
刘凯
时间:
2013-2-1 20:58
2 3 4 5 楼说的有理
作者:
王昕
时间:
2013-2-1 21:46
本帖最后由 王昕 于 2013-2-1 21:51 编辑
父类类型的引用变量可以指向它的子类类型的对象,这就是多态。你创建的是一个AdvStudent类型的对象,如果让Student类型的引用指向它的话,对象的类型也并没有变。你调用方法的时候,调用的就是AdvStudent这个对象的方法。
但是前提是你的父类Student必须有这个方法,不然的话引用变量调用方法的时候,编译器关心的是这个引用的类型的类里面有没有定义这样的方法,没有的话即使对象AdvStudent的类增加了这个方法,你通过父类类型的引用也是没法调用的。比如你试试删除父类的study(),让你的父类中没有study()这个方法,只有sleep(),study()是子类中新增的方法,就没法调用,虽然对象AdvStudent是会study的。
你可以试试在子类AdvStudent中增加一个父类Student没有的方法,比如eat(),建立一个子类AdvStudent的对象,然后赋值给父类类型的引用,再用父类类型的引用调用这个方法,就会发现没法调用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2